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
@@ -10,10 +10,14 @@ describe Puppet::HTTP::Session do
10
10
  double('good', url: uri, connect: nil)
11
11
  }
12
12
  let(:bad_service) {
13
+ create_bad_service
14
+ }
15
+
16
+ def create_bad_service(failure_message = 'whoops')
13
17
  service = double('bad', url: uri)
14
- allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, 'whoops')
18
+ allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, failure_message)
15
19
  service
16
- }
20
+ end
17
21
 
18
22
  class DummyResolver < Puppet::HTTP::Resolver
19
23
  attr_reader :count
@@ -23,21 +27,19 @@ describe Puppet::HTTP::Session do
23
27
  @count = 0
24
28
  end
25
29
 
26
- def resolve(session, name, ssl_context: nil)
30
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
27
31
  @count += 1
28
- return @service if check_connection?(session, @service, ssl_context: ssl_context)
32
+ return @service if check_connection?(session, @service, ssl_context: ssl_context, error_handler: error_handler)
29
33
  end
30
34
  end
31
35
 
32
36
  context 'when routing' do
33
37
  it 'returns the first resolved service' do
34
- Puppet[:log_level] = :debug
35
38
  resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
36
39
  session = described_class.new(client, resolvers)
37
40
  resolved = session.route_to(:ca)
38
41
 
39
42
  expect(resolved).to eq(good_service)
40
- expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
41
43
  end
42
44
 
43
45
  it 'only resolves once per session' do
@@ -58,6 +60,29 @@ describe Puppet::HTTP::Session do
58
60
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
59
61
  end
60
62
 
63
+ it 'logs all routing failures as errors when there are no more routes' do
64
+ resolvers = [DummyResolver.new(create_bad_service('whoops1')), DummyResolver.new(create_bad_service('whoops2'))]
65
+ session = described_class.new(client, resolvers)
66
+
67
+ expect {
68
+ session.route_to(:ca)
69
+ }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
70
+
71
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: "whoops1"),
72
+ an_object_having_attributes(level: :err, message: "whoops2"))
73
+ end
74
+
75
+ it 'logs routing failures as debug until routing succeeds' do
76
+ Puppet[:log_level] = 'debug'
77
+
78
+ resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
79
+ session = described_class.new(client, resolvers)
80
+ session.route_to(:ca)
81
+
82
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
83
+ expect(@logs).to_not include(an_object_having_attributes(level: :err))
84
+ end
85
+
61
86
  it 'accepts an ssl context to use when connecting' do
62
87
  alt_context = Puppet::SSL::SSLContext.new
63
88
  expect(good_service).to receive(:connect).with(ssl_context: alt_context)
@@ -73,6 +98,37 @@ describe Puppet::HTTP::Session do
73
98
  session.route_to(:westbound)
74
99
  }.to raise_error(ArgumentError, "Unknown service westbound")
75
100
  end
