puppet 6.19.1-universal-darwin → 7.0.0-universal-darwin

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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +19 -20
  4. data/README.md +1 -1
  5. data/conf/fileserver.conf +5 -10
  6. data/ext/build_defaults.yaml +1 -1
  7. data/ext/osx/file_mapping.yaml +0 -5
  8. data/ext/project_data.yaml +1 -14
  9. data/ext/redhat/puppet.spec.erb +0 -1
  10. data/ext/windows/service/daemon.rb +6 -5
  11. data/install.rb +21 -17
  12. data/lib/puppet.rb +11 -20
  13. data/lib/puppet/application.rb +172 -98
  14. data/lib/puppet/application/device.rb +100 -104
  15. data/lib/puppet/application/filebucket.rb +15 -11
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +28 -33
  18. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  19. data/lib/puppet/defaults.rb +95 -159
  20. data/lib/puppet/environments.rb +10 -25
  21. data/lib/puppet/face/config.rb +10 -0
  22. data/lib/puppet/face/epp.rb +12 -2
  23. data/lib/puppet/face/facts.rb +66 -6
  24. data/lib/puppet/face/help.rb +1 -1
  25. data/lib/puppet/face/plugin.rb +5 -8
  26. data/lib/puppet/ffi/windows.rb +12 -0
  27. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  28. data/lib/puppet/ffi/windows/constants.rb +404 -0
  29. data/lib/puppet/ffi/windows/functions.rb +628 -0
  30. data/lib/puppet/ffi/windows/structs.rb +338 -0
  31. data/lib/puppet/file_serving/configuration.rb +0 -5
  32. data/lib/puppet/file_serving/configuration/parser.rb +3 -32
  33. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  34. data/lib/puppet/file_serving/mount.rb +1 -2
  35. data/lib/puppet/forge/repository.rb +0 -1
  36. data/lib/puppet/functions/epp.rb +1 -0
  37. data/lib/puppet/functions/inline_epp.rb +1 -0
  38. data/lib/puppet/generate/models/type/type.rb +4 -1
  39. data/lib/puppet/http.rb +22 -13
  40. data/lib/puppet/http/client.rb +164 -114
  41. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  42. data/lib/puppet/http/errors.rb +16 -0
  43. data/lib/puppet/http/external_client.rb +5 -7
  44. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  45. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  46. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  47. data/lib/puppet/http/proxy.rb +137 -0
  48. data/lib/puppet/http/redirector.rb +4 -12
  49. data/lib/puppet/http/resolver.rb +5 -15
  50. data/lib/puppet/http/resolver/server_list.rb +6 -10
  51. data/lib/puppet/http/resolver/settings.rb +4 -7
  52. data/lib/puppet/http/resolver/srv.rb +7 -11
  53. data/lib/puppet/http/response.rb +36 -54
  54. data/lib/puppet/http/response_converter.rb +24 -0
  55. data/lib/puppet/http/response_net_http.rb +42 -0
  56. data/lib/puppet/http/retry_after_handler.rb +4 -13
  57. data/lib/puppet/http/service.rb +12 -26
  58. data/lib/puppet/http/service/ca.rb +11 -22
  59. data/lib/puppet/http/service/compiler.rb +22 -69
  60. data/lib/puppet/http/service/file_server.rb +18 -27
  61. data/lib/puppet/http/service/puppetserver.rb +26 -12
  62. data/lib/puppet/http/service/report.rb +8 -10
  63. data/lib/puppet/http/session.rb +11 -20
  64. data/lib/puppet/{network/http → http}/site.rb +1 -2
  65. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  66. data/lib/puppet/indirector/fact_search.rb +60 -0
  67. data/lib/puppet/indirector/facts/facter.rb +24 -3
  68. data/lib/puppet/indirector/facts/json.rb +27 -0
  69. data/lib/puppet/indirector/facts/rest.rb +3 -22
  70. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  71. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  72. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  73. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  74. data/lib/puppet/indirector/file_server.rb +1 -8
  75. data/lib/puppet/indirector/generic_http.rb +0 -11
  76. data/lib/puppet/indirector/json.rb +5 -1
  77. data/lib/puppet/indirector/node/json.rb +8 -0
  78. data/lib/puppet/indirector/node/rest.rb +2 -4
  79. data/lib/puppet/indirector/report/json.rb +34 -0
  80. data/lib/puppet/indirector/report/rest.rb +3 -8
  81. data/lib/puppet/indirector/request.rb +0 -101
  82. data/lib/puppet/indirector/rest.rb +12 -263
  83. data/lib/puppet/module_tool/applications.rb +0 -1
  84. data/lib/puppet/network/authconfig.rb +2 -96
  85. data/lib/puppet/network/authorization.rb +13 -35
  86. data/lib/puppet/network/formats.rb +2 -1
  87. data/lib/puppet/network/http.rb +3 -3
  88. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  89. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  90. data/lib/puppet/network/http/connection.rb +247 -316
  91. data/lib/puppet/network/http/handler.rb +0 -1
  92. data/lib/puppet/network/http_pool.rb +16 -34
  93. data/lib/puppet/node.rb +1 -30
  94. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  95. data/lib/puppet/pal/pal_impl.rb +73 -18
  96. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  97. data/lib/puppet/parser/compiler.rb +0 -198
  98. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  99. data/lib/puppet/parser/resource.rb +0 -69
  100. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -8
  101. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  102. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  103. data/lib/puppet/pops/issues.rb +0 -5
  104. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  105. data/lib/puppet/pops/model/ast.pp +0 -42
  106. data/lib/puppet/pops/model/ast.rb +0 -290
  107. data/lib/puppet/pops/model/factory.rb +0 -45
  108. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  109. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  110. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  111. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  112. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  113. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  114. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  115. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  116. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  117. data/lib/puppet/pops/types/type_parser.rb +0 -4
  118. data/lib/puppet/pops/types/types.rb +0 -1
  119. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  120. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  121. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  122. data/lib/puppet/provider.rb +0 -13
  123. data/lib/puppet/provider/nameservice.rb +0 -18
  124. data/lib/puppet/provider/package/dpkg.rb +0 -10
  125. data/lib/puppet/provider/package/gem.rb +23 -3
  126. data/lib/puppet/provider/package/pip.rb +0 -1
  127. data/lib/puppet/provider/package/pkg.rb +0 -4
  128. data/lib/puppet/provider/package/portage.rb +1 -1
  129. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  130. data/lib/puppet/provider/service/smf.rb +191 -73
  131. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  132. data/lib/puppet/reference/configuration.rb +2 -0
  133. data/lib/puppet/reference/indirection.rb +1 -1
  134. data/lib/puppet/resource.rb +1 -89
  135. data/lib/puppet/resource/catalog.rb +1 -14
  136. data/lib/puppet/resource/type.rb +3 -119
  137. data/lib/puppet/resource/type_collection.rb +3 -48
  138. data/lib/puppet/runtime.rb +1 -2
  139. data/lib/puppet/settings.rb +45 -33
  140. data/lib/puppet/settings/base_setting.rb +26 -2
  141. data/lib/puppet/settings/integer_setting.rb +17 -0
  142. data/lib/puppet/settings/port_setting.rb +15 -0
  143. data/lib/puppet/settings/priority_setting.rb +5 -4
  144. data/lib/puppet/ssl.rb +10 -6
  145. data/lib/puppet/ssl/base.rb +3 -5
  146. data/lib/puppet/ssl/certificate.rb +0 -6
  147. data/lib/puppet/ssl/certificate_request.rb +1 -12
  148. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  149. data/lib/puppet/ssl/oids.rb +3 -1
  150. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  151. data/lib/puppet/ssl/state_machine.rb +3 -1
  152. data/lib/puppet/ssl/verifier.rb +2 -0
  153. data/lib/puppet/test/test_helper.rb +1 -3
  154. data/lib/puppet/transaction.rb +1 -7
  155. data/lib/puppet/transaction/report.rb +2 -4
  156. data/lib/puppet/type.rb +0 -76
  157. data/lib/puppet/type/file.rb +5 -7
  158. data/lib/puppet/type/file/checksum.rb +1 -1
  159. data/lib/puppet/type/file/source.rb +1 -1
  160. data/lib/puppet/type/filebucket.rb +3 -3
  161. data/lib/puppet/type/package.rb +5 -13
  162. data/lib/puppet/util/execution.rb +0 -11
  163. data/lib/puppet/util/http_proxy.rb +2 -215
  164. data/lib/puppet/util/monkey_patches.rb +0 -46
  165. data/lib/puppet/util/rdoc.rb +0 -7
  166. data/lib/puppet/util/retry_action.rb +1 -1
  167. data/lib/puppet/util/rubygems.rb +5 -1
  168. data/lib/puppet/util/run_mode.rb +9 -1
  169. data/lib/puppet/util/windows.rb +3 -8
  170. data/lib/puppet/util/windows/daemon.rb +360 -0
  171. data/lib/puppet/util/windows/error.rb +1 -0
  172. data/lib/puppet/util/windows/eventlog.rb +4 -9
  173. data/lib/puppet/util/windows/file.rb +8 -242
  174. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  175. data/lib/puppet/util/windows/process.rb +4 -226
  176. data/lib/puppet/util/windows/service.rb +9 -460
  177. data/lib/puppet/util/windows/string.rb +12 -13
  178. data/lib/puppet/util/yaml.rb +0 -22
  179. data/lib/puppet/vendor/require_vendored.rb +0 -1
  180. data/lib/puppet/version.rb +1 -1
  181. data/lib/puppet/x509.rb +5 -1
  182. data/lib/puppet/x509/cert_provider.rb +29 -1
  183. data/locales/puppet.pot +531 -1232
  184. data/man/man5/puppet.conf.5 +37 -97
  185. data/man/man8/puppet-agent.8 +1 -1
  186. data/man/man8/puppet-apply.8 +1 -1
  187. data/man/man8/puppet-catalog.8 +1 -1
  188. data/man/man8/puppet-config.8 +1 -1
  189. data/man/man8/puppet-describe.8 +1 -1
  190. data/man/man8/puppet-device.8 +1 -1
  191. data/man/man8/puppet-doc.8 +1 -1
  192. data/man/man8/puppet-epp.8 +1 -1
  193. data/man/man8/puppet-facts.8 +55 -9
  194. data/man/man8/puppet-filebucket.8 +6 -6
  195. data/man/man8/puppet-generate.8 +1 -1
  196. data/man/man8/puppet-help.8 +1 -1
  197. data/man/man8/puppet-lookup.8 +1 -1
  198. data/man/man8/puppet-module.8 +1 -58
  199. data/man/man8/puppet-node.8 +4 -1
  200. data/man/man8/puppet-parser.8 +1 -1
  201. data/man/man8/puppet-plugin.8 +1 -1
  202. data/man/man8/puppet-report.8 +4 -1
  203. data/man/man8/puppet-resource.8 +1 -1
  204. data/man/man8/puppet-script.8 +1 -1
  205. data/man/man8/puppet-ssl.8 +1 -1
  206. data/man/man8/puppet.8 +2 -2
  207. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  208. data/spec/integration/application/agent_spec.rb +24 -11
  209. data/spec/integration/application/apply_spec.rb +1 -1
  210. data/spec/integration/application/filebucket_spec.rb +16 -16
  211. data/spec/integration/application/help_spec.rb +2 -0
  212. data/spec/integration/application/plugin_spec.rb +23 -1
  213. data/spec/integration/defaults_spec.rb +7 -3
  214. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  215. data/spec/integration/network/http_pool_spec.rb +3 -21
  216. data/spec/integration/parser/catalog_spec.rb +0 -38
  217. data/spec/integration/parser/node_spec.rb +0 -9
  218. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  219. data/spec/integration/type/file_spec.rb +5 -4
  220. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  221. data/spec/integration/util/windows/security_spec.rb +1 -1
  222. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  223. data/spec/lib/puppet_spec/settings.rb +7 -1
  224. data/spec/spec_helper.rb +2 -0
  225. data/spec/unit/agent_spec.rb +0 -2
  226. data/spec/unit/application/config_spec.rb +224 -4
  227. data/spec/unit/application/facts_spec.rb +35 -0
  228. data/spec/unit/application/filebucket_spec.rb +41 -39
  229. data/spec/unit/application/ssl_spec.rb +2 -2
  230. data/spec/unit/certificate_factory_spec.rb +1 -1
  231. data/spec/unit/configurer/downloader_spec.rb +6 -2
  232. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  233. data/spec/unit/configurer_spec.rb +12 -9
  234. data/spec/unit/context/trusted_information_spec.rb +2 -6
  235. data/spec/unit/defaults_spec.rb +77 -28
  236. data/spec/unit/environments_spec.rb +0 -3
  237. data/spec/unit/face/config_spec.rb +27 -32
  238. data/spec/unit/face/facts_spec.rb +4 -0
  239. data/spec/unit/face/plugin_spec.rb +73 -33
  240. data/spec/unit/file_bucket/file_spec.rb +1 -1
  241. data/spec/unit/file_serving/configuration/parser_spec.rb +14 -18
  242. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  243. data/spec/unit/functions/camelcase_spec.rb +1 -1
  244. data/spec/unit/functions/capitalize_spec.rb +1 -1
  245. data/spec/unit/functions/downcase_spec.rb +1 -1
  246. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  247. data/spec/unit/functions/upcase_spec.rb +1 -1
  248. data/spec/unit/http/client_spec.rb +7 -8
  249. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  250. data/spec/unit/http/external_client_spec.rb +4 -4
  251. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  252. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  253. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  254. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  255. data/spec/unit/http/resolver_spec.rb +13 -13
  256. data/spec/unit/http/service/compiler_spec.rb +49 -62
  257. data/spec/unit/http/service/file_server_spec.rb +3 -3
  258. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  259. data/spec/unit/http/service_spec.rb +1 -2
  260. data/spec/unit/http/session_spec.rb +16 -14
  261. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  262. data/spec/unit/indirector/facts/facter_spec.rb +97 -0
  263. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  264. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  265. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  266. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  267. data/spec/unit/indirector/file_server_spec.rb +1 -15
  268. data/spec/unit/indirector/node/json_spec.rb +33 -0
  269. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  270. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  271. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  272. data/spec/unit/indirector/request_spec.rb +0 -264
  273. data/spec/unit/indirector/rest_spec.rb +98 -752
  274. data/spec/unit/network/authconfig_spec.rb +2 -132
  275. data/spec/unit/network/authorization_spec.rb +2 -55
  276. data/spec/unit/network/formats_spec.rb +4 -4
  277. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -97
  278. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  279. data/spec/unit/network/http/api_spec.rb +10 -0
  280. data/spec/unit/network/http/connection_spec.rb +19 -41
  281. data/spec/unit/network/http/handler_spec.rb +0 -6
  282. data/spec/unit/network/http_pool_spec.rb +0 -4
  283. data/spec/unit/node/environment_spec.rb +33 -21
  284. data/spec/unit/node_spec.rb +2 -54
  285. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  286. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  287. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  288. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  289. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  290. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  291. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  292. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  293. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  294. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  295. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  296. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  297. data/spec/unit/pops/visitor_spec.rb +1 -1
  298. data/spec/unit/provider/nameservice_spec.rb +0 -57
  299. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  300. data/spec/unit/provider/package/gem_spec.rb +32 -0
  301. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  302. data/spec/unit/provider/service/smf_spec.rb +401 -165
  303. data/spec/unit/provider/service/windows_spec.rb +0 -1
  304. data/spec/unit/provider_spec.rb +0 -12
  305. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  306. data/spec/unit/resource/type_collection_spec.rb +2 -22
  307. data/spec/unit/resource_spec.rb +0 -56
  308. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  309. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  310. data/spec/unit/settings/port_setting_spec.rb +31 -0
  311. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  312. data/spec/unit/settings_spec.rb +423 -236
  313. data/spec/unit/ssl/base_spec.rb +36 -3
  314. data/spec/unit/ssl/certificate_request_spec.rb +15 -45
  315. data/spec/unit/ssl/certificate_spec.rb +2 -11
  316. data/spec/unit/ssl/ssl_provider_spec.rb +11 -8
  317. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  318. data/spec/unit/ssl/verifier_spec.rb +0 -21
  319. data/spec/unit/transaction/report_spec.rb +0 -2
  320. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  321. data/spec/unit/transaction_spec.rb +45 -79
  322. data/spec/unit/type/file/checksum_spec.rb +6 -6
  323. data/spec/unit/type/file/content_spec.rb +1 -1
  324. data/spec/unit/type/file/ensure_spec.rb +1 -1
  325. data/spec/unit/type/file/mode_spec.rb +1 -1
  326. data/spec/unit/type/file/source_spec.rb +0 -1
  327. data/spec/unit/type/file_spec.rb +12 -6
  328. data/spec/unit/type/package_spec.rb +1 -1
  329. data/spec/unit/type_spec.rb +20 -0
  330. data/spec/unit/util/backups_spec.rb +0 -2
  331. data/spec/unit/util/execution_spec.rb +0 -29
  332. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  333. data/spec/unit/util/rubygems_spec.rb +2 -2
  334. data/spec/unit/util/run_mode_spec.rb +21 -121
  335. data/spec/unit/util/windows/string_spec.rb +1 -3
  336. data/spec/unit/util/yaml_spec.rb +0 -54
  337. data/spec/unit/util_spec.rb +0 -18
  338. metadata +50 -176
  339. data/conf/auth.conf +0 -150
  340. data/lib/puppet/application/cert.rb +0 -76
  341. data/lib/puppet/application/key.rb +0 -4
  342. data/lib/puppet/application/man.rb +0 -4
  343. data/lib/puppet/application/status.rb +0 -4
  344. data/lib/puppet/face/key.rb +0 -16
  345. data/lib/puppet/face/man.rb +0 -145
  346. data/lib/puppet/face/module/build.rb +0 -14
  347. data/lib/puppet/face/module/generate.rb +0 -14
  348. data/lib/puppet/face/module/search.rb +0 -103
  349. data/lib/puppet/face/status.rb +0 -51
  350. data/lib/puppet/indirector/certificate/file.rb +0 -9
  351. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  352. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  353. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  354. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  355. data/lib/puppet/indirector/file_content/http.rb +0 -22
  356. data/lib/puppet/indirector/key/file.rb +0 -46
  357. data/lib/puppet/indirector/key/memory.rb +0 -7
  358. data/lib/puppet/indirector/ssl_file.rb +0 -162
  359. data/lib/puppet/indirector/status.rb +0 -3
  360. data/lib/puppet/indirector/status/local.rb +0 -12
  361. data/lib/puppet/indirector/status/rest.rb +0 -27
  362. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  363. data/lib/puppet/network/auth_config_parser.rb +0 -90
  364. data/lib/puppet/network/authstore.rb +0 -283
  365. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  366. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  367. data/lib/puppet/network/http/base_pool.rb +0 -36
  368. data/lib/puppet/network/http/compression.rb +0 -127
  369. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  370. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  371. data/lib/puppet/network/rest_controller.rb +0 -2
  372. data/lib/puppet/network/rights.rb +0 -210
  373. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  374. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  375. data/lib/puppet/parser/environment_compiler.rb +0 -202
  376. data/lib/puppet/pops/types/enumeration.rb +0 -16
  377. data/lib/puppet/resource/capability_finder.rb +0 -154
  378. data/lib/puppet/rest/errors.rb +0 -15
  379. data/lib/puppet/rest/response.rb +0 -35
  380. data/lib/puppet/rest/route.rb +0 -85
  381. data/lib/puppet/rest/routes.rb +0 -135
  382. data/lib/puppet/ssl/host.rb +0 -505
  383. data/lib/puppet/ssl/key.rb +0 -61
  384. data/lib/puppet/ssl/validator.rb +0 -61
  385. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  386. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  387. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  388. data/lib/puppet/status.rb +0 -40
  389. data/lib/puppet/util/connection.rb +0 -88
  390. data/lib/puppet/util/ssl.rb +0 -83
  391. data/lib/puppet/util/windows/api_types.rb +0 -309
  392. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  393. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  394. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  395. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  396. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  397. data/lib/puppet/vendor/pathspec/README.md +0 -53
  398. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  399. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  400. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  401. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  402. data/man/man8/puppet-key.8 +0 -126
  403. data/man/man8/puppet-man.8 +0 -76
  404. data/man/man8/puppet-status.8 +0 -108
  405. data/spec/integration/application/config_spec.rb +0 -74
  406. data/spec/integration/network/authconfig_spec.rb +0 -256
  407. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  408. data/spec/unit/application/man_spec.rb +0 -52
  409. data/spec/unit/capability_spec.rb +0 -414
  410. data/spec/unit/face/catalog_spec.rb +0 -6
  411. data/spec/unit/face/key_spec.rb +0 -9
  412. data/spec/unit/face/module/search_spec.rb +0 -231
  413. data/spec/unit/face/module_spec.rb +0 -3
  414. data/spec/unit/face/status_spec.rb +0 -9
  415. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  416. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  417. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  418. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  419. data/spec/unit/indirector/key/file_spec.rb +0 -79
  420. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  421. data/spec/unit/indirector/status/local_spec.rb +0 -10
  422. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  423. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  424. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  425. data/spec/unit/network/authstore_spec.rb +0 -422
  426. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  427. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  428. data/spec/unit/network/http/compression_spec.rb +0 -240
  429. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  430. data/spec/unit/network/http_spec.rb +0 -9
  431. data/spec/unit/network/rights_spec.rb +0 -439
  432. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  433. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  434. data/spec/unit/resource/capability_finder_spec.rb +0 -143
  435. data/spec/unit/rest/route_spec.rb +0 -132
  436. data/spec/unit/ssl/host_spec.rb +0 -650
  437. data/spec/unit/ssl/key_spec.rb +0 -173
  438. data/spec/unit/ssl/validator_spec.rb +0 -278
  439. data/spec/unit/status_spec.rb +0 -45
  440. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -1,803 +1,149 @@
1
1
  require 'spec_helper'
2
- require 'puppet/util/json'
3
- require 'puppet/indirector'
4
- require 'puppet/indirector/errors'
5
2
  require 'puppet/indirector/rest'
6
- require 'puppet/util/psych_support'
7
3
 
8
- HTTP_ERROR_CODES = [300, 400, 500]
9
-
10
- # Just one from each category since the code makes no real distinctions
11
- shared_examples_for "a REST terminus method" do |terminus_method|
12
-
13
- describe "when handling the response" do
14
- let(:response) do
15
- mock_response(200, 'OK')
16
- end
17
-
18
- it "falls back to pson for future requests" do
19
- allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return("4.10.1")
20
- terminus.send(terminus_method, request)
21
-
22
- expect(Puppet[:preferred_serialization_format]).to eq("pson")
23
- end
24
-
25
- it "doesn't change the serialization format if the X-Puppet-Version header is missing" do
26
- allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return(nil)
27
-
28
- terminus.send(terminus_method, request)
29
-
30
- expect(Puppet[:preferred_serialization_format]).to eq("json")
31
- end
32
-
33
- it "doesn't change the serialization format if the server major version is 5" do
34
- allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return("5.0.3")
35
-
36
- terminus.send(terminus_method, request)
37
-
38
- expect(Puppet[:preferred_serialization_format]).to eq("json")
39
- end
40
-
41
- it "doesn't change the serialization format if the current format is already pson" do
42
- allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return("4.10.1")
43
- Puppet[:preferred_serialization_format] = "pson"
44
- terminus.send(terminus_method, request)
45
-
46
- expect(Puppet[:preferred_serialization_format]).to eq("pson")
47
- end
48
-
49
- it "logs a deprecation warning" do
50
- terminus.send(terminus_method, request)
51
-
52
- expect(@logs).to include(an_object_having_attributes(level: :warning, message: /Puppet::Indirector::Rest##{terminus_method} is deprecated. Use Puppet::HTTP::Client instead./))
53
- end
54
-
55
- it "omits the warning when deprecations are disabled" do
56
- Puppet[:disable_warnings] = 'deprecations'
57
- terminus.send(terminus_method, request)
58
-
59
- expect(@logs).to eq([])
60
- end
61
- end
62
-
63
- HTTP_ERROR_CODES.each do |code|
64
- describe "when the response code is #{code}" do
65
- let(:message) { 'error messaged!!!' }
66
- let(:body) do
67
- Puppet::Util::Json.dump({
68
- :issue_kind => 'server-error',
69
- :message => message
70
- })
71
- end
72
- let(:response) { mock_response(code, body, 'application/json') }
73
-
74
- describe "when the response is plain text" do
75
- let(:response) { mock_response(code, message) }
76
-
77
- it "raises an http error with the body of the response when plain text" do
78
-
79
- expect {
80
- terminus.send(terminus_method, request)
81
- }.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{message}")
82
- end
83
- end
84
-
85
- it "raises an http error with the body's message field when json" do
86
- expect {
87
- terminus.send(terminus_method, request)
88
- }.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{message}")
89
- end
90
-
91
- it "does not attempt to deserialize the response into a model" do
92
- expect(model).not_to receive(:convert_from)
93
-
94
- expect {
95
- terminus.send(terminus_method, request)
96
- }.to raise_error(Net::HTTPError)
97
- end
98
-
99
- # I'm not sure what this means or if it's used
100
- it "if the body is empty raises an http error with the response header" do
101
- allow(response).to receive(:body).and_return("")
102
- allow(response).to receive(:message).and_return("fhqwhgads")
103
-
104
- expect {
105
- terminus.send(terminus_method, request)
106
- }.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{response.message}")
107
- end
108
-
109
- describe "and the body is compressed" do
110
- it "raises an http error with the decompressed body of the response" do
111
- compressed_body = Zlib::Deflate.deflate(body)
4
+ class Puppet::TestModel
5
+ extend Puppet::Indirector
6
+ indirects :test_model
7
+ end
112
8
 
113
- compressed_response = mock_response(code, compressed_body, 'application/json', 'deflate')
114
- expect(connection).to receive(http_method).and_return(compressed_response)
9
+ # The subclass must not be all caps even though the superclass is
10
+ class Puppet::TestModel::Rest < Puppet::Indirector::REST
11
+ end
115
12
 
116
- expect {
117
- terminus.send(terminus_method, request)
118
- }.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{message}")
119
- end
120
- end
121
- end
122
- end
13
+ class Puppet::FailingTestModel
14
+ extend Puppet::Indirector
15
+ indirects :failing_test_model
123
16
  end
124
17
 
125
- shared_examples_for "a deserializing terminus method" do |terminus_method|
126
- describe "when the response has no content-type" do
127
- let(:response) { mock_response(200, "body", nil, nil) }
128
- it "raises an error" do
129
- expect {
130
- terminus.send(terminus_method, request)
131
- }.to raise_error(RuntimeError, "No content type in http response; cannot parse")
132
- end
133
- end
18
+ # The subclass must not be all caps even though the superclass is
19
+ class Puppet::FailingTestModel::Rest < Puppet::Indirector::REST
20
+ def find(request)
21
+ http = Puppet.runtime[:http]
22
+ response = http.get(URI('http://puppet.example.com:8140/puppet/v3/failing_test_model'))
134
23
 
135
- it "doesn't catch errors in deserialization" do
136
- expect(model).to receive(:convert_from).and_raise(Puppet::Error, "Whoa there")
24
+ if response.code == 404
25
+ return nil unless request.options[:fail_on_404]
137
26
 
138
- expect { terminus.send(terminus_method, request) }.to raise_error(Puppet::Error, "Whoa there")
27
+ _, body = parse_response(response)
28
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(response.url.path, 100), body: body }
29
+ raise Puppet::Error, msg
30
+ else
31
+ raise convert_to_http_error(response)
32
+ end
139
33
  end
140
34
  end
141
35
 
142
36
  describe Puppet::Indirector::REST do
143
- before :all do
144
- class Puppet::TestModel
145
- include Puppet::Util::PsychSupport
146
- extend Puppet::Indirector
147
- indirects :test_model
148
- attr_accessor :name, :data
149
- def initialize(name = "name", data = '')
150
- @name = name
151
- @data = data
152
- end
153
-
154
- def self.convert_from(format, string)
155
- new('', string)
156
- end
157
-
158
- def self.convert_from_multiple(format, string)
159
- string.split(',').collect { |s| convert_from(format, s) }
160
- end
161
-
162
- def to_data_hash
163
- { 'name' => @name, 'data' => @data }
164
- end
165
-
166
- def ==(other)
167
- other.is_a? Puppet::TestModel and other.name == name and other.data == data
168
- end
169
- end
170
-
171
- # The subclass must not be all caps even though the superclass is
172
- class Puppet::TestModel::Rest < Puppet::Indirector::REST
173
- end
174
-
37
+ before :each do
175
38
  Puppet::TestModel.indirection.terminus_class = :rest
176
39
  end
177
40
 
178
- after :all do
179
- Puppet::TestModel.indirection.delete
180
- # Remove the class, unlinking it from the rest of the system.
181
- Puppet.send(:remove_const, :TestModel)
182
- end
183
-
184
- let(:terminus_class) { Puppet::TestModel::Rest }
185
- let(:terminus) { Puppet::TestModel.indirection.terminus(:rest) }
186
- let(:indirection) { Puppet::TestModel.indirection }
187
- let(:model) { Puppet::TestModel }
188
- let(:url_prefix) { "#{Puppet::Network::HTTP::MASTER_URL_PREFIX}/v3"}
189
-
190
- around(:each) do |example|
191
- Puppet.override(:current_environment => Puppet::Node::Environment.create(:production, [])) do
192
- example.run
193
- end
194
- end
195
-
196
- def mock_response(code, body, content_type='text/plain', encoding=nil)
197
- obj = double('http 200 ok', :code => code.to_s, :body => body)
198
- allow(obj).to receive(:[]).with('content-type').and_return(content_type)
199
- allow(obj).to receive(:[]).with('content-encoding').and_return(encoding)
200
- allow(obj).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return(Puppet.version)
201
- obj
202
- end
203
-
204
- def find_request(key, options={})
205
- Puppet::Indirector::Request.new(:test_model, :find, key, nil, options)
206
- end
207
-
208
- def head_request(key, options={})
209
- Puppet::Indirector::Request.new(:test_model, :head, key, nil, options)
210
- end
211
-
212
- def search_request(key, options={})
213
- Puppet::Indirector::Request.new(:test_model, :search, key, nil, options)
214
- end
215
-
216
- def delete_request(key, options={})
217
- Puppet::Indirector::Request.new(:test_model, :destroy, key, nil, options)
218
- end
219
-
220
- def save_request(key, instance, options={})
221
- Puppet::Indirector::Request.new(:test_model, :save, key, instance, options)
222
- end
223
-
224
- it "should have a method for specifying what setting a subclass should use to retrieve its server" do
225
- expect(terminus_class).to respond_to(:use_server_setting)
41
+ it "raises when find is called" do
42
+ expect {
43
+ Puppet::TestModel.indirection.find('foo')
44
+ }.to raise_error(NotImplementedError)
226
45
  end
227
46
 
228
- it "should use any specified setting to pick the server" do
229
- expect(terminus_class).to receive(:server_setting).and_return(:ca_server)
230
- Puppet[:ca_server] = "myserver"
231
- expect(terminus_class.server).to eq("myserver")
232
- end
233
-
234
- it "should default to :server for the server setting" do
235
- expect(terminus_class).to receive(:server_setting).and_return(nil)
236
- Puppet[:server] = "myserver"
237
- expect(terminus_class.server).to eq("myserver")
238
- end
239
-
240
- it "should have a method for specifying what setting a subclass should use to retrieve its port" do
241
- expect(terminus_class).to respond_to(:use_port_setting)
242
- end
243
-
244
- it "should use any specified setting to pick the port" do
245
- expect(terminus_class).to receive(:port_setting).and_return(:ca_port)
246
- Puppet[:ca_port] = "321"
247
- expect(terminus_class.port).to eq(321)
248
- end
249
-
250
- it "should default to :port for the port setting" do
251
- expect(terminus_class).to receive(:port_setting).and_return(nil)
252
- Puppet[:serverport] = "543"
253
- expect(terminus_class.port).to eq(543)
254
- end
255
-
256
- it "should use a failover-selected server if set" do
257
- expect(terminus_class).to receive(:server_setting).and_return(nil)
258
- Puppet.override(:server => "myserver") do
259
- expect(terminus_class.server).to eq("myserver")
260
- end
261
- end
262
-
263
- it "should use a failover-selected port if set" do
264
- expect(terminus_class).to receive(:port_setting).and_return(nil)
265
- Puppet.override(:serverport => 321) do
266
- expect(terminus_class.port).to eq(321)
267
- end
268
- end
269
-
270
- it "should use server_list for server when available" do
271
- expect(terminus_class).to receive(:server_setting).and_return(nil)
272
- Puppet[:server_list] = [["foo", "123"]]
273
- expect(terminus_class.server).to eq("foo")
274
- end
275
-
276
- it "should prefer failover-selected server from server list" do
277
- expect(terminus_class).to receive(:server_setting).and_return(nil)
278
- Puppet[:server_list] = [["foo", "123"],["bar", "321"]]
279
- Puppet.override(:server => "bar") do
280
- expect(terminus_class.server).to eq("bar")
281
- end
282
- end
283
-
284
- it "should use server_list for port when available" do
285
- expect(terminus_class).to receive(:port_setting).and_return(nil)
286
- Puppet[:server_list] = [["foo", "123"]]
287
- expect(terminus_class.port).to eq(123)
288
- end
289
-
290
- it "should prefer failover-selected port from server list" do
291
- expect(terminus_class).to receive(:port_setting).and_return(nil)
292
- Puppet[:server_list] = [["foo", "123"],["bar", "321"]]
293
- Puppet.override(:serverport => "321") do
294
- expect(terminus_class.port).to eq(321)
295
- end
296
- end
297
-
298
- it "should use an explicitly specified more-speciic server when failover is active" do
299
- expect(terminus_class).to receive(:server_setting).and_return(:ca_server)
300
- Puppet[:ca_server] = "myserver"
301
- Puppet.override(:server => "anotherserver") do
302
- expect(terminus_class.server).to eq("myserver")
303
- end
304
- end
305
-
306
- it "should use an explicitly specified more-specific port when failover is active" do
307
- expect(terminus_class).to receive(:port_setting).and_return(:ca_port)
308
- Puppet[:ca_port] = 321
309
- Puppet.override(:serverport => 543) do
310
- expect(terminus_class.port).to eq(321)
311
- end
312
- end
313
-
314
- it "should use a default port when a more-specific server is set" do
315
- expect(terminus_class).to receive(:server_setting).and_return(:ca_server)
316
- expect(terminus_class).to receive(:port_setting).and_return(:ca_port)
317
- Puppet[:ca_server] = "myserver"
318
- Puppet.override(:server => "anotherserver", :port => 666) do
319
- expect(terminus_class.port).to eq(8140)
320
- end
321
- end
322
-
323
- it 'should default to :puppet for the srv_service' do
324
- expect(Puppet::Indirector::REST.srv_service).to eq(:puppet)
325
- end
326
-
327
- it 'excludes yaml from the Accept header' do
328
- expect(model).to receive(:supported_formats).and_return([:json, :pson, :yaml, :binary])
329
-
330
- expect(terminus.headers['Accept']).to eq('application/json, text/pson, application/octet-stream')
331
- end
332
-
333
- it 'excludes b64_zlib_yaml from the Accept header' do
334
- expect(model).to receive(:supported_formats).and_return([:json, :pson, :b64_zlib_yaml])
335
-
336
- expect(terminus.headers['Accept']).to eq('application/json, text/pson')
337
- end
338
-
339
- it 'excludes dot from the Accept header' do
340
- expect(model).to receive(:supported_formats).and_return([:json, :dot])
341
-
342
- expect(terminus.headers['Accept']).to eq('application/json')
343
- end
344
-
345
- describe "when creating an HTTP client" do
346
- it "should use the class's server and port if the indirection request provides neither" do
347
- @request = double('request', :key => "foo", :server => nil, :port => nil)
348
- expect(terminus.class).to receive(:port).and_return(321)
349
- expect(terminus.class).to receive(:server).and_return("myserver")
350
- expect(Puppet::Network::HttpPool).to receive(:connection).with('myserver', 321, anything).and_return("myconn")
351
- expect(terminus.network(@request)).to eq("myconn")
352
- end
353
-
354
- it "should use the server from the indirection request if one is present" do
355
- @request = double('request', :key => "foo", :server => "myserver", :port => nil)
356
- allow(terminus.class).to receive(:port).and_return(321)
357
- expect(Puppet::Network::HttpPool).to receive(:connection).with('myserver', 321, anything).and_return("myconn")
358
- expect(terminus.network(@request)).to eq("myconn")
359
- end
360
-
361
- it "should use the port from the indirection request if one is present" do
362
- @request = double('request', :key => "foo", :server => nil, :port => 321)
363
- allow(terminus.class).to receive(:server).and_return("myserver")
364
- expect(Puppet::Network::HttpPool).to receive(:connection).with('myserver', 321, anything).and_return("myconn")
365
- expect(terminus.network(@request)).to eq("myconn")
366
- end
367
- end
368
-
369
- describe "#find" do
370
- let(:http_method) { :get }
371
- let(:response) { mock_response(200, 'body') }
372
- let(:connection) { double('mock http connection', :get => response, :verify_callback= => nil) }
373
- let(:request) { find_request('foo') }
374
-
375
- before :each do
376
- allow(terminus).to receive(:network).and_return(connection)
377
- end
378
-
379
- it_behaves_like 'a REST terminus method', :find
380
- it_behaves_like 'a deserializing terminus method', :find
381
-
382
- describe "with a long set of parameters" do
383
- it "calls post on the connection with the query params in the body" do
384
- params = {}
385
- 'aa'.upto('zz') do |s|
386
- params[s] = 'foo'
387
- end
388
-
389
- # The request special-cases this parameter, and it
390
- # won't be passed on to the server, so we remove it here
391
- # to avoid a failure.
392
- params.delete('ip')
393
-
394
- params["environment"] = "production"
395
-
396
- request = find_request('whoa', params)
397
-
398
- expect(connection).to receive(:post) do |_,req,_|
399
- expect(req.split("&").flatten).to match_array(params.map {|key,value| "#{key}=#{value}"})
400
-
401
- mock_response(200, 'body')
402
- end
403
-
404
- terminus.find(request)
405
- end
406
- end
407
-
408
- describe "with no parameters" do
409
- it "calls get on the connection" do
410
- request = find_request('foo bar')
411
-
412
- expect(connection).to receive(:get).with("#{url_prefix}/test_model/foo%20bar?environment=production&", anything).and_return(mock_response('200', 'response body'))
413
-
414
- expect(terminus.find(request)).to eq(model.new('foo bar', 'response body'))
415
- end
416
- end
417
-
418
- it "returns nil on 404" do
419
- response = mock_response('404', nil)
420
-
421
- expect(connection).to receive(:get).and_return(response)
422
-
423
- expect(terminus.find(request)).to eq(nil)
424
- end
425
-
426
- it 'raises no warning for a 404 (when not asked to do so)' do
427
- response = mock_response('404', 'this is the notfound you are looking for')
428
- expect(connection).to receive(:get).and_return(response)
429
- expect{terminus.find(request)}.to_not raise_error()
430
- end
431
-
432
- context 'when fail_on_404 is used in request' do
433
- it 'raises an error for a 404 when asked to do so' do
434
- request = find_request('foo', :fail_on_404 => true)
435
- response = mock_response('404', 'this is the notfound you are looking for')
436
- expect(connection).to receive(:get).and_return(response)
437
-
438
- expect do
439
- terminus.find(request)
440
- end.to raise_error(
441
- Puppet::Error,
442
- "Find #{url_prefix}/test_model/foo?environment=production&fail_on_404=true resulted in 404 with the message: this is the notfound you are looking for")
443
- end
444
-
445
- it 'truncates the URI when it is very long' do
446
- request = find_request('foo', :fail_on_404 => true, :long_param => ('A' * 100) + 'B')
447
- response = mock_response('404', 'this is the notfound you are looking for')
448
- expect(connection).to receive(:get).and_return(response)
449
-
450
- expect do
451
- terminus.find(request)
452
- end.to raise_error(
453
- Puppet::Error,
454
- /\/test_model\/foo.*\?environment=production&.*long_param=A+\.\.\..*resulted in 404 with the message/)
455
- end
456
-
457
- it 'does not truncate the URI when logging debug information' do
458
- Puppet.debug = true
459
- request = find_request('foo', :fail_on_404 => true, :long_param => ('A' * 100) + 'B')
460
- response = mock_response('404', 'this is the notfound you are looking for')
461
- expect(connection).to receive(:get).and_return(response)
462
-
463
- expect do
464
- terminus.find(request)
465
- end.to raise_error(
466
- Puppet::Error,
467
- /\/test_model\/foo.*\?environment=production&.*long_param=A+B.*resulted in 404 with the message/)
468
- end
469
- end
470
-
471
- it "asks the model to deserialize the response body and sets the name on the resulting object to the find key" do
472
- expect(connection).to receive(:get).and_return(response)
473
-
474
- expect(model).to receive(:convert_from).with(response['content-type'], response.body).and_return(
475
- model.new('overwritten', 'decoded body')
476
- )
477
-
478
- expect(terminus.find(request)).to eq(model.new('foo', 'decoded body'))
479
- end
480
-
481
- it "doesn't require the model to support name=" do
482
- class Puppet::TestModel2 < Puppet::TestModel
483
- undef_method :name=
484
- end
485
-
486
- expect(connection).to receive(:get).and_return(response)
487
- instance = Puppet::TestModel2.new('name', 'decoded body')
488
-
489
- expect(model).to receive(:convert_from).with(response['content-type'], response.body).and_return(instance)
490
-
491
- expect(terminus.find(request)).to eq(model.new('name', 'decoded body'))
492
- end
493
-
494
- it "provides an Accept header containing the list of supported mime types joined with commas" do
495
- expect(connection).to receive(:get).with(anything, hash_including("Accept" => "application/json, text/pson")).and_return(response)
496
-
497
- expect(terminus.model).to receive(:supported_formats).and_return([:json, :pson])
498
- terminus.find(request)
499
- end
500
-
501
- it "provides a version header with the current puppet version" do
502
- expect(connection).to receive(:get).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
503
-
504
- terminus.find(request)
505
- end
506
-
507
- it "adds an Accept-Encoding header" do
508
- expect(terminus).to receive(:add_accept_encoding).and_return({"accept-encoding" => "gzip"})
509
-
510
- expect(connection).to receive(:get).with(anything, hash_including("accept-encoding" => "gzip")).and_return(response)
511
-
512
- terminus.find(request)
513
- end
514
-
515
- it "uses only the mime-type from the content-type header when asking the model to deserialize" do
516
- response = mock_response('200', 'mydata', "text/plain; charset=utf-8")
517
- expect(connection).to receive(:get).and_return(response)
518
-
519
- expect(model).to receive(:convert_from).with("text/plain", "mydata").and_return("myobject")
520
-
521
- expect(terminus.find(request)).to eq("myobject")
522
- end
523
-
524
- it "decompresses the body before passing it to the model for deserialization" do
525
- uncompressed_body = "Why hello there"
526
- compressed_body = Zlib::Deflate.deflate(uncompressed_body)
527
-
528
- response = mock_response('200', compressed_body, 'text/plain', 'deflate')
529
- expect(connection).to receive(:get).and_return(response)
530
-
531
- expect(model).to receive(:convert_from).with("text/plain", uncompressed_body).and_return("myobject")
532
-
533
- expect(terminus.find(request)).to eq("myobject")
534
- end
47
+ it "raises when head is called" do
48
+ expect {
49
+ Puppet::TestModel.indirection.head('foo')
50
+ }.to raise_error(NotImplementedError)
535
51
  end
536
52
 
537
- describe "#head" do
538
- let(:http_method) { :head }
539
- let(:response) { mock_response(200, nil) }
540
- let(:connection) { double('mock http connection', :head => response, :verify_callback= => nil) }
541
- let(:request) { head_request('foo') }
542
-
543
- before :each do
544
- allow(terminus).to receive(:network).and_return(connection)
545
- end
546
-
547
- it_behaves_like 'a REST terminus method', :head
548
-
549
- it "returns true if there was a successful http response" do
550
- expect(connection).to receive(:head).and_return(mock_response('200', nil))
551
-
552
- expect(terminus.head(request)).to eq(true)
553
- end
554
-
555
- it "returns false on a 404 response" do
556
- expect(connection).to receive(:head).and_return(mock_response('404', nil))
557
-
558
- expect(terminus.head(request)).to eq(false)
559
- end
560
-
561
- it "provides a version header with the current puppet version" do
562
- expect(connection).to receive(:head).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
563
-
564
- terminus.head(request)
565
- end
53
+ it "raises when search is called" do
54
+ expect {
55
+ Puppet::TestModel.indirection.search('foo')
56
+ }.to raise_error(NotImplementedError)
566
57
  end
567
58
 
568
- describe "#search" do
569
- let(:http_method) { :get }
570
- let(:response) { mock_response(200, 'data1,data2,data3') }
571
- let(:connection) { double('mock http connection', :get => response, :verify_callback= => nil) }
572
- let(:request) { search_request('foo') }
573
-
574
- before :each do
575
- allow(terminus).to receive(:network).and_return(connection)
576
- end
577
-
578
- it_behaves_like 'a REST terminus method', :search
579
- it_behaves_like 'a deserializing terminus method', :search
580
-
581
- it "should call the GET http method on a network connection" do
582
- expect(connection).to receive(:get).with("#{url_prefix}/test_models/foo?environment=production&", hash_including('Accept' => anything)).and_return(mock_response(200, 'data3, data4'))
583
-
584
- terminus.search(request)
585
- end
586
-
587
- it "returns an empty list on 404" do
588
- response = mock_response('404', nil)
589
-
590
- expect(connection).to receive(:get).and_return(response)
591
-
592
- expect(terminus.search(request)).to eq([])
593
- end
594
-
595
- it "asks the model to deserialize the response body into multiple instances" do
596
- expect(terminus.search(request)).to eq([model.new('', 'data1'), model.new('', 'data2'), model.new('', 'data3')])
597
- end
598
-
599
- it "should provide an Accept header containing the list of supported formats joined with commas" do
600
- expect(connection).to receive(:get).with(anything, hash_including("Accept" => "application/json, text/pson")).and_return(mock_response(200, ''))
601
-
602
- expect(terminus.model).to receive(:supported_formats).and_return([:json, :pson])
603
- terminus.search(request)
604
- end
605
-
606
- it "provides a version header with the current puppet version" do
607
- expect(connection).to receive(:get).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(mock_response(200, ''))
608
-
609
- terminus.search(request)
610
- end
611
-
612
- it "should return an empty array if serialization returns nil" do
613
- allow(model).to receive(:convert_from_multiple).and_return(nil)
614
-
615
- expect(terminus.search(request)).to eq([])
616
- end
59
+ it "raises when save is called" do
60
+ expect {
61
+ Puppet::TestModel.indirection.save(Puppet::TestModel.new, 'foo')
62
+ }.to raise_error(NotImplementedError)
617
63
  end
618
64
 
619
- describe "#destroy" do
620
- let(:http_method) { :delete }
621
- let(:response) { mock_response(200, 'body') }
622
- let(:connection) { double('mock http connection', :delete => response, :verify_callback= => nil) }
623
- let(:request) { delete_request('foo') }
624
-
625
- before :each do
626
- allow(terminus).to receive(:network).and_return(connection)
627
- end
628
-
629
- it_behaves_like 'a REST terminus method', :destroy
630
- it_behaves_like 'a deserializing terminus method', :destroy
631
-
632
- it "should call the DELETE http method on a network connection" do
633
- expect(connection).to receive(:delete).with("#{url_prefix}/test_model/foo?environment=production&", hash_including('Accept' => anything)).and_return(response)
634
-
635
- terminus.destroy(request)
636
- end
637
-
638
- it "should fail if any options are provided, since DELETE apparently does not support query options" do
639
- request = delete_request('foo', :one => "two", :three => "four")
640
-
641
- expect { terminus.destroy(request) }.to raise_error(ArgumentError)
642
- end
643
-
644
- it "should deserialize and return the http response" do
645
- expect(connection).to receive(:delete).and_return(response)
646
-
647
- expect(terminus.destroy(request)).to eq(model.new('', 'body'))
648
- end
649
-
650
- it "returns nil on 404" do
651
- response = mock_response('404', nil)
652
-
653
- expect(connection).to receive(:delete).and_return(response)
654
-
655
- expect(terminus.destroy(request)).to eq(nil)
656
- end
657
-
658
- it "should provide an Accept header containing the list of supported formats joined with commas" do
659
- expect(connection).to receive(:delete).with(anything, hash_including("Accept" => "application/json, text/pson")).and_return(response)
660
-
661
- expect(terminus.model).to receive(:supported_formats).and_return([:json, :pson])
662
- terminus.destroy(request)
663
- end
664
-
665
- it "provides a version header with the current puppet version" do
666
- expect(connection).to receive(:delete).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
667
-
668
- terminus.destroy(request)
669
- end
65
+ it "raises when destroy is called" do
66
+ expect {
67
+ Puppet::TestModel.indirection.destroy('foo')
68
+ }.to raise_error(NotImplementedError)
670
69
  end
671
70
 
672
- describe "#save" do
673
- let(:http_method) { :put }
674
- let(:response) { mock_response(200, 'body') }
675
- let(:connection) { double('mock http connection', :put => response, :verify_callback= => nil) }
676
- let(:instance) { model.new('the thing', 'some contents') }
677
- let(:request) { save_request(instance.name, instance) }
678
-
71
+ context 'when parsing the response error' do
679
72
  before :each do
680
- allow(terminus).to receive(:network).and_return(connection)
681
- end
682
-
683
- it_behaves_like 'a REST terminus method', :save
684
-
685
- it "should call the PUT http method on a network connection" do
686
- expect(connection).to receive(:put).with("#{url_prefix}/test_model/the%20thing?environment=production&", anything, hash_including("Content-Type")).and_return(response)
687
-
688
- terminus.save(request)
689
- end
690
-
691
- it "should fail if any options are provided, since PUT apparently does not support query options" do
692
- request = save_request(instance.name, instance, :one => "two", :three => "four")
693
-
694
- expect { terminus.save(request) }.to raise_error(ArgumentError)
695
- end
696
-
697
- it "should serialize the instance using the default format and pass the result as the body of the request" do
698
- expect(instance).to receive(:render).and_return("serial_instance")
699
- expect(connection).to receive(:put).with(anything, "serial_instance", anything).and_return(response)
700
-
701
- terminus.save(request)
702
- end
703
-
704
- it "returns nil on 404" do
705
- response = mock_response('404', nil)
706
-
707
- expect(connection).to receive(:put).and_return(response)
708
-
709
- expect(terminus.save(request)).to eq(nil)
710
- end
711
-
712
- it "returns nil" do
713
- expect(connection).to receive(:put).and_return(response)
714
-
715
- expect(terminus.save(request)).to be_nil
716
- end
717
-
718
- it "should provide an Accept header containing the list of supported formats joined with commas" do
719
- expect(connection).to receive(:put).with(anything, anything, hash_including("Accept" => "application/json, text/pson")).and_return(response)
720
-
721
- expect(instance).to receive(:render).and_return('')
722
- expect(model).to receive(:supported_formats).and_return([:json, :pson])
723
- expect(instance).to receive(:mime).and_return("supported")
724
-
725
- terminus.save(request)
73
+ Puppet::FailingTestModel.indirection.terminus_class = :rest
726
74
  end
727
75
 
728
- it "provides a version header with the current puppet version" do
729
- expect(connection).to receive(:put).with(anything, anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
76
+ it 'returns nil if 404 is returned and fail_on_404 is omitted' do
77
+ stub_request(:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model').to_return(status: 404)
730
78
 
731
- terminus.save(request)
79
+ expect(Puppet::FailingTestModel.indirection.find('foo')).to be_nil
732
80
  end
733
81
 
734
- it "should provide a Content-Type header containing the mime-type of the sent object" do
735
- expect(instance).to receive(:mime).and_return("mime")
736
- expect(connection).to receive(:put).with(anything, anything, hash_including('Content-Type' => "mime")).and_return(response)
82
+ it 'raises if 404 is returned and fail_on_404 is true' do
83
+ stub_request(
84
+ :get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model',
85
+ ).to_return(status: 404,
86
+ headers: { 'Content-Type' => 'text/plain' },
87
+ body: 'plaintext')
737
88
 
738
- terminus.save(request)
89
+ expect {
90
+ Puppet::FailingTestModel.indirection.find('foo', fail_on_404: true)
91
+ }.to raise_error(Puppet::Error, 'Find /puppet/v3/failing_test_model resulted in 404 with the message: plaintext')
739
92
  end
740
- end
741
93
 
742
- describe '#handle_response' do
743
- # There are multiple request types to choose from, this may not be the one I want for this situation
744
- let(:response) { mock_response(200, 'body') }
745
- let(:connection) { double('mock http connection', :put => response, :verify_callback= => nil) }
746
- let(:instance) { model.new('the thing', 'some contents') }
747
- let(:request) { save_request(instance.name, instance) }
94
+ it 'returns the HTTP reason if the response body is empty' do
95
+ stub_request(:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model').to_return(status: [500, 'Internal Server Error'])
748
96
 
749
- before :each do
750
- allow(terminus).to receive(:network).and_return(connection)
97
+ expect {
98
+ Puppet::FailingTestModel.indirection.find('foo')
99
+ }.to raise_error(Net::HTTPError, 'Error 500 on SERVER: Internal Server Error')
751
100
  end
752
101
 
753
- it 'adds server_agent_version to the context if not already set' do
754
- expect(Puppet).to receive(:push_context).with(:server_agent_version => Puppet.version)
755
- terminus.handle_response(request, response)
756
- end
102
+ it 'parses the response body as text' do
103
+ stub_request(
104
+ :get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
105
+ ).to_return(status: [500, 'Internal Server Error'],
106
+ headers: { 'Content-Type' => 'text/plain' },
107
+ body: 'plaintext')
757
108
 
758
- it 'does not add server_agent_version to the context if it is already set' do
759
- Puppet.override(:server_agent_version => "5.3.4") do
760
- expect(Puppet).not_to receive(:push_context)
761
- terminus.handle_response(request, response)
762
- end
109
+ expect {
110
+ Puppet::FailingTestModel.indirection.find('foo')
111
+ }.to raise_error(Net::HTTPError, 'Error 500 on SERVER: plaintext')
763
112
  end
764
113
 
765
- it 'downgrades to pson and emits a warning' do
766
- allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return('4.2.8')
767
- Puppet[:preferred_serialization_format] = 'other'
114
+ it 'parses the response body as json and returns the "message"' do
115
+ stub_request(
116
+ :get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
117
+ ).to_return(status: [500, 'Internal Server Error'],
118
+ headers: { 'Content-Type' => 'application/json' },
119
+ body: JSON.dump({'status' => false, 'message' => 'json error'}))
768
120
 
769
- expect(Puppet).to receive(:warning).with('Downgrading to PSON for future requests')
770
-
771
- terminus.handle_response(request, response)
772
-
773
- expect(Puppet[:preferred_serialization_format]).to eq('pson')
121
+ expect {
122
+ Puppet::FailingTestModel.indirection.find('foo')
123
+ }.to raise_error(Net::HTTPError, 'Error 500 on SERVER: json error')
774
124
  end
775
125
 
776
- it 'preserves the set serialization format' do
777
- Puppet[:preferred_serialization_format] = 'other'
778
-
779
- expect(Puppet[:preferred_serialization_format]).to eq('other')
126
+ it 'parses the response body as pson and returns the "message"' do
127
+ stub_request(
128
+ :get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
129
+ ).to_return(status: [500, 'Internal Server Error'],
130
+ headers: { 'Content-Type' => 'application/pson' },
131
+ body: PSON.dump({'status' => false, 'message' => 'pson error'}))
780
132
 
781
- terminus.handle_response(request, response)
133
+ expect {
134
+ Puppet::FailingTestModel.indirection.find('foo')
135
+ }.to raise_error(Net::HTTPError, 'Error 500 on SERVER: pson error')
782
136
  end
783
- end
784
137
 
785
- context 'dealing with SRV settings' do
786
- [
787
- :destroy,
788
- :find,
789
- :head,
790
- :save,
791
- :search
792
- ].each do |method|
793
- it "##{method} passes the SRV service, and fall-back server & port to the request's do_request method" do
794
- request = Puppet::Indirector::Request.new(:indirection, method, 'key', nil)
795
- stub_response = mock_response('200', 'body')
138
+ it 'returns the response body if no content-type given' do
139
+ stub_request(
140
+ :get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
141
+ ).to_return(status: [500, 'Internal Server Error'],
142
+ body: 'unknown text')
796
143
 
797
- expect(request).to receive(:do_request).with(terminus.class.srv_service, terminus.class.server, terminus.class.port).and_return(stub_response)
798
-
799
- terminus.send(method, request)
800
- end
144
+ expect {
145
+ Puppet::FailingTestModel.indirection.find('foo')
146
+ }.to raise_error(Net::HTTPError, 'Error 500 on SERVER: unknown text')
801
147
  end
802
148
  end
803
149
  end