puppet 6.21.1 → 7.4.1

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 (402) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +5 -5
  4. data/README.md +1 -1
  5. data/conf/fileserver.conf +5 -10
  6. data/ext/build_defaults.yaml +1 -2
  7. data/ext/osx/file_mapping.yaml +0 -5
  8. data/ext/project_data.yaml +2 -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 +13 -9
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +27 -29
  18. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  19. data/lib/puppet/defaults.rb +57 -162
  20. data/lib/puppet/environments.rb +8 -23
  21. data/lib/puppet/face/facts.rb +73 -49
  22. data/lib/puppet/face/help.rb +1 -1
  23. data/lib/puppet/face/node/clean.rb +8 -0
  24. data/lib/puppet/face/plugin.rb +5 -8
  25. data/lib/puppet/ffi/windows.rb +12 -0
  26. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  27. data/lib/puppet/ffi/windows/constants.rb +404 -0
  28. data/lib/puppet/ffi/windows/functions.rb +628 -0
  29. data/lib/puppet/ffi/windows/structs.rb +338 -0
  30. data/lib/puppet/file_serving/configuration.rb +0 -5
  31. data/lib/puppet/file_serving/configuration/parser.rb +6 -32
  32. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  33. data/lib/puppet/file_serving/mount.rb +1 -2
  34. data/lib/puppet/forge/repository.rb +0 -1
  35. data/lib/puppet/generate/models/type/type.rb +4 -1
  36. data/lib/puppet/http.rb +22 -13
  37. data/lib/puppet/http/client.rb +164 -114
  38. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  39. data/lib/puppet/http/errors.rb +16 -0
  40. data/lib/puppet/http/external_client.rb +5 -7
  41. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  42. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  43. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  44. data/lib/puppet/http/proxy.rb +137 -0
  45. data/lib/puppet/http/redirector.rb +4 -12
  46. data/lib/puppet/http/resolver.rb +5 -15
  47. data/lib/puppet/http/resolver/server_list.rb +6 -10
  48. data/lib/puppet/http/resolver/settings.rb +4 -7
  49. data/lib/puppet/http/resolver/srv.rb +7 -11
  50. data/lib/puppet/http/response.rb +36 -54
  51. data/lib/puppet/http/response_converter.rb +24 -0
  52. data/lib/puppet/http/response_net_http.rb +42 -0
  53. data/lib/puppet/http/retry_after_handler.rb +4 -13
  54. data/lib/puppet/http/service.rb +12 -26
  55. data/lib/puppet/http/service/ca.rb +11 -22
  56. data/lib/puppet/http/service/compiler.rb +22 -69
  57. data/lib/puppet/http/service/file_server.rb +18 -27
  58. data/lib/puppet/http/service/puppetserver.rb +26 -12
  59. data/lib/puppet/http/service/report.rb +8 -10
  60. data/lib/puppet/http/session.rb +11 -20
  61. data/lib/puppet/{network/http → http}/site.rb +1 -2
  62. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  63. data/lib/puppet/indirector/facts/facter.rb +25 -3
  64. data/lib/puppet/indirector/facts/rest.rb +3 -22
  65. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  66. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  67. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  68. data/lib/puppet/indirector/file_server.rb +1 -8
  69. data/lib/puppet/indirector/generic_http.rb +0 -11
  70. data/lib/puppet/indirector/node/rest.rb +2 -4
  71. data/lib/puppet/indirector/report/rest.rb +3 -8
  72. data/lib/puppet/indirector/request.rb +0 -101
  73. data/lib/puppet/indirector/rest.rb +12 -263
  74. data/lib/puppet/module_tool/applications.rb +0 -1
  75. data/lib/puppet/network/authconfig.rb +2 -96
  76. data/lib/puppet/network/authorization.rb +13 -35
  77. data/lib/puppet/network/formats.rb +67 -0
  78. data/lib/puppet/network/http.rb +3 -3
  79. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  80. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  81. data/lib/puppet/network/http/connection.rb +247 -316
  82. data/lib/puppet/network/http/handler.rb +0 -1
  83. data/lib/puppet/network/http_pool.rb +16 -34
  84. data/lib/puppet/node.rb +1 -30
  85. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  86. data/lib/puppet/pal/pal_impl.rb +3 -1
  87. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  88. data/lib/puppet/parser/compiler.rb +0 -198
  89. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  90. data/lib/puppet/parser/resource.rb +0 -69
  91. data/lib/puppet/pops/evaluator/evaluator_impl.rb +0 -5
  92. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  93. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  94. data/lib/puppet/pops/issues.rb +0 -5
  95. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  96. data/lib/puppet/pops/model/ast.pp +0 -42
  97. data/lib/puppet/pops/model/ast.rb +0 -290
  98. data/lib/puppet/pops/model/factory.rb +0 -45
  99. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  100. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  101. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  102. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  103. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  104. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  105. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  106. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  107. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  108. data/lib/puppet/pops/types/type_parser.rb +0 -4
  109. data/lib/puppet/pops/types/types.rb +0 -1
  110. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  111. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  112. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  113. data/lib/puppet/provider.rb +0 -13
  114. data/lib/puppet/provider/nameservice.rb +0 -18
  115. data/lib/puppet/provider/package/dpkg.rb +0 -10
  116. data/lib/puppet/provider/package/gem.rb +23 -3
  117. data/lib/puppet/provider/package/pip.rb +0 -1
  118. data/lib/puppet/provider/package/pkg.rb +0 -4
  119. data/lib/puppet/provider/package/portage.rb +1 -1
  120. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  121. data/lib/puppet/provider/service/smf.rb +191 -73
  122. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  123. data/lib/puppet/reference/configuration.rb +7 -5
  124. data/lib/puppet/reference/indirection.rb +1 -1
  125. data/lib/puppet/resource.rb +1 -89
  126. data/lib/puppet/resource/catalog.rb +1 -14
  127. data/lib/puppet/resource/type.rb +3 -119
  128. data/lib/puppet/resource/type_collection.rb +3 -48
  129. data/lib/puppet/runtime.rb +1 -2
  130. data/lib/puppet/settings.rb +45 -33
  131. data/lib/puppet/settings/integer_setting.rb +17 -0
  132. data/lib/puppet/settings/port_setting.rb +15 -0
  133. data/lib/puppet/settings/priority_setting.rb +5 -4
  134. data/lib/puppet/ssl.rb +10 -6
  135. data/lib/puppet/ssl/base.rb +3 -5
  136. data/lib/puppet/ssl/certificate.rb +0 -6
  137. data/lib/puppet/ssl/certificate_request.rb +1 -12
  138. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  139. data/lib/puppet/ssl/oids.rb +3 -1
  140. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  141. data/lib/puppet/ssl/state_machine.rb +3 -1
  142. data/lib/puppet/ssl/verifier.rb +2 -0
  143. data/lib/puppet/test/test_helper.rb +1 -3
  144. data/lib/puppet/transaction.rb +1 -7
  145. data/lib/puppet/transaction/report.rb +2 -4
  146. data/lib/puppet/type.rb +0 -76
  147. data/lib/puppet/type/file.rb +5 -7
  148. data/lib/puppet/type/file/checksum.rb +1 -1
  149. data/lib/puppet/type/file/source.rb +1 -1
  150. data/lib/puppet/type/filebucket.rb +3 -3
  151. data/lib/puppet/type/package.rb +5 -13
  152. data/lib/puppet/type/user.rb +1 -1
  153. data/lib/puppet/util/execution.rb +0 -11
  154. data/lib/puppet/util/http_proxy.rb +2 -215
  155. data/lib/puppet/util/monkey_patches.rb +0 -46
  156. data/lib/puppet/util/rdoc.rb +0 -7
  157. data/lib/puppet/util/retry_action.rb +1 -1
  158. data/lib/puppet/util/run_mode.rb +9 -1
  159. data/lib/puppet/util/windows.rb +3 -8
  160. data/lib/puppet/util/windows/daemon.rb +360 -0
  161. data/lib/puppet/util/windows/error.rb +1 -0
  162. data/lib/puppet/util/windows/eventlog.rb +4 -9
  163. data/lib/puppet/util/windows/file.rb +8 -242
  164. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  165. data/lib/puppet/util/windows/process.rb +4 -226
  166. data/lib/puppet/util/windows/service.rb +9 -460
  167. data/lib/puppet/util/windows/string.rb +12 -13
  168. data/lib/puppet/util/yaml.rb +0 -22
  169. data/lib/puppet/vendor/require_vendored.rb +0 -1
  170. data/lib/puppet/version.rb +1 -1
  171. data/lib/puppet/x509.rb +5 -1
  172. data/lib/puppet/x509/cert_provider.rb +29 -1
  173. data/locales/puppet.pot +521 -1226
  174. data/man/man5/puppet.conf.5 +34 -94
  175. data/man/man8/puppet-facts.8 +56 -35
  176. data/man/man8/puppet-filebucket.8 +3 -3
  177. data/man/man8/puppet-module.8 +0 -57
  178. data/man/man8/puppet.8 +1 -1
  179. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  180. data/spec/integration/application/agent_spec.rb +24 -11
  181. data/spec/integration/application/apply_spec.rb +1 -1
  182. data/spec/integration/application/filebucket_spec.rb +16 -16
  183. data/spec/integration/application/help_spec.rb +2 -0
  184. data/spec/integration/application/plugin_spec.rb +23 -1
  185. data/spec/integration/defaults_spec.rb +7 -3
  186. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -2
  187. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -2
  188. data/spec/integration/network/http_pool_spec.rb +3 -21
  189. data/spec/integration/parser/catalog_spec.rb +0 -38
  190. data/spec/integration/parser/node_spec.rb +0 -9
  191. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  192. data/spec/integration/type/file_spec.rb +5 -4
  193. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  194. data/spec/integration/util/windows/security_spec.rb +1 -1
  195. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  196. data/spec/lib/puppet_spec/settings.rb +1 -0
  197. data/spec/spec_helper.rb +2 -0
  198. data/spec/unit/agent_spec.rb +0 -2
  199. data/spec/unit/application/facts_spec.rb +86 -0
  200. data/spec/unit/application/filebucket_spec.rb +41 -39
  201. data/spec/unit/application/ssl_spec.rb +2 -2
  202. data/spec/unit/certificate_factory_spec.rb +1 -1
  203. data/spec/unit/configurer/downloader_spec.rb +6 -2
  204. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  205. data/spec/unit/configurer_spec.rb +12 -9
  206. data/spec/unit/context/trusted_information_spec.rb +2 -6
  207. data/spec/unit/defaults_spec.rb +22 -47
  208. data/spec/unit/environments_spec.rb +0 -3
  209. data/spec/unit/face/facts_spec.rb +4 -0
  210. data/spec/unit/face/node_spec.rb +14 -2
  211. data/spec/unit/face/plugin_spec.rb +73 -33
  212. data/spec/unit/file_bucket/file_spec.rb +1 -1
  213. data/spec/unit/file_serving/configuration/parser_spec.rb +22 -18
  214. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  215. data/spec/unit/functions/camelcase_spec.rb +1 -1
  216. data/spec/unit/functions/capitalize_spec.rb +1 -1
  217. data/spec/unit/functions/downcase_spec.rb +1 -1
  218. data/spec/unit/functions/upcase_spec.rb +1 -1
  219. data/spec/unit/http/client_spec.rb +7 -8
  220. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  221. data/spec/unit/http/external_client_spec.rb +4 -4
  222. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  223. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  224. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  225. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  226. data/spec/unit/http/resolver_spec.rb +13 -13
  227. data/spec/unit/http/service/compiler_spec.rb +0 -62
  228. data/spec/unit/http/service/file_server_spec.rb +3 -3
  229. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  230. data/spec/unit/http/service_spec.rb +0 -1
  231. data/spec/unit/http/session_spec.rb +16 -14
  232. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  233. data/spec/unit/indirector/facts/facter_spec.rb +113 -0
  234. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  235. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  236. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  237. data/spec/unit/indirector/file_server_spec.rb +1 -15
  238. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  239. data/spec/unit/indirector/request_spec.rb +0 -264
  240. data/spec/unit/indirector/rest_spec.rb +98 -752
  241. data/spec/unit/network/authconfig_spec.rb +2 -129
  242. data/spec/unit/network/authorization_spec.rb +2 -55
  243. data/spec/unit/network/formats_spec.rb +45 -4
  244. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -92
  245. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  246. data/spec/unit/network/http/api_spec.rb +10 -0
  247. data/spec/unit/network/http/connection_spec.rb +19 -41
  248. data/spec/unit/network/http/handler_spec.rb +0 -1
  249. data/spec/unit/network/http_pool_spec.rb +0 -4
  250. data/spec/unit/node/environment_spec.rb +33 -21
  251. data/spec/unit/node_spec.rb +2 -54
  252. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  253. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  254. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  255. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  256. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  257. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  258. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  259. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  260. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  261. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  262. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  263. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  264. data/spec/unit/pops/visitor_spec.rb +1 -1
  265. data/spec/unit/provider/nameservice_spec.rb +0 -57
  266. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  267. data/spec/unit/provider/package/gem_spec.rb +32 -0
  268. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  269. data/spec/unit/provider/service/smf_spec.rb +401 -165
  270. data/spec/unit/provider/service/windows_spec.rb +0 -1
  271. data/spec/unit/provider_spec.rb +0 -12
  272. data/spec/unit/resource/type_collection_spec.rb +2 -22
  273. data/spec/unit/resource_spec.rb +0 -56
  274. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  275. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  276. data/spec/unit/settings/port_setting_spec.rb +31 -0
  277. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  278. data/spec/unit/settings_spec.rb +17 -0
  279. data/spec/unit/ssl/base_spec.rb +36 -3
  280. data/spec/unit/ssl/certificate_request_spec.rb +19 -55
  281. data/spec/unit/ssl/certificate_spec.rb +2 -11
  282. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  283. data/spec/unit/ssl/verifier_spec.rb +0 -21
  284. data/spec/unit/transaction/report_spec.rb +0 -2
  285. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  286. data/spec/unit/transaction_spec.rb +45 -79
  287. data/spec/unit/type/file/checksum_spec.rb +6 -6
  288. data/spec/unit/type/file/content_spec.rb +1 -1
  289. data/spec/unit/type/file/ensure_spec.rb +1 -1
  290. data/spec/unit/type/file/mode_spec.rb +1 -1
  291. data/spec/unit/type/file/source_spec.rb +0 -1
  292. data/spec/unit/type/file_spec.rb +12 -6
  293. data/spec/unit/type/package_spec.rb +1 -1
  294. data/spec/unit/type_spec.rb +20 -0
  295. data/spec/unit/util/backups_spec.rb +0 -2
  296. data/spec/unit/util/execution_spec.rb +0 -29
  297. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  298. data/spec/unit/util/run_mode_spec.rb +21 -121
  299. data/spec/unit/util/windows/string_spec.rb +1 -3
  300. data/spec/unit/util/yaml_spec.rb +0 -54
  301. data/spec/unit/util_spec.rb +0 -18
  302. metadata +47 -162
  303. data/conf/auth.conf +0 -150
  304. data/lib/puppet/application/cert.rb +0 -76
  305. data/lib/puppet/application/key.rb +0 -4
  306. data/lib/puppet/application/man.rb +0 -4
  307. data/lib/puppet/application/status.rb +0 -4
  308. data/lib/puppet/face/key.rb +0 -16
  309. data/lib/puppet/face/man.rb +0 -145
  310. data/lib/puppet/face/module/build.rb +0 -14
  311. data/lib/puppet/face/module/generate.rb +0 -14
  312. data/lib/puppet/face/module/search.rb +0 -103
  313. data/lib/puppet/face/status.rb +0 -51
  314. data/lib/puppet/indirector/certificate/file.rb +0 -9
  315. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  316. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  317. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  318. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  319. data/lib/puppet/indirector/file_content/http.rb +0 -22
  320. data/lib/puppet/indirector/key/file.rb +0 -46
  321. data/lib/puppet/indirector/key/memory.rb +0 -7
  322. data/lib/puppet/indirector/ssl_file.rb +0 -162
  323. data/lib/puppet/indirector/status.rb +0 -3
  324. data/lib/puppet/indirector/status/local.rb +0 -12
  325. data/lib/puppet/indirector/status/rest.rb +0 -27
  326. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  327. data/lib/puppet/network/auth_config_parser.rb +0 -90
  328. data/lib/puppet/network/authstore.rb +0 -283
  329. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  330. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  331. data/lib/puppet/network/http/base_pool.rb +0 -36
  332. data/lib/puppet/network/http/compression.rb +0 -127
  333. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  334. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  335. data/lib/puppet/network/rest_controller.rb +0 -2
  336. data/lib/puppet/network/rights.rb +0 -210
  337. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  338. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  339. data/lib/puppet/parser/environment_compiler.rb +0 -202
  340. data/lib/puppet/pops/types/enumeration.rb +0 -16
  341. data/lib/puppet/resource/capability_finder.rb +0 -154
  342. data/lib/puppet/rest/errors.rb +0 -15
  343. data/lib/puppet/rest/response.rb +0 -35
  344. data/lib/puppet/rest/route.rb +0 -85
  345. data/lib/puppet/rest/routes.rb +0 -135
  346. data/lib/puppet/ssl/host.rb +0 -505
  347. data/lib/puppet/ssl/key.rb +0 -61
  348. data/lib/puppet/ssl/validator.rb +0 -61
  349. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  350. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  351. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  352. data/lib/puppet/status.rb +0 -40
  353. data/lib/puppet/util/connection.rb +0 -88
  354. data/lib/puppet/util/fact_dif.rb +0 -62
  355. data/lib/puppet/util/ssl.rb +0 -83
  356. data/lib/puppet/util/windows/api_types.rb +0 -309
  357. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  358. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  359. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  360. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  361. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  362. data/lib/puppet/vendor/pathspec/README.md +0 -53
  363. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  364. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  365. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  366. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  367. data/man/man8/puppet-key.8 +0 -126
  368. data/man/man8/puppet-man.8 +0 -76
  369. data/man/man8/puppet-status.8 +0 -108
  370. data/spec/integration/network/authconfig_spec.rb +0 -256
  371. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  372. data/spec/unit/application/man_spec.rb +0 -52
  373. data/spec/unit/capability_spec.rb +0 -414
  374. data/spec/unit/face/key_spec.rb +0 -9
  375. data/spec/unit/face/module/search_spec.rb +0 -231
  376. data/spec/unit/face/status_spec.rb +0 -9
  377. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  378. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  379. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  380. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  381. data/spec/unit/indirector/key/file_spec.rb +0 -78
  382. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  383. data/spec/unit/indirector/status/local_spec.rb +0 -10
  384. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  385. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  386. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  387. data/spec/unit/network/authstore_spec.rb +0 -422
  388. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  389. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  390. data/spec/unit/network/http/compression_spec.rb +0 -240
  391. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  392. data/spec/unit/network/http_spec.rb +0 -9
  393. data/spec/unit/network/rights_spec.rb +0 -439
  394. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  395. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  396. data/spec/unit/resource/capability_finder_spec.rb +0 -148
  397. data/spec/unit/rest/route_spec.rb +0 -132
  398. data/spec/unit/ssl/host_spec.rb +0 -645
  399. data/spec/unit/ssl/key_spec.rb +0 -173
  400. data/spec/unit/ssl/validator_spec.rb +0 -278
  401. data/spec/unit/status_spec.rb +0 -45
  402. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -18,7 +18,7 @@ describe Puppet::FileBucketFile::File, :uses_checksums => true do
18
18
  describe "when servicing a save request" do
19
19
  it "should return a result whose content is empty" do
20
20
  bucket_file = Puppet::FileBucket::File.new('stuff')
21
- result = Puppet::FileBucket::File.indirection.save(bucket_file, "md5/c13d88cb4cb02003daedb8a84e5d272a")
21
+ result = Puppet::FileBucket::File.indirection.save(bucket_file, "sha256/35bafb1ce99aef3ab068afbaabae8f21fd9b9f02d3a9442e364fa92c0b3eeef0")
22
22
  expect(result.contents).to be_empty
23
23
  end
24
24
 
@@ -34,12 +34,14 @@ describe Puppet::FileBucketFile::File, :uses_checksums => true do
34
34
  end
35
35
  children.each { |child| Process.wait(child) }
36
36
 
37
- paths = File.read("#{Puppet[:bucketdir]}/9/8/b/f/7/d/8/c/98bf7d8c15784f0a3d63204441e1e2aa/paths").lines.to_a
37
+ paths = File.read("#{Puppet[:bucketdir]}/d/1/b/2/a/5/9/f/d1b2a59fbea7e20077af9f91b27e95e865061b270be03ff539ab3b73587882e8/paths").lines.to_a
38
38
  expect(paths.length).to eq(1)
39
39
  expect(Puppet::FileBucket::File.indirection.head("#{bucket_file.checksum_type}/#{bucket_file.checksum_data}/testing")).to be_truthy
40
40
  end
41
41
 
42
42
  it "fails if the contents collide with existing contents" do
43
+ Puppet[:digest_algorithm] = 'md5'
44
+
43
45
  # This is the shortest known MD5 collision (little endian). See https://eprint.iacr.org/2010/643.pdf
44
46
  first_contents = [0x6165300e,0x87a79a55,0xf7c60bd0,0x34febd0b,
45
47
  0x6503cf04,0x854f709e,0xfb0fc034,0x874c9c65,
@@ -66,7 +68,7 @@ describe Puppet::FileBucketFile::File, :uses_checksums => true do
66
68
  context "when the contents file exists but is corrupted and does not match the expected checksum" do
67
69
  let(:original_contents) { "a file that will get corrupted" }
68
70
  let(:bucket_file) { Puppet::FileBucket::File.new(original_contents) }
69
- let(:contents_file) { "#{Puppet[:bucketdir]}/8/e/6/4/f/8/5/d/8e64f85dd54a412f65edabcafe44d491/contents" }
71
+ let(:contents_file) { "#{Puppet[:bucketdir]}/7/7/4/1/0/2/7/9/77410279bb789b799c2f38bf654b46a509dd27ddad6e47a6684805e9ba390bce/contents" }
70
72
 
71
73
  before(:each) do
72
74
  # Ensure we're starting with a clean slate - no pre-existing backup
@@ -57,8 +57,4 @@ describe Puppet::Indirector::FileContent::Rest do
57
57
 
58
58
  described_class.indirection.find("puppet://example.com:8140/:mount/path/to/file")
59
59
  end
60
-
61
- it "should use the :fileserver SRV service" do
62
- expect(Puppet::Indirector::FileContent::Rest.srv_service).to eq(:fileserver)
63
- end
64
60
  end
@@ -113,8 +113,4 @@ describe Puppet::Indirector::FileMetadata::Rest do
113
113
  model.indirection.search("puppet://example.com:8140/:mount/path/to/dir")
114
114
  end
115
115
  end
116
-
117
- it "should use the :fileserver SRV service" do
118
- expect(Puppet::Indirector::FileMetadata::Rest.srv_service).to eq(:fileserver)
119
- end
120
116
  end
@@ -246,7 +246,7 @@ describe Puppet::Indirector::FileServer do
246
246
  end
247
247
 
248
248
  describe "when checking authorization" do
249
- let(:mount) { double('mount', :empty? => nil, :globalallow? => nil) }
249
+ let(:mount) { double('mount') }
250
250
  let(:request) { Puppet::Indirector::Request.new(:myind, :mymethod, uri, :environment => "myenv") }
251
251
 
252
252
  before(:each) do
@@ -282,21 +282,7 @@ describe Puppet::Indirector::FileServer do
282
282
  end
283
283
 
284
284
  it "should return true when no auth directives are defined for the mount point" do
285
- allow(mount).to receive(:empty?).and_return(true)
286
- allow(mount).to receive(:globalallow?).and_return(nil)
287
285
  expect(terminus).to be_authorized(request)
288
286
  end
289
-
290
- it "should return true when a global allow directive is defined for the mount point" do
291
- allow(mount).to receive(:empty?).and_return(false)
292
- allow(mount).to receive(:globalallow?).and_return(true)
293
- expect(terminus).to be_authorized(request)
294
- end
295
-
296
- it "should return false when a non-global allow directive is defined for the mount point" do
297
- allow(mount).to receive(:empty?).and_return(false)
298
- allow(mount).to receive(:globalallow?).and_return(false)
299
- expect(terminus).not_to be_authorized(request)
300
- end
301
287
  end
302
288
  end
@@ -20,21 +20,6 @@ describe Puppet::Transaction::Report::Rest do
20
20
  { body: formatter.render(["store", "http"]), headers: {'Content-Type' => formatter.mime } }
21
21
  end
22
22
 
23
- it "should use the :report_server setting in preference to :server" do
24
- Puppet.settings[:server] = "server"
25
- Puppet.settings[:report_server] = "report_server"
26
- expect(Puppet::Transaction::Report::Rest.server).to eq("report_server")
27
- end
28
-
29
- it "should have a value for report_server and report_port" do
30
- expect(Puppet::Transaction::Report::Rest.server).not_to be_nil
31
- expect(Puppet::Transaction::Report::Rest.port).not_to be_nil
32
- end
33
-
34
- it "should use the :report SRV service" do
35
- expect(Puppet::Transaction::Report::Rest.srv_service).to eq(:report)
36
- end
37
-
38
23
  it "saves a report " do
39
24
  stub_request(:put, uri)
40
25
  .to_return(status: 200, **report_response)
@@ -77,7 +62,7 @@ describe Puppet::Transaction::Report::Rest do
77
62
 
78
63
  stub_request(:put, uri)
79
64
  .to_return(status: 500,
80
- headers: { 'Content-Type' => 'text/pson', Puppet::Network::HTTP::HEADER_PUPPET_VERSION => '4.10.1' })
65
+ headers: { 'Content-Type' => 'text/pson', Puppet::HTTP::HEADER_PUPPET_VERSION => '4.10.1' })
81
66
 
82
67
  expect {
83
68
  described_class.indirection.save(report)
@@ -89,7 +74,7 @@ describe Puppet::Transaction::Report::Rest do
89
74
 
90
75
  stub_request(:put, uri)
91
76
  .to_return(status: 500,
92
- headers: { 'Content-Type' => 'text/pson', Puppet::Network::HTTP::HEADER_PUPPET_VERSION => '4.10.1' })
77
+ headers: { 'Content-Type' => 'text/pson', Puppet::HTTP::HEADER_PUPPET_VERSION => '4.10.1' })
93
78
 
94
79
  expect {
95
80
  described_class.indirection.save(report)
@@ -271,229 +271,6 @@ describe Puppet::Indirector::Request do
271
271
  expect(Puppet::Indirector::Request.new(:myind, :find, "my key", nil, :node => 'foo').to_hash[:node]).to eq('foo')
272
272
  end
273
273
 
274
- describe "when building a query string from its options" do
275
- def a_request_with_options(options)
276
- Puppet::Indirector::Request.new(:myind, :find, "my key", nil, options)
277
- end
278
-
279
- def the_parsed_query_string_from(request)
280
- CGI.parse(request.query_string.sub(/^\?/, ''))
281
- end
282
-
283
- it "should return an empty query string if there are no options" do
284
- request = a_request_with_options(nil)
285
-
286
- expect(request.query_string).to eq("")
287
- end
288
-
289
- it "should return an empty query string if the options are empty" do
290
- request = a_request_with_options({})
291
-
292
- expect(request.query_string).to eq("")
293
- end
294
-
295
- it "should include all options in the query string, separated by '&'" do
296
- request = a_request_with_options(:one => "two", :three => "four")
297
-
298
- expect(the_parsed_query_string_from(request)).to eq({
299
- "one" => ["two"],
300
- "three" => ["four"]
301
- })
302
- end
303
-
304
- it "should ignore nil options" do
305
- request = a_request_with_options(:one => "two", :three => nil)
306
-
307
- expect(the_parsed_query_string_from(request)).to eq({
308
- "one" => ["two"]
309
- })
310
- end
311
-
312
- it "should convert 'true' option values into strings" do
313
- request = a_request_with_options(:one => true)
314
-
315
- expect(the_parsed_query_string_from(request)).to eq({
316
- "one" => ["true"]
317
- })
318
- end
319
-
320
- it "should convert 'false' option values into strings" do
321
- request = a_request_with_options(:one => false)
322
-
323
- expect(the_parsed_query_string_from(request)).to eq({
324
- "one" => ["false"]
325
- })
326
- end
327
-
328
- it "should convert to a string all option values that are integers" do
329
- request = a_request_with_options(:one => 50)
330
-
331
- expect(the_parsed_query_string_from(request)).to eq({
332
- "one" => ["50"]
333
- })
334
- end
335
-
336
- it "should convert to a string all option values that are floating point numbers" do
337
- request = a_request_with_options(:one => 1.2)
338
-
339
- expect(the_parsed_query_string_from(request)).to eq({
340
- "one" => ["1.2"]
341
- })
342
- end
343
-
344
- it "should CGI-escape all option values that are strings" do
345
- request = a_request_with_options(:one => "one two")
346
-
347
- expect(the_parsed_query_string_from(request)).to eq({
348
- "one" => ["one two"]
349
- })
350
- end
351
-
352
- it "should convert an array of values into multiple entries for the same key" do
353
- request = a_request_with_options(:one => %w{one two})
354
-
355
- expect(the_parsed_query_string_from(request)).to eq({
356
- "one" => ["one", "two"]
357
- })
358
- end
359
-
360
- it "should stringify simple data types inside an array" do
361
- request = a_request_with_options(:one => ['one', nil])
362
-
363
- expect(the_parsed_query_string_from(request)).to eq({
364
- "one" => ["one"]
365
- })
366
- end
367
-
368
- it "should error if an array contains another array" do
369
- request = a_request_with_options(:one => ['one', ["not allowed"]])
370
-
371
- expect { request.query_string }.to raise_error(ArgumentError)
372
- end
373
-
374
- it "should error if an array contains illegal data" do
375
- request = a_request_with_options(:one => ['one', { :not => "allowed" }])
376
-
377
- expect { request.query_string }.to raise_error(ArgumentError)
378
- end
379
-
380
- it "should convert to a string and CGI-escape all option values that are symbols" do
381
- request = a_request_with_options(:one => :"sym bol")
382
-
383
- expect(the_parsed_query_string_from(request)).to eq({
384
- "one" => ["sym bol"]
385
- })
386
- end
387
-
388
- it "should fail if options other than booleans or strings are provided" do
389
- request = a_request_with_options(:one => { :one => :two })
390
-
391
- expect { request.query_string }.to raise_error(ArgumentError)
392
- end
393
- end
394
-
395
- context '#do_request' do
396
- before :each do
397
- @request = Puppet::Indirector::Request.new(:myind, :find, "my key", nil)
398
- end
399
-
400
- context 'when not using SRV records' do
401
- before :each do
402
- Puppet.settings[:use_srv_records] = false
403
- end
404
-
405
- it "yields the request with the default server and port when no server or port were specified on the original request" do
406
- count = 0
407
- rval = @request.do_request(:puppet, 'puppet.example.com', '90210') do |got|
408
- count += 1
409
- expect(got.server).to eq('puppet.example.com')
410
- expect(got.port).to eq('90210')
411
- 'Block return value'
412
- end
413
- expect(count).to eq(1)
414
-
415
- expect(rval).to eq('Block return value')
416
- end
417
- end
418
-
419
- context 'when using SRV records' do
420
- before :each do
421
- Puppet.settings[:use_srv_records] = true
422
- Puppet.settings[:srv_domain] = 'example.com'
423
- end
424
-
425
- it "yields the request with the original server and port unmodified" do
426
- @request.server = 'puppet.example.com'
427
- @request.port = '90210'
428
-
429
- count = 0
430
- rval = @request.do_request do |got|
431
- count += 1
432
- expect(got.server).to eq('puppet.example.com')
433
- expect(got.port).to eq('90210')
434
- 'Block return value'
435
- end
436
- expect(count).to eq(1)
437
-
438
- expect(rval).to eq('Block return value')
439
- end
440
-
441
- context "when SRV returns servers" do
442
- before :each do
443
- @dns_mock = double('dns')
444
- expect(Resolv::DNS).to receive(:new).and_return(@dns_mock)
445
-
446
- @port = 7205
447
- @target = 'example.com'
448
- record = Resolv::DNS::Resource::IN::SRV.new(0, 0, @port, @target)
449
- record.instance_variable_set(:@ttl, 10)
450
- @srv_records = [record]
451
-
452
- expect(@dns_mock).to receive(:getresources).
453
- with("_x-puppet._tcp.#{Puppet.settings[:srv_domain]}", Resolv::DNS::Resource::IN::SRV).
454
- and_return(@srv_records)
455
- end
456
-
457
- it "yields a request using the server and port from the SRV record" do
458
- count = 0
459
- rval = @request.do_request do |got|
460
- count += 1
461
- expect(got.server).to eq('example.com')
462
- expect(got.port).to eq(7205)
463
-
464
- @block_return
465
- end
466
- expect(count).to eq(1)
467
-
468
- expect(rval).to eq(@block_return)
469
- end
470
-
471
- it "should fall back to the default server when the block raises a SystemCallError" do
472
- count = 0
473
- second_pass = nil
474
-
475
- rval = @request.do_request(:puppet, 'puppet', 8140) do |got|
476
- count += 1
477
-
478
- if got.server == 'example.com' then
479
- raise SystemCallError, "example failure"
480
- else
481
- second_pass = got
482
- end
483
-
484
- @block_return
485
- end
486
-
487
- expect(second_pass.server).to eq('puppet')
488
- expect(second_pass.port).to eq(8140)
489
- expect(count).to eq(2)
490
-
491
- expect(rval).to eq(@block_return)
492
- end
493
- end
494
- end
495
- end
496
-
497
274
  describe "#remote?" do
498
275
  def request(options = {})
499
276
  Puppet::Indirector::Request.new('node', 'find', 'localhost', nil, options)
@@ -515,45 +292,4 @@ describe Puppet::Indirector::Request do
515
292
  expect(request(:node => 'example.com', :ip => '127.0.0.1')).to be_remote
516
293
  end
517
294
  end
518
-
519
- describe "failover" do
520
- it "should use the provided failover host and port" do
521
- Puppet.override(:server => 'myhost', :serverport => 666) do
522
- req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
523
- req.do_request() do |request|
524
- expect(request.server).to eq('myhost')
525
- expect(request.port).to eq(666)
526
- end
527
- end
528
- end
529
-
530
- it "should not use raw settings when failover fails" do
531
- Puppet.override(:server => nil, :serverport => nil) do
532
- req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
533
- req.do_request() do |request|
534
- expect(request.server).to be_nil
535
- expect(request.port).to be_nil
536
- expect(Puppet.settings[:server]).not_to be_nil
537
- expect(Puppet.settings[:serverport]).not_to be_nil
538
- end
539
- end
540
- end
541
-
542
- it "should use server_list when set and failover has not occured" do
543
- Puppet.settings[:server_list] = [['myhost',666]]
544
- req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
545
- req.do_request() do |request|
546
- expect(request.server).to eq('myhost')
547
- expect(request.port).to eq(666)
548
- end
549
- end
550
-
551
- it "should use server when server_list is not set" do
552
- req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
553
- req.do_request() do |request|
554
- expect(request.server).to eq(Puppet.settings[:server])
555
- expect(request.port).to eq(Puppet.settings[:serverport])
556
- end
557
- end
558
- end
559
295
  end
@@ -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