101
+
102
+ it 'routes to the service when given a puppet URL with an explicit host' do
103
+ allow_any_instance_of(Net::HTTP).to receive(:start)
104
+
105
+ session = described_class.new(client, [])
106
+ url = URI("puppet://example.com:8140/:modules/:module/path/to/file")
107
+ service = session.route_to(:fileserver, url: url)
108
+
109
+ expect(service.url.to_s).to eq("https://example.com:8140/puppet/v3")
110
+ end
111
+
112
+ it 'raises a connection error if we cannot connect' do
113
+ allow_any_instance_of(Net::HTTP).to receive(:start).and_raise(Net::OpenTimeout)
114
+
115
+ session = described_class.new(client, [])
116
+ url = URI('puppet://example.com:8140/:modules/:module/path/to/file')
117
+
118
+ expect {
119
+ session.route_to(:fileserver, url: url)
120
+ }.to raise_error(Puppet::HTTP::ConnectionError,
121
+ %r{Request to https://example.com:8140/puppet/v3 timed out connect operation after .* seconds})
122
+ end
123
+
124
+ it 'resolves the route when given a generic puppet:/// URL' do
125
+ resolvers = [DummyResolver.new(good_service)]
126
+ session = described_class.new(client, resolvers)
127
+ url = URI('puppet:///:modules/:module/path/to/file')
128
+ service = session.route_to(:fileserver, url: url)
129
+
130
+ expect(service.url).to eq(good_service.url)
131
+ end
76
132
  end
77
133
 
78
134
  context 'when resolving using multiple resolvers' do
@@ -124,7 +180,6 @@ describe Puppet::HTTP::Session do
124
180
  }.to raise_error(Puppet::Error, "Could not select a functional puppet master from server_list: 'foo.example.com,bar.example.com'")
125
181
  end
126
182
 
127
-
128
183
  it "raises when there are no more routes" do
129
184
  allow_any_instance_of(Net::HTTP).to receive(:start).and_raise(Errno::EHOSTUNREACH)
130
185
  session = client.create_session
@@ -133,5 +188,133 @@ describe Puppet::HTTP::Session do
133
188
  session.route_to(:ca)
134
189
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
135
190
  end
191
+
192
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
193
+ it "resolves #{name} using server_list" do
194
+ Puppet[:server_list] = 'apple.example.com'
195
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
196
+
197
+ session.route_to(name)
198
+
199
+ expect(req).to have_been_requested
200
+ end
201
+ end
202
+
203
+ it 'does not use server_list to resolve the ca service when ca_server is explicitly set' do
204
+ Puppet[:ca_server] = 'banana.example.com'
205
+
206
+ expect(session.route_to(:ca).url.to_s).to eq("https://banana.example.com:8140/puppet-ca/v1")
207
+ end
208
+
209
+ it 'does not use server_list to resolve the report service when the report_server is explicitly set' do
210
+ Puppet[:report_server] = 'cherry.example.com'
211
+
212
+ expect(session.route_to(:report).url.to_s).to eq("https://cherry.example.com:8140/puppet/v3")
213
+ end
214
+
215
+ it 'resolves once for all services in a session' do
216
+ Puppet[:server_list] = 'apple.example.com'
217
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
218
+
219
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
220
+ session.route_to(name)
221
+ end
222
+
223
+ expect(req).to have_been_requested
224
+ end
225
+
226
+ it 'resolves server_list for each new session' do
227
+ Puppet[:server_list] = 'apple.example.com'
228
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
229
+
230
+ client.create_session.route_to(:puppet)
231
+ client.create_session.route_to(:puppet)
232
+
233
+ expect(req).to have_been_requested.twice
234
+ end
235
+ end
236
+
237
+ context 'when retrieving capabilities' do
238
+ let(:session) do
239
+ resolver = DummyResolver.new(good_service)
240
+ described_class.new(client, [resolver])
241
+ end
242
+
243
+ it 'raises for unknown service names' do
244
+ expect {
245
+ session = described_class.new(client, [])
246
+ session.supports?(:westbound, 'a capability')
247
+ }.to raise_error(ArgumentError, "Unknown service westbound")
248
+ end
249
+
250
+ context 'locales' do
251
+ it 'does not support locales if the cached service has not been resolved' do
252
+ session = described_class.new(client, [])
253
+
254
+ expect(session).to_not be_supports(:puppet, 'locales')
255
+ end
256
+
257
+ it "supports locales if the cached service's version is 5.3.4 or greater" do
258
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.3.4'}, uri)
259
+
260
+ session.route_to(:puppet)
261
+ session.process_response(response)
262
+
263
+ expect(session).to be_supports(:puppet, 'locales')
264
+ end
265
+
266
+ it "does not support locales if the cached service's version is 5.3.3" do
267
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.3.3'}, uri)
268
+
269
+ session.route_to(:puppet)
270
+ session.process_response(response)
271
+
272
+ expect(session).to_not be_supports(:puppet, 'locales')
273
+ end
274
+
275
+ it "does not support locales if the cached service's version is missing" do
276
+ response = Puppet::HTTP::Response.new({}, uri)
277
+
278
+ session.route_to(:puppet)
279
+ session.process_response(response)
280
+
281
+ expect(session).to_not be_supports(:puppet, 'locales')
282
+ end
283
+ end
284
+
285
+ context 'json' do
286
+ it 'does not support json if the cached service has not been resolved' do
287
+ session = described_class.new(client, [])
288
+
289
+ expect(session).to_not be_supports(:puppet, 'json')
290
+ end
291
+
292
+ it "supports json if the cached service's version is 5 or greater" do
293
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.5.12'}, uri)
294
+
295
+ session.route_to(:puppet)
296
+ session.process_response(response)
297
+
298
+ expect(session).to be_supports(:puppet, 'json')
299
+ end
300
+
301
+ it "does not support json if the cached service's version is less than 5.0" do
302
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '4.10.1'}, uri)
303
+
304
+ session.route_to(:puppet)
305
+ session.process_response(response)
306
+
307
+ expect(session).to_not be_supports(:puppet, 'json')
308
+ end
309
+
310
+ it "supports json if the cached service's version is missing" do
311
+ response = Puppet::HTTP::Response.new({}, uri)
312
+
313
+ session.route_to(:puppet)
314
+ session.process_response(response)
315
+
316
+ expect(session).to be_supports(:puppet, 'json')
317
+ end
318
+ end
136
319
  end
137
320
  end
@@ -15,22 +15,9 @@ describe Puppet::Resource::Catalog::Compiler do
15
15
  let(:node_name) { "foo" }
16
16
  let(:node) { Puppet::Node.new(node_name)}
17
17
 
18
- before do
19
- allow(Facter).to receive(:to_hash).and_return({})
20
- end
21
-
22
18
  describe "when initializing" do
23
19
  before do
24
- expect(Puppet).to receive(:version).and_return(1)
25
- set_facts({
26
- 'fqdn' => "my.server.com",
27
- 'ipaddress' => "my.ip.address",
28
- 'ipaddress6' => nil
29
- })
30
- end
31
-
32
- it "should gather data about itself" do
33
- Puppet::Resource::Catalog::Compiler.new
20
+ allow(Puppet).to receive(:version).and_return(1)
34
21
  end
35
22
 
36
23
  it "should cache the server metadata and reuse it" do
@@ -47,8 +34,6 @@ describe Puppet::Resource::Catalog::Compiler do
47
34
 
48
35
  describe "when finding catalogs" do
49
36
  before do
50
- allow(Facter).to receive(:value).and_return("whatever")
51
-
52
37
  allow(node).to receive(:merge)
53
38
  allow(Puppet::Node.indirection).to receive(:find).and_return(node)
54
39
  @request = Puppet::Indirector::Request.new(:catalog, :find, node_name, nil, :node => node_name)
@@ -255,10 +240,10 @@ describe Puppet::Resource::Catalog::Compiler do
255
240
 
256
241
  describe "when handling a request with facts" do
257
242
  before do
258
- Puppet::Node::Facts.indirection.terminus_class = :memory
259
243
  allow(Facter).to receive(:value).and_return("something")
260
244
 
261
- @facts = Puppet::Node::Facts.new('hostname', "fact" => "value", "architecture" => "i386")
245
+ facts = Puppet::Node::Facts.new('hostname', "fact" => "value", "architecture" => "i386")
246
+ Puppet::Node::Facts.indirection.save(facts)
262
247
  end
263
248
 
264
249
  def a_legacy_request_that_contains(facts, format = :pson)
@@ -276,6 +261,8 @@ describe Puppet::Resource::Catalog::Compiler do
276
261
  end
277
262
 
278
263
  context "when extracting facts from the request" do
264
+ let(:facts) { Puppet::Node::Facts.new("hostname") }
265
+
279
266
  it "should do nothing if no facts are provided" do
280
267
  request = Puppet::Indirector::Request.new(:catalog, :find, "hostname", nil)
281
268
  request.options[:facts] = nil
@@ -285,21 +272,21 @@ describe Puppet::Resource::Catalog::Compiler do
285
272
 
286
273
  it "should deserialize the facts without changing the timestamp" do
287
274
  time = Time.now
288
- @facts.timestamp = time
289
- request = a_request_that_contains(@facts)
275
+ facts.timestamp = time
276
+ request = a_request_that_contains(facts)
290
277
  facts = compiler.extract_facts_from_request(request)
291
278
  expect(facts.timestamp).to eq(time)
292
279
  end
293
280
 
294
281
  it "accepts PSON facts from older agents" do
295
- request = a_legacy_request_that_contains(@facts)
282
+ request = a_legacy_request_that_contains(facts)
296
283
 
297
284
  facts = compiler.extract_facts_from_request(request)
298
- expect(facts).to eq(@facts)
285
+ expect(facts).to eq(facts)
299
286
  end
300
287
 
301
288
  it "rejects YAML facts" do
302
- request = a_legacy_request_that_contains(@facts, :yaml)
289
+ request = a_legacy_request_that_contains(facts, :yaml)
303
290
 
304
291
  expect {
305
292
  compiler.extract_facts_from_request(request)
@@ -307,7 +294,7 @@ describe Puppet::Resource::Catalog::Compiler do
307
294
  end
308
295
 
309
296
  it "rejects unknown fact formats" do
310
- request = a_request_that_contains(@facts)
297
+ request = a_request_that_contains(facts)
311
298
  request.options[:facts_format] = 'unknown-format'
312
299
 
313
300
  expect {
@@ -317,15 +304,17 @@ describe Puppet::Resource::Catalog::Compiler do
317
304
  end
318
305
 
319
306
  context "when saving facts from the request" do
307
+ let(:facts) { Puppet::Node::Facts.new("hostname") }
308
+
320
309
  it "should save facts if they were issued by the request" do
321
- request = a_request_that_contains(@facts)
310
+ request = a_request_that_contains(facts)
322
311
 
323
312
  options = {
324
313
  :environment => request.environment,
325
314
  :transaction_uuid => request.options[:transaction_uuid],
326
315
  }
327
316
 
328
- expect(Puppet::Node::Facts.indirection).to receive(:save).with(@facts, nil, options)
317
+ expect(Puppet::Node::Facts.indirection).to receive(:save).with(facts, nil, options)
329
318
  compiler.find(request)
330
319
  end
331
320
 
@@ -337,7 +326,7 @@ describe Puppet::Resource::Catalog::Compiler do
337
326
  :transaction_uuid => request.options[:transaction_uuid],
338
327
  }
339
328
 
340
- expect(Puppet::Node::Facts.indirection).not_to receive(:save).with(@facts, nil, options)
329
+ expect(Puppet::Node::Facts.indirection).not_to receive(:save).with(facts, nil, options)
341
330
  compiler.find(request)
342
331
  end
343
332
  end
@@ -345,7 +334,6 @@ describe Puppet::Resource::Catalog::Compiler do
345
334
 
346
335
  describe "when finding nodes" do
347
336
  it "should look node information up via the Node class with the provided key" do
348
- allow(Facter).to receive(:value).and_return("whatever")
349
337
  request = Puppet::Indirector::Request.new(:catalog, :find, node_name, nil)
350
338
  allow(compiler).to receive(:compile)
351
339
 
@@ -471,9 +459,39 @@ describe Puppet::Resource::Catalog::Compiler do
471
459
  end
472
460
  end
473
461
 
462
+ describe "after finding nodes when checking for a PE version" do
463
+ include PuppetSpec::Compiler
464
+
465
+ let(:pe_version_file) { '/opt/puppetlabs/server/pe_version' }
466
+ let(:request) { Puppet::Indirector::Request.new(:catalog, :find, node_name, nil) }
467
+
468
+ before :each do
469
+ Puppet[:code] = 'notify { "PE Version: $pe_serverversion": }'
470
+ end
471
+
472
+ it "should not add 'pe_serverversion' when FOSS" do
473
+ allow(Puppet::Node.indirection).to receive(:find).with(node_name, anything).and_return(node)
474
+ catalog = compiler.find(request)
475
+
476
+ expect(catalog.resource('notify', 'PE Version: 2019.2.0')).to be_nil
477
+ end
478
+
479
+ it "should add 'pe_serverversion' when PE" do
480
+ allow(File).to receive(:readable?).and_call_original
481
+ allow(File).to receive(:readable?).with(pe_version_file).and_return(true)
482
+ allow(File).to receive(:zero?).with(pe_version_file).and_return(false)
483
+ allow(File).to receive(:read).and_call_original
484
+ allow(File).to receive(:read).with(pe_version_file).and_return('2019.2.0')
485
+
486
+ allow(Puppet::Node.indirection).to receive(:find).with(node_name, anything).and_return(node)
487
+ catalog = compiler.find(request)
488
+
489
+ expect(catalog.resource('notify', 'PE Version: 2019.2.0')).to be
490
+ end
491
+ end
492
+
474
493
  describe "when filtering resources" do
475
494
  before :each do
476
- allow(Facter).to receive(:value)
477
495
  @catalog = double('catalog')
478
496
  allow(@catalog).to receive(:respond_to?).with(:filter).and_return(true)
479
497
  end
@@ -3,7 +3,64 @@ require 'spec_helper'
3
3
  require 'puppet/indirector/catalog/rest'
4
4
 
5
5
  describe Puppet::Resource::Catalog::Rest do
6
- it "should be a sublcass of Puppet::Indirector::REST" do
7
- expect(Puppet::Resource::Catalog::Rest.superclass).to equal(Puppet::Indirector::REST)
6
+ let(:certname) { 'ziggy' }
7
+ let(:uri) { %r{/puppet/v3/catalog/ziggy} }
8
+ let(:formatter) { Puppet::Network::FormatHandler.format(:json) }
9
+ let(:catalog) { Puppet::Resource::Catalog.new(certname) }
10
+
11
+ before :each do
12
+ Puppet[:server] = 'compiler.example.com'
13
+ Puppet[:masterport] = 8140
14
+
15
+ described_class.indirection.terminus_class = :rest
16
+ end
17
+
18
+ def catalog_response(catalog)
19
+ { body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime } }
20
+ end
21
+
22
+ it 'finds a catalog' do
23
+ stub_request(:post, uri).to_return(**catalog_response(catalog))
24
+
25
+ expect(described_class.indirection.find(certname)).to be_a(Puppet::Resource::Catalog)
26
+ end
27
+
28
+ it "serializes the environment" do
29
+ stub_request(:post, uri)
30
+ .with(query: hash_including('environment' => 'outerspace'))
31
+ .to_return(**catalog_response(catalog))
32
+
33
+ described_class.indirection.find(certname, environment: Puppet::Node::Environment.remote('outerspace'))
34
+ end
35
+
36
+ it 'constructs a catalog environment_instance' do
37
+ env = Puppet::Node::Environment.remote('outerspace')
38
+ catalog = Puppet::Resource::Catalog.new(certname, env)
39
+
40
+ stub_request(:post, uri).to_return(**catalog_response(catalog))
41
+
42
+ expect(described_class.indirection.find(certname).environment_instance).to eq(env)
43
+ end
44
+
45
+ it 'returns nil if the node does not exist' do
46
+ stub_request(:post, uri).to_return(status: 404, headers: { 'Content-Type' => 'application/json' }, body: "{}")
47
+
48
+ expect(described_class.indirection.find(certname)).to be_nil
49
+ end
50
+
51
+ it 'raises if fail_on_404 is specified' do
52
+ stub_request(:post, uri).to_return(status: 404, headers: { 'Content-Type' => 'application/json' }, body: "{}")
53
+
54
+ expect{
55
+ described_class.indirection.find(certname, fail_on_404: true)
56
+ }.to raise_error(Puppet::Error, %r{Find /puppet/v3/catalog/ziggy resulted in 404 with the message: {}})
57
+ end
58
+
59
+ it 'raises Net::HTTPError on 500' do
60
+ stub_request(:post, uri).to_return(status: 500)
61
+
62
+ expect{
63
+ described_class.indirection.find(certname)
64
+ }.to raise_error(Net::HTTPError, %r{Error 500 on SERVER: })
8
65
  end
9
66
  end