puppet 6.16.0-x86-mingw32 → 6.20.0-x86-mingw32

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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +6 -2
  4. data/Gemfile.lock +40 -36
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent.rb +2 -2
  8. data/lib/puppet/agent/locker.rb +0 -7
  9. data/lib/puppet/application.rb +10 -6
  10. data/lib/puppet/application/agent.rb +23 -6
  11. data/lib/puppet/application/apply.rb +20 -21
  12. data/lib/puppet/application/device.rb +1 -0
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/filebucket.rb +2 -2
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/script.rb +1 -0
  17. data/lib/puppet/application_support.rb +7 -0
  18. data/lib/puppet/configurer.rb +70 -20
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/confine.rb +2 -2
  21. data/lib/puppet/confine/any.rb +1 -1
  22. data/lib/puppet/defaults.rb +113 -46
  23. data/lib/puppet/environments.rb +84 -59
  24. data/lib/puppet/face/catalog.rb +1 -1
  25. data/lib/puppet/face/config.rb +56 -16
  26. data/lib/puppet/face/epp.rb +12 -2
  27. data/lib/puppet/face/facts.rb +60 -0
  28. data/lib/puppet/face/node.rb +3 -3
  29. data/lib/puppet/face/node/clean.rb +2 -2
  30. data/lib/puppet/face/status.rb +1 -1
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/ffi/posix.rb +10 -0
  33. data/lib/puppet/ffi/posix/constants.rb +14 -0
  34. data/lib/puppet/ffi/posix/functions.rb +24 -0
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +13 -1
  37. data/lib/puppet/file_serving/metadata.rb +4 -1
  38. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  39. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  40. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  41. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  42. data/lib/puppet/file_system/file_impl.rb +4 -4
  43. data/lib/puppet/file_system/uniquefile.rb +8 -16
  44. data/lib/puppet/forge.rb +1 -1
  45. data/lib/puppet/forge/cache.rb +1 -1
  46. data/lib/puppet/forge/repository.rb +3 -7
  47. data/lib/puppet/functions/epp.rb +1 -0
  48. data/lib/puppet/functions/inline_epp.rb +1 -0
  49. data/lib/puppet/functions/lstrip.rb +4 -4
  50. data/lib/puppet/functions/new.rb +8 -3
  51. data/lib/puppet/functions/reverse_each.rb +1 -1
  52. data/lib/puppet/functions/rstrip.rb +4 -4
  53. data/lib/puppet/functions/step.rb +1 -1
  54. data/lib/puppet/functions/strip.rb +4 -4
  55. data/lib/puppet/gettext/config.rb +5 -5
  56. data/lib/puppet/gettext/module_translations.rb +4 -4
  57. data/lib/puppet/http.rb +1 -0
  58. data/lib/puppet/http/client.rb +6 -1
  59. data/lib/puppet/http/redirector.rb +9 -7
  60. data/lib/puppet/http/resolver.rb +5 -8
  61. data/lib/puppet/http/resolver/server_list.rb +18 -36
  62. data/lib/puppet/http/resolver/settings.rb +4 -4
  63. data/lib/puppet/http/resolver/srv.rb +5 -5
  64. data/lib/puppet/http/response.rb +19 -0
  65. data/lib/puppet/http/service.rb +3 -1
  66. data/lib/puppet/http/service/compiler.rb +1 -1
  67. data/lib/puppet/http/service/file_server.rb +1 -1
  68. data/lib/puppet/http/service/puppetserver.rb +39 -0
  69. data/lib/puppet/http/session.rb +5 -4
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/fact_search.rb +60 -0
  74. data/lib/puppet/indirector/facts/facter.rb +3 -3
  75. data/lib/puppet/indirector/facts/json.rb +27 -0
  76. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  77. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  78. data/lib/puppet/indirector/file_metadata/http.rb +25 -5
  79. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/json.rb +5 -1
  83. data/lib/puppet/indirector/msgpack.rb +1 -1
  84. data/lib/puppet/indirector/node/json.rb +8 -0
  85. data/lib/puppet/indirector/report/json.rb +34 -0
  86. data/lib/puppet/indirector/report/processor.rb +2 -2
  87. data/lib/puppet/indirector/request.rb +5 -5
  88. data/lib/puppet/indirector/yaml.rb +1 -1
  89. data/lib/puppet/module.rb +1 -2
  90. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  91. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/formats.rb +2 -1
  94. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  95. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  96. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  97. data/lib/puppet/network/http/connection_adapter.rb +6 -4
  98. data/lib/puppet/network/http/route.rb +2 -2
  99. data/lib/puppet/node/environment.rb +12 -5
  100. data/lib/puppet/node/facts.rb +17 -0
  101. data/lib/puppet/pal/pal_impl.rb +90 -13
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +7 -6
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +1 -1
  106. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  107. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  108. data/lib/puppet/parser/environment_compiler.rb +4 -1
  109. data/lib/puppet/parser/functions.rb +21 -17
  110. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  111. data/lib/puppet/parser/resource.rb +3 -2
  112. data/lib/puppet/parser/resource/param.rb +6 -0
  113. data/lib/puppet/parser/templatewrapper.rb +1 -1
  114. data/lib/puppet/parser/type_loader.rb +2 -2
  115. data/lib/puppet/pops/adaptable.rb +7 -13
  116. data/lib/puppet/pops/adapters.rb +8 -4
  117. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  118. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  119. data/lib/puppet/pops/evaluator/evaluator_impl.rb +27 -8
  120. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  121. data/lib/puppet/pops/issues.rb +5 -0
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  123. data/lib/puppet/pops/loaders.rb +18 -11
  124. data/lib/puppet/pops/lookup/context.rb +1 -1
  125. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  126. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  130. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  131. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  132. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  133. data/lib/puppet/provider/file/windows.rb +1 -1
  134. data/lib/puppet/provider/package/apt.rb +38 -0
  135. data/lib/puppet/provider/package/aptitude.rb +1 -1
  136. data/lib/puppet/provider/package/dpkg.rb +1 -1
  137. data/lib/puppet/provider/package/gem.rb +4 -2
  138. data/lib/puppet/provider/package/pip2.rb +17 -0
  139. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  140. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  141. data/lib/puppet/provider/package/yum.rb +2 -1
  142. data/lib/puppet/provider/package/zypper.rb +3 -0
  143. data/lib/puppet/provider/service/windows.rb +23 -7
  144. data/lib/puppet/provider/user/aix.rb +3 -3
  145. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  146. data/lib/puppet/provider/user/useradd.rb +11 -4
  147. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  148. data/lib/puppet/reference/configuration.rb +6 -5
  149. data/lib/puppet/reports/http.rb +2 -0
  150. data/lib/puppet/resource.rb +2 -1
  151. data/lib/puppet/resource/type.rb +10 -1
  152. data/lib/puppet/rest/route.rb +2 -2
  153. data/lib/puppet/settings.rb +63 -21
  154. data/lib/puppet/settings/alias_setting.rb +37 -0
  155. data/lib/puppet/settings/base_setting.rb +26 -2
  156. data/lib/puppet/ssl/ssl_context.rb +2 -2
  157. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  158. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  159. data/lib/puppet/test/test_helper.rb +18 -13
  160. data/lib/puppet/transaction.rb +2 -2
  161. data/lib/puppet/transaction/persistence.rb +1 -1
  162. data/lib/puppet/transaction/report.rb +12 -8
  163. data/lib/puppet/trusted_external.rb +29 -1
  164. data/lib/puppet/type.rb +15 -7
  165. data/lib/puppet/type/file.rb +40 -15
  166. data/lib/puppet/type/file/checksum.rb +4 -4
  167. data/lib/puppet/type/file/source.rb +32 -12
  168. data/lib/puppet/type/filebucket.rb +1 -1
  169. data/lib/puppet/type/notify.rb +2 -2
  170. data/lib/puppet/type/service.rb +53 -0
  171. data/lib/puppet/type/user.rb +18 -3
  172. data/lib/puppet/util.rb +41 -3
  173. data/lib/puppet/util/autoload.rb +10 -15
  174. data/lib/puppet/util/character_encoding.rb +9 -5
  175. data/lib/puppet/util/checksums.rb +19 -4
  176. data/lib/puppet/util/connection.rb +8 -8
  177. data/lib/puppet/util/execution.rb +2 -2
  178. data/lib/puppet/util/fact_dif.rb +62 -0
  179. data/lib/puppet/util/fileparsing.rb +2 -2
  180. data/lib/puppet/util/posix.rb +54 -5
  181. data/lib/puppet/util/provider_features.rb +1 -1
  182. data/lib/puppet/util/reference.rb +1 -1
  183. data/lib/puppet/util/rubygems.rb +5 -1
  184. data/lib/puppet/util/run_mode.rb +5 -1
  185. data/lib/puppet/util/windows.rb +1 -0
  186. data/lib/puppet/util/windows/api_types.rb +60 -33
  187. data/lib/puppet/util/windows/eventlog.rb +1 -6
  188. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  189. data/lib/puppet/util/windows/principal.rb +8 -6
  190. data/lib/puppet/util/windows/registry.rb +11 -11
  191. data/lib/puppet/util/windows/security.rb +4 -4
  192. data/lib/puppet/util/windows/service.rb +43 -26
  193. data/lib/puppet/util/windows/user.rb +242 -8
  194. data/lib/puppet/version.rb +1 -1
  195. data/locales/puppet.pot +501 -443
  196. data/man/man5/puppet.conf.5 +70 -24
  197. data/man/man8/puppet-agent.8 +8 -5
  198. data/man/man8/puppet-apply.8 +2 -2
  199. data/man/man8/puppet-catalog.8 +1 -1
  200. data/man/man8/puppet-config.8 +6 -6
  201. data/man/man8/puppet-describe.8 +1 -1
  202. data/man/man8/puppet-device.8 +2 -2
  203. data/man/man8/puppet-doc.8 +1 -1
  204. data/man/man8/puppet-epp.8 +1 -1
  205. data/man/man8/puppet-facts.8 +32 -1
  206. data/man/man8/puppet-filebucket.8 +3 -3
  207. data/man/man8/puppet-generate.8 +1 -1
  208. data/man/man8/puppet-help.8 +1 -1
  209. data/man/man8/puppet-key.8 +1 -1
  210. data/man/man8/puppet-lookup.8 +2 -2
  211. data/man/man8/puppet-man.8 +1 -1
  212. data/man/man8/puppet-module.8 +1 -1
  213. data/man/man8/puppet-node.8 +7 -4
  214. data/man/man8/puppet-parser.8 +1 -1
  215. data/man/man8/puppet-plugin.8 +1 -1
  216. data/man/man8/puppet-report.8 +4 -1
  217. data/man/man8/puppet-resource.8 +1 -1
  218. data/man/man8/puppet-script.8 +2 -2
  219. data/man/man8/puppet-ssl.8 +1 -1
  220. data/man/man8/puppet-status.8 +2 -2
  221. data/man/man8/puppet.8 +2 -2
  222. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  223. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  224. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  225. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  226. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  227. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  228. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  229. data/spec/integration/application/agent_spec.rb +263 -54
  230. data/spec/integration/application/apply_spec.rb +168 -149
  231. data/spec/integration/application/doc_spec.rb +16 -6
  232. data/spec/integration/application/filebucket_spec.rb +70 -21
  233. data/spec/integration/application/help_spec.rb +42 -0
  234. data/spec/integration/application/lookup_spec.rb +13 -0
  235. data/spec/integration/application/module_spec.rb +68 -0
  236. data/spec/integration/application/plugin_spec.rb +53 -3
  237. data/spec/integration/configurer_spec.rb +14 -0
  238. data/spec/integration/data_binding_spec.rb +82 -0
  239. data/spec/integration/defaults_spec.rb +20 -3
  240. data/spec/integration/directory_environments_spec.rb +17 -17
  241. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  242. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  243. data/spec/integration/network/http_pool_spec.rb +26 -9
  244. data/spec/integration/node/environment_spec.rb +1 -1
  245. data/spec/integration/parser/compiler_spec.rb +11 -0
  246. data/spec/integration/resource/type_collection_spec.rb +2 -6
  247. data/spec/integration/transaction_spec.rb +4 -9
  248. data/spec/integration/type/file_spec.rb +1 -1
  249. data/spec/integration/util/execution_spec.rb +22 -0
  250. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  251. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  252. data/spec/integration/util/windows/process_spec.rb +26 -32
  253. data/spec/integration/util/windows/registry_spec.rb +7 -17
  254. data/spec/integration/util/windows/user_spec.rb +47 -5
  255. data/spec/integration/util_spec.rb +7 -33
  256. data/spec/lib/puppet_spec/matchers.rb +0 -80
  257. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  258. data/spec/lib/puppet_spec/settings.rb +6 -1
  259. data/spec/shared_contexts/types_setup.rb +2 -0
  260. data/spec/spec_helper.rb +1 -4
  261. data/spec/unit/agent_spec.rb +8 -6
  262. data/spec/unit/application/agent_spec.rb +3 -5
  263. data/spec/unit/application/config_spec.rb +224 -4
  264. data/spec/unit/application/doc_spec.rb +2 -2
  265. data/spec/unit/application/face_base_spec.rb +6 -4
  266. data/spec/unit/application/facts_spec.rb +41 -10
  267. data/spec/unit/application/filebucket_spec.rb +0 -2
  268. data/spec/unit/application/man_spec.rb +52 -0
  269. data/spec/unit/application/resource_spec.rb +3 -1
  270. data/spec/unit/application/ssl_spec.rb +15 -2
  271. data/spec/unit/application_spec.rb +60 -13
  272. data/spec/unit/configurer/downloader_spec.rb +10 -0
  273. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  274. data/spec/unit/configurer_spec.rb +86 -37
  275. data/spec/unit/confine/feature_spec.rb +1 -1
  276. data/spec/unit/confine_spec.rb +10 -3
  277. data/spec/unit/context/trusted_information_spec.rb +10 -4
  278. data/spec/unit/defaults_spec.rb +20 -1
  279. data/spec/unit/environments_spec.rb +176 -32
  280. data/spec/unit/face/config_spec.rb +65 -12
  281. data/spec/unit/face/node_spec.rb +2 -13
  282. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  283. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  284. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  285. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  286. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  287. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  288. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  289. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  290. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  291. data/spec/unit/file_system_spec.rb +1 -2
  292. data/spec/unit/forge/module_release_spec.rb +2 -7
  293. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  294. data/spec/unit/http/client_spec.rb +64 -9
  295. data/spec/unit/http/resolver_spec.rb +24 -5
  296. data/spec/unit/http/response_spec.rb +6 -0
  297. data/spec/unit/http/service/ca_spec.rb +2 -3
  298. data/spec/unit/http/service/compiler_spec.rb +51 -3
  299. data/spec/unit/http/service/file_server_spec.rb +2 -3
  300. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  301. data/spec/unit/http/service/report_spec.rb +2 -3
  302. data/spec/unit/http/service_spec.rb +1 -2
  303. data/spec/unit/http/session_spec.rb +8 -21
  304. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  305. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  306. data/spec/unit/indirector/face_spec.rb +0 -1
  307. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  308. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  309. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  310. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  311. data/spec/unit/indirector/file_metadata/http_spec.rb +27 -0
  312. data/spec/unit/indirector/indirection_spec.rb +8 -12
  313. data/spec/unit/indirector/json_spec.rb +8 -8
  314. data/spec/unit/indirector/key/file_spec.rb +0 -1
  315. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  316. data/spec/unit/indirector/node/json_spec.rb +33 -0
  317. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  318. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  319. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  320. data/spec/unit/indirector/request_spec.rb +5 -5
  321. data/spec/unit/indirector/rest_spec.rb +1 -1
  322. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  323. data/spec/unit/indirector/yaml_spec.rb +7 -7
  324. data/spec/unit/indirector_spec.rb +2 -2
  325. data/spec/unit/interface_spec.rb +3 -3
  326. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  327. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  328. data/spec/unit/network/authconfig_spec.rb +0 -3
  329. data/spec/unit/network/format_support_spec.rb +3 -2
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -10
  331. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  332. data/spec/unit/network/http/connection_spec.rb +42 -32
  333. data/spec/unit/network/http/handler_spec.rb +0 -5
  334. data/spec/unit/node/environment_spec.rb +18 -1
  335. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  336. data/spec/unit/parser/compiler_spec.rb +3 -19
  337. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  338. data/spec/unit/parser/resource_spec.rb +14 -8
  339. data/spec/unit/parser/scope_spec.rb +1 -1
  340. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  341. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  342. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  344. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  345. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  346. data/spec/unit/property_spec.rb +1 -0
  347. data/spec/unit/provider/exec_spec.rb +4 -3
  348. data/spec/unit/provider/nameservice_spec.rb +66 -65
  349. data/spec/unit/provider/package/apt_spec.rb +76 -3
  350. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  351. data/spec/unit/provider/package/base_spec.rb +6 -5
  352. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  353. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  354. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  355. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  356. data/spec/unit/provider/package/pip_spec.rb +6 -11
  357. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  358. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  359. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  360. data/spec/unit/provider/package/yum_spec.rb +31 -0
  361. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  362. data/spec/unit/provider/service/base_spec.rb +2 -4
  363. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  364. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  365. data/spec/unit/provider/service/debian_spec.rb +3 -5
  366. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  367. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  368. data/spec/unit/provider/service/init_spec.rb +45 -5
  369. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  370. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  371. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  372. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  373. data/spec/unit/provider/service/runit_spec.rb +2 -1
  374. data/spec/unit/provider/service/smf_spec.rb +1 -1
  375. data/spec/unit/provider/service/src_spec.rb +3 -5
  376. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  377. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  378. data/spec/unit/provider/service/windows_spec.rb +50 -14
  379. data/spec/unit/provider/user/aix_spec.rb +5 -0
  380. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  381. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  382. data/spec/unit/provider/user/pw_spec.rb +2 -0
  383. data/spec/unit/provider/user/useradd_spec.rb +23 -16
  384. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  385. data/spec/unit/provider_spec.rb +8 -10
  386. data/spec/unit/puppet_pal_2pec.rb +40 -0
  387. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  388. data/spec/unit/reports/store_spec.rb +17 -13
  389. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  390. data/spec/unit/resource/type_spec.rb +1 -1
  391. data/spec/unit/resource_spec.rb +14 -13
  392. data/spec/unit/rest/route_spec.rb +4 -4
  393. data/spec/unit/settings_spec.rb +576 -239
  394. data/spec/unit/ssl/base_spec.rb +0 -1
  395. data/spec/unit/ssl/host_spec.rb +0 -5
  396. data/spec/unit/ssl/ssl_provider_spec.rb +82 -50
  397. data/spec/unit/test/test_helper_spec.rb +17 -0
  398. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  399. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  400. data/spec/unit/transaction/persistence_spec.rb +15 -0
  401. data/spec/unit/transaction/report_spec.rb +3 -1
  402. data/spec/unit/transaction_spec.rb +13 -4
  403. data/spec/unit/type/file/content_spec.rb +0 -1
  404. data/spec/unit/type/file/selinux_spec.rb +0 -2
  405. data/spec/unit/type/file/source_spec.rb +4 -4
  406. data/spec/unit/type/file_spec.rb +122 -102
  407. data/spec/unit/type/filebucket_spec.rb +1 -1
  408. data/spec/unit/type/group_spec.rb +13 -6
  409. data/spec/unit/type/resources_spec.rb +7 -7
  410. data/spec/unit/type/service_spec.rb +210 -1
  411. data/spec/unit/type/tidy_spec.rb +0 -1
  412. data/spec/unit/type/user_spec.rb +31 -2
  413. data/spec/unit/type_spec.rb +52 -2
  414. data/spec/unit/util/at_fork_spec.rb +2 -2
  415. data/spec/unit/util/autoload_spec.rb +5 -1
  416. data/spec/unit/util/backups_spec.rb +1 -2
  417. data/spec/unit/util/character_encoding_spec.rb +4 -4
  418. data/spec/unit/util/checksums_spec.rb +16 -0
  419. data/spec/unit/util/command_line_spec.rb +11 -6
  420. data/spec/unit/util/execution_spec.rb +15 -11
  421. data/spec/unit/util/inifile_spec.rb +6 -14
  422. data/spec/unit/util/log_spec.rb +8 -7
  423. data/spec/unit/util/logging_spec.rb +3 -3
  424. data/spec/unit/util/posix_spec.rb +363 -15
  425. data/spec/unit/util/rubygems_spec.rb +2 -2
  426. data/spec/unit/util/run_mode_spec.rb +6 -6
  427. data/spec/unit/util/selinux_spec.rb +76 -52
  428. data/spec/unit/util/storage_spec.rb +3 -1
  429. data/spec/unit/util/suidmanager_spec.rb +44 -41
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util_spec.rb +16 -9
  433. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  434. metadata +52 -53
  435. data/spec/integration/faces/config_spec.rb +0 -91
  436. data/spec/integration/faces/documentation_spec.rb +0 -57
  437. data/spec/integration/file_bucket/file_spec.rb +0 -50
  438. data/spec/integration/file_serving/content_spec.rb +0 -7
  439. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  440. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  441. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  442. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  443. data/spec/integration/module_tool/forge_spec.rb +0 -51
  444. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  445. data/spec/integration/provider/service/init_spec.rb +0 -48
  446. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  447. data/spec/integration/provider/service/windows_spec.rb +0 -50
  448. data/spec/integration/reference/providers_spec.rb +0 -21
  449. data/spec/integration/reports_spec.rb +0 -13
  450. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  451. data/spec/integration/ssl/host_spec.rb +0 -72
  452. data/spec/integration/ssl/key_spec.rb +0 -99
  453. data/spec/integration/test/test_helper_spec.rb +0 -31
  454. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  455. data/spec/unit/face/catalog_spec.rb +0 -6
  456. data/spec/unit/face/man_spec.rb +0 -25
  457. data/spec/unit/face/module_spec.rb +0 -3
  458. data/spec/unit/man_spec.rb +0 -31
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Resolver do
@@ -44,9 +43,25 @@ describe Puppet::HTTP::Resolver do
44
43
  expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
45
44
  end
46
45
 
47
- it 'logs unsuccessful HTTP 500 responses' do
48
- Puppet[:log_level] = "debug"
46
+ it 'includes extra http headers' do
47
+ Puppet[:http_extra_headers] = 'region:us-west'
48
+
49
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master")
50
+ .with(headers: {'Region' => 'us-west'})
51
+
52
+ subject.resolve(session, :ca)
53
+ end
54
+
55
+ it 'uses the provided ssl context during resolution' do
56
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 200)
57
+
58
+ other_ctx = Puppet::SSL::SSLContext.new
59
+ expect(client).to receive(:connect).with(URI("https://ca.example.com:8141/status/v1/simple/master"), options: {ssl_context: other_ctx}).and_call_original
60
+
61
+ subject.resolve(session, :ca, ssl_context: other_ctx)
62
+ end
49
63
 
64
+ it 'logs unsuccessful HTTP 500 responses' do
50
65
  stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: [500, 'Internal Server Error'])
51
66
  stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
52
67
 
@@ -55,11 +70,15 @@ describe Puppet::HTTP::Resolver do
55
70
  expect(@logs.map(&:message)).to include(/Puppet server ca.example.com:8141 is unavailable: 500 Internal Server Error/)
56
71
  end
57
72
 
58
- it 'fails if no servers in server_list are accessible' do
73
+ it 'cancels resolution if no servers in server_list are accessible' do
59
74
  stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
60
75
  stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 503)
61
76
 
62
- expect { subject.resolve(session, :ca) }.to raise_error(Puppet::Error, /^Could not select a functional puppet master from server_list:/)
77
+ canceled = false
78
+ canceled_handler = lambda { |cancel| canceled = cancel }
79
+
80
+ expect(subject.resolve(session, :ca, canceled_handler: canceled_handler)).to eq(nil)
81
+ expect(canceled).to eq(true)
63
82
  end
64
83
 
65
84
  it 'cycles through server_list until a valid server is found' do
@@ -66,4 +66,10 @@ describe Puppet::HTTP::Response do
66
66
 
67
67
  expect(client.get(uri)['Content-Encoding']).to eq('gzip')
68
68
  end
69
+
70
+ it "enumerates headers" do
71
+ stub_request(:get, uri).to_return(status: 200, headers: { 'Content-Encoding' => 'gzip' })
72
+
73
+ expect(client.get(uri).each_header.to_a).to eq([['content-encoding', 'gzip']])
74
+ end
69
75
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Service::Ca do
@@ -39,11 +38,11 @@ describe Puppet::HTTP::Service::Ca do
39
38
  subject.get_certificate('ca')
40
39
  end
41
40
 
42
- it 'fallbacks to server and masterport' do
41
+ it 'fallbacks to server and serverport' do
43
42
  Puppet[:ca_server] = nil
44
43
  Puppet[:ca_port] = nil
45
44
  Puppet[:server] = 'ca2.example.com'
46
- Puppet[:masterport] = 8142
45
+ Puppet[:serverport] = 8142
47
46
 
48
47
  stub_request(:get, "https://ca2.example.com:8142/puppet-ca/v1/certificate/ca").to_return(body: pem)
49
48
 
@@ -1,6 +1,5 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
- require 'webmock/rspec'
4
3
  require 'puppet/http'
5
4
 
6
5
  describe Puppet::HTTP::Service::Compiler do
@@ -17,7 +16,7 @@ describe Puppet::HTTP::Service::Compiler do
17
16
 
18
17
  before :each do
19
18
  Puppet[:server] = 'compiler.example.com'
20
- Puppet[:masterport] = 8140
19
+ Puppet[:serverport] = 8140
21
20
 
22
21
  Puppet::Node::Facts.indirection.terminus_class = :memory
23
22
  end
@@ -38,7 +37,7 @@ describe Puppet::HTTP::Service::Compiler do
38
37
  context 'when routing to the compiler service' do
39
38
  it 'defaults the server and port based on settings' do
40
39
  Puppet[:server] = 'compiler2.example.com'
41
- Puppet[:masterport] = 8141
40
+ Puppet[:serverport] = 8141
42
41
 
43
42
  stub_request(:post, "https://compiler2.example.com:8141/puppet/v3/catalog/ziggy?environment=testing")
44
43
  .to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
@@ -132,6 +131,26 @@ describe Puppet::HTTP::Service::Compiler do
132
131
  subject.post_catalog(certname, environment: 'production', facts: facts, checksum_type: %w[sha256 sha384])
133
132
  end
134
133
 
134
+ it 'does not accept msgpack by default' do
135
+ stub_request(:post, uri)
136
+ .with(headers: {'Accept' => 'application/vnd.puppet.rich+json, application/json, text/pson'})
137
+ .to_return(**catalog_response)
138
+
139
+ allow(Puppet.features).to receive(:msgpack?).and_return(false)
140
+
141
+ subject.post_catalog(certname, environment: environment, facts: facts)
142
+ end
143
+
144
+ it 'accepts msgpack & rich_json_msgpack if the gem is present' do
145
+ stub_request(:post, uri)
146
+ .with(headers: {'Accept' => 'application/vnd.puppet.rich+json, application/json, application/vnd.puppet.rich+msgpack, application/x-msgpack, text/pson'})
147
+ .to_return(**catalog_response)
148
+
149
+ allow(Puppet.features).to receive(:msgpack?).and_return(true)
150
+
151
+ subject.post_catalog(certname, environment: environment, facts: facts)
152
+ end
153
+
135
154
  it 'returns a deserialized catalog' do
136
155
  stub_request(:post, uri)
137
156
  .to_return(**catalog_response)
@@ -141,6 +160,35 @@ describe Puppet::HTTP::Service::Compiler do
141
160
  expect(cat.name).to eq(certname)
142
161
  end
143
162
 
163
+ it 'deserializes the catalog from msgpack', if: Puppet.features.msgpack? do
164
+ body = catalog.to_msgpack
165
+ formatter = Puppet::Network::FormatHandler.format(:msgpack)
166
+ catalog_response = { body: body, headers: {'Content-Type' => formatter.mime }}
167
+
168
+ stub_request(:post, uri)
169
+ .to_return(**catalog_response)
170
+
171
+ _, cat = subject.post_catalog(certname, environment: 'production', facts: facts)
172
+ expect(cat).to be_a(Puppet::Resource::Catalog)
173
+ expect(cat.name).to eq(certname)
174
+ end
175
+
176
+ it 'deserializes the catalog from rich msgpack', if: Puppet.features.msgpack? do
177
+ body = Puppet.override(rich_data: true) do
178
+ catalog.to_msgpack
179
+ end
180
+
181
+ formatter = Puppet::Network::FormatHandler.format(:rich_data_msgpack)
182
+ catalog_response = { body: body, headers: {'Content-Type' => formatter.mime }}
183
+
184
+ stub_request(:post, uri)
185
+ .to_return(**catalog_response)
186
+
187
+ _, cat = subject.post_catalog(certname, environment: 'production', facts: facts)
188
+ expect(cat).to be_a(Puppet::Resource::Catalog)
189
+ expect(cat.name).to eq(certname)
190
+ end
191
+
144
192
  it 'returns the request response' do
145
193
  stub_request(:post, uri)
146
194
  .to_return(**catalog_response)
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Service::FileServer do
@@ -13,7 +12,7 @@ describe Puppet::HTTP::Service::FileServer do
13
12
 
14
13
  before :each do
15
14
  Puppet[:server] = 'www.example.com'
16
- Puppet[:masterport] = 443
15
+ Puppet[:serverport] = 443
17
16
  end
18
17
 
19
18
  context 'when making requests' do
@@ -32,7 +31,7 @@ describe Puppet::HTTP::Service::FileServer do
32
31
  context 'when routing to the file service' do
33
32
  it 'defaults the server and port based on settings' do
34
33
  Puppet[:server] = 'file.example.com'
35
- Puppet[:masterport] = 8141
34
+ Puppet[:serverport] = 8141
36
35
 
37
36
  stub_request(:get, "https://file.example.com:8141/puppet/v3/file_content/:mount/:path?environment=testing")
38
37
 
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ require 'puppet/http'
3
+
4
+ describe Puppet::HTTP::Service::Puppetserver do
5
+ let(:ssl_context) { Puppet::SSL::SSLContext.new }
6
+ let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
7
+ let(:subject) { client.create_session.route_to(:puppetserver) }
8
+
9
+ before :each do
10
+ Puppet[:server] = 'puppetserver.example.com'
11
+ end
12
+
13
+ context 'when making requests' do
14
+ it 'includes default HTTP headers' do
15
+ stub_request(:get, "https://puppetserver.example.com:8140/status/v1/simple/master").with do |request|
16
+ expect(request.headers).to include({'X-Puppet-Version' => /./, 'User-Agent' => /./})
17
+ expect(request.headers).to_not include('X-Puppet-Profiling')
18
+ end.to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
19
+
20
+ subject.get_simple_status
21
+ end
22
+
23
+ it 'includes extra headers' do
24
+ Puppet[:http_extra_headers] = 'region:us-west'
25
+
26
+ stub_request(:get, "https://puppetserver.example.com:8140/status/v1/simple/master")
27
+ .with(headers: {'Region' => 'us-west'})
28
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
29
+
30
+ subject.get_simple_status
31
+ end
32
+ end
33
+
34
+ context 'when routing to the puppetserver service' do
35
+ it 'defaults the server and port based on settings' do
36
+ Puppet[:server] = 'compiler2.example.com'
37
+ Puppet[:serverport] = 8141
38
+
39
+ stub_request(:get, "https://compiler2.example.com:8141/status/v1/simple/master")
40
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
41
+
42
+ subject.get_simple_status
43
+ end
44
+ end
45
+
46
+ context 'when getting puppetserver status' do
47
+ let(:url) { "https://puppetserver.example.com:8140/status/v1/simple/master" }
48
+
49
+ it 'returns the request response and status' do
50
+ stub_request(:get, url)
51
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
52
+
53
+ resp, status = subject.get_simple_status
54
+ expect(resp).to be_a(Puppet::HTTP::Response)
55
+ expect(status).to eq('running')
56
+ end
57
+
58
+ it 'raises a response error if unsuccessful' do
59
+ stub_request(:get, url).to_return(status: [500, 'Internal Server Error'])
60
+
61
+ expect {
62
+ subject.get_simple_status
63
+ }.to raise_error do |err|
64
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
65
+ expect(err.message).to eq("Internal Server Error")
66
+ expect(err.response.code).to eq(500)
67
+ end
68
+ end
69
+
70
+ it 'accepts an ssl context' do
71
+ stub_request(:get, url)
72
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
73
+
74
+ other_ctx = Puppet::SSL::SSLContext.new
75
+ expect(client).to receive(:connect).with(URI(url), options: {ssl_context: other_ctx}).and_call_original
76
+
77
+ session = client.create_session
78
+ service = Puppet::HTTP::Service.create_service(client, session, :puppetserver, 'puppetserver.example.com', 8140)
79
+ service.get_simple_status(ssl_context: other_ctx)
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Service::Report do
@@ -37,11 +36,11 @@ describe Puppet::HTTP::Service::Report do
37
36
  subject.put_report('report', report, environment: environment)
38
37
  end
39
38
 
40
- it 'fallbacks to server and masterport' do
39
+ it 'fallbacks to server and serverport' do
41
40
  Puppet[:report_server] = nil
42
41
  Puppet[:report_port] = nil
43
42
  Puppet[:server] = 'report2.example.com'
44
- Puppet[:masterport] = 8142
43
+ Puppet[:serverport] = 8142
45
44
 
46
45
  stub_request(:put, "https://report2.example.com:8142/puppet/v3/report/report?environment=testing")
47
46
 
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
  require 'puppet/file_serving'
5
4
  require 'puppet/file_serving/content'
@@ -138,7 +137,7 @@ describe Puppet::HTTP::Service do
138
137
  catalog_mimes = if Puppet.features.msgpack?
139
138
  %w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack application/x-msgpack text/pson]
140
139
  else
141
- %w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack text/pson]
140
+ %w[application/vnd.puppet.rich+json application/json text/pson]
142
141
  end
143
142
  expect(service.mime_types(Puppet::Resource::Catalog)).to eq(catalog_mimes)
144
143
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Session do
@@ -27,9 +26,9 @@ describe Puppet::HTTP::Session do
27
26
  @count = 0
28
27
  end
29
28
 
30
- def resolve(session, name, ssl_context: nil, error_handler: nil)
29
+ def resolve(session, name, ssl_context: nil, canceled_handler: nil)
31
30
  @count += 1
32
- return @service if check_connection?(session, @service, ssl_context: ssl_context, error_handler: error_handler)
31
+ return @service if check_connection?(session, @service, ssl_context: ssl_context)
33
32
  end
34
33
  end
35
34
 
@@ -68,19 +67,8 @@ describe Puppet::HTTP::Session do
68
67
  session.route_to(:ca)
69
68
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
70
69
 
71
- expect(@logs).to include(an_object_having_attributes(level: :err, message: "whoops1"),
72
- an_object_having_attributes(level: :err, message: "whoops2"))
73
- end
74
-
75
- it 'logs routing failures as debug until routing succeeds' do
76
- Puppet[:log_level] = 'debug'
77
-
78
- resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
79
- session = described_class.new(client, resolvers)
80
- session.route_to(:ca)
81
-
82
- expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
83
- expect(@logs).to_not include(an_object_having_attributes(level: :err))
70
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: "Connection to #{uri} failed, trying next route: whoops1"),
71
+ an_object_having_attributes(level: :err, message: "Connection to #{uri} failed, trying next route: whoops2"))
84
72
  end
85
73
 
86
74
  it 'accepts an ssl context to use when connecting' do
@@ -168,16 +156,15 @@ describe Puppet::HTTP::Session do
168
156
  expect(service.url).to eq(URI("https://bar.example.com:8140/puppet-ca/v1"))
169
157
  end
170
158
 
171
- it "fails if server_list doesn't return anything valid" do
172
- Puppet[:server_list] = 'foo.example.com,bar.example.com'
159
+ it "does not fallback from server_list to the settings resolver when server_list is exhausted" do
160
+ Puppet[:server_list] = 'foo.example.com'
173
161
 
174
- allow_any_instance_of(Puppet::Network::Resolver).to receive(:each_srv_record)
162
+ expect_any_instance_of(Puppet::HTTP::Resolver::Settings).to receive(:resolve).never
175
163
  stub_request(:get, "https://foo.example.com:8140/status/v1/simple/master").to_return(status: 500)
176
- stub_request(:get, "https://bar.example.com:8140/status/v1/simple/master").to_return(status: 500)
177
164
 
178
165
  expect {
179
166
  session.route_to(:ca)
180
- }.to raise_error(Puppet::Error, "Could not select a functional puppet master from server_list: 'foo.example.com,bar.example.com'")
167
+ }.to raise_error(Puppet::HTTP::RouteError, "No more routes to ca")
181
168
  end
182
169
 
183
170
  it "raises when there are no more routes" do
@@ -24,7 +24,7 @@ describe Puppet::Resource::Catalog::Json do
24
24
  end
25
25
 
26
26
  before :each do
27
- allow(Puppet.run_mode).to receive(:master?).and_return(true)
27
+ allow(Puppet.run_mode).to receive(:server?).and_return(true)
28
28
  Puppet[:server_datadir] = tmpdir('jsondir')
29
29
  FileUtils.mkdir_p(File.join(Puppet[:server_datadir], 'indirector_testing'))
30
30
  Puppet.push_context(:loaders => Puppet::Pops::Loaders.new(env))
@@ -10,7 +10,7 @@ describe Puppet::Resource::Catalog::Rest do
10
10
 
11
11
  before :each do
12
12
  Puppet[:server] = 'compiler.example.com'
13
- Puppet[:masterport] = 8140
13
+ Puppet[:serverport] = 8140
14
14
 
15
15
  described_class.indirection.terminus_class = :rest
16
16
  end
@@ -33,7 +33,6 @@ describe Puppet::Indirector::Face do
33
33
  describe "as an instance" do
34
34
  it "should be able to determine its indirection" do
35
35
  # Loading actions here can get, um, complicated
36
- allow(Puppet::Face).to receive(:load_actions)
37
36
  expect(Puppet::Indirector::Face.new(:catalog, '0.0.1').indirection).to equal(Puppet::Resource::Catalog.indirection)
38
37
  end
39
38
  end
@@ -22,7 +22,6 @@ describe Puppet::Node::Facts::Facter do
22
22
  end
23
23
 
24
24
  before :each do
25
- allow(Puppet::Node::Facts::Facter).to receive(:reload_facter)
26
25
  @facter = Puppet::Node::Facts::Facter.new
27
26
  allow(Facter).to receive(:to_hash).and_return({})
28
27
  @name = "me"
@@ -0,0 +1,255 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/node/facts'
4
+ require 'puppet/indirector/facts/json'
5
+
6
+ def dir_containing_json_facts(hash)
7
+ jsondir = tmpdir('json_facts')
8
+
9
+ Puppet[:client_datadir] = jsondir
10
+ dir = File.join(jsondir, 'facts')
11
+ Dir.mkdir(dir)
12
+ hash.each_pair do |file, facts|
13
+ File.open(File.join(dir, file), 'wb') do |f|
14
+ f.write(JSON.dump(facts))
15
+ end
16
+ end
17
+ end
18
+
19
+ describe Puppet::Node::Facts::Json do
20
+ include PuppetSpec::Files
21
+
22
+ it "should be a subclass of the Json terminus" do
23
+ expect(Puppet::Node::Facts::Json.superclass).to equal(Puppet::Indirector::JSON)
24
+ end
25
+
26
+ it "should have documentation" do
27
+ expect(Puppet::Node::Facts::Json.doc).not_to be_nil
28
+ expect(Puppet::Node::Facts::Json.doc).not_to be_empty
29
+ end
30
+
31
+ it "should be registered with the facts indirection" do
32
+ indirection = Puppet::Indirector::Indirection.instance(:facts)
33
+ expect(Puppet::Node::Facts::Json.indirection).to equal(indirection)
34
+ end
35
+
36
+ it "should have its name set to :json" do
37
+ expect(Puppet::Node::Facts::Json.name).to eq(:json)
38
+ end
39
+
40
+ it "should allow network requests" do
41
+ # Doesn't allow json as a network format, but allows `puppet facts upload`
42
+ # to update the JSON cache on a master.
43
+ expect(Puppet::Node::Facts::Json.new.allow_remote_requests?).to be(true)
44
+ end
45
+
46
+ describe "#search" do
47
+ def assert_search_matches(matching, nonmatching, query)
48
+ request = Puppet::Indirector::Request.new(:inventory, :search, nil, nil, query)
49
+
50
+ dir_containing_json_facts(matching.merge(nonmatching))
51
+
52
+ results = Puppet::Node::Facts::Json.new.search(request)
53
+ expect(results).to match_array(matching.values.map {|facts| facts.name})
54
+ end
55
+
56
+ it "should return node names that match the search query options" do
57
+ assert_search_matches({
58
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '4'),
59
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "i386", 'processor_count' => '4', 'randomfact' => 'foo')
60
+ },
61
+ {
62
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '4'),
63
+ "nonmatching1.json" => Puppet::Node::Facts.new("nonmatchingnode1", "architecture" => "powerpc", 'processor_count' => '5'),
64
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5'),
65
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3", 'processor_count' => '4'),
66
+ },
67
+ {'facts.architecture' => 'i386', 'facts.processor_count' => '4'}
68
+ )
69
+ end
70
+
71
+ it "should return empty array when no nodes match the search query options" do
72
+ assert_search_matches({}, {
73
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '10'),
74
+ "nonmatching1.json" => Puppet::Node::Facts.new("nonmatchingnode1", "architecture" => "powerpc", 'processor_count' => '5'),
75
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5'),
76
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3", 'processor_count' => '4'),
77
+ },
78
+ {'facts.processor_count.lt' => '4', 'facts.processor_count.gt' => '4'}
79
+ )
80
+ end
81
+
82
+ it "should return node names that match the search query options with the greater than operator" do
83
+ assert_search_matches({
84
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
85
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '10', 'randomfact' => 'foo')
86
+ },
87
+ {
88
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '4'),
89
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '3'),
90
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
91
+ },
92
+ {'facts.processor_count.gt' => '4'}
93
+ )
94
+ end
95
+
96
+ it "should return node names that match the search query options with the less than operator" do
97
+ assert_search_matches({
98
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
99
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '30', 'randomfact' => 'foo')
100
+ },
101
+ {
102
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '50' ),
103
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '100'),
104
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
105
+ },
106
+ {'facts.processor_count.lt' => '50'}
107
+ )
108
+ end
109
+
110
+ it "should return node names that match the search query options with the less than or equal to operator" do
111
+ assert_search_matches({
112
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
113
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '50', 'randomfact' => 'foo')
114
+ },
115
+ {
116
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '100' ),
117
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5000'),
118
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
119
+ },
120
+ {'facts.processor_count.le' => '50'}
121
+ )
122
+ end
123
+
124
+ it "should return node names that match the search query options with the greater than or equal to operator" do
125
+ assert_search_matches({
126
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '100'),
127
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '50', 'randomfact' => 'foo')
128
+ },
129
+ {
130
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '40'),
131
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '9' ),
132
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
133
+ },
134
+ {'facts.processor_count.ge' => '50'}
135
+ )
136
+ end
137
+
138
+ it "should return node names that match the search query options with the not equal operator" do
139
+ assert_search_matches({
140
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => 'arm' ),
141
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => 'powerpc', 'randomfact' => 'foo')
142
+ },
143
+ {
144
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "i386" ),
145
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '9' ),
146
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
147
+ },
148
+ {'facts.architecture.ne' => 'i386'}
149
+ )
150
+ end
151
+
152
+ def apply_timestamp(facts, timestamp)
153
+ facts.timestamp = timestamp
154
+ facts
155
+ end
156
+
157
+ it "should be able to query based on meta.timestamp.gt" do
158
+ assert_search_matches({
159
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
160
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
161
+ },
162
+ {
163
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
164
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
165
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
166
+ },
167
+ {'meta.timestamp.gt' => '2010-10-15'}
168
+ )
169
+ end
170
+
171
+ it "should be able to query based on meta.timestamp.le" do
172
+ assert_search_matches({
173
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
174
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
175
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
176
+ },
177
+ {
178
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
179
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
180
+ },
181
+ {'meta.timestamp.le' => '2010-10-15'}
182
+ )
183
+ end
184
+
185
+ it "should be able to query based on meta.timestamp.lt" do
186
+ assert_search_matches({
187
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
188
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
189
+ },
190
+ {
191
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
192
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
193
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
194
+ },
195
+ {'meta.timestamp.lt' => '2010-10-15'}
196
+ )
197
+ end
198
+
199
+ it "should be able to query based on meta.timestamp.ge" do
200
+ assert_search_matches({
201
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
202
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
203
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
204
+ },
205
+ {
206
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
207
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
208
+ },
209
+ {'meta.timestamp.ge' => '2010-10-15'}
210
+ )
211
+ end
212
+
213
+ it "should be able to query based on meta.timestamp.eq" do
214
+ assert_search_matches({
215
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
216
+ },
217
+ {
218
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
219
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
220
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
221
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
222
+ },
223
+ {'meta.timestamp.eq' => '2010-10-15'}
224
+ )
225
+ end
226
+
227
+ it "should be able to query based on meta.timestamp" do
228
+ assert_search_matches({
229
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
230
+ },
231
+ {
232
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
233
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
234
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
235
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
236
+ },
237
+ {'meta.timestamp' => '2010-10-15'}
238
+ )
239
+ end
240
+
241
+ it "should be able to query based on meta.timestamp.ne" do
242
+ assert_search_matches({
243
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
244
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
245
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
246
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
247
+ },
248
+ {
249
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
250
+ },
251
+ {'meta.timestamp.ne' => '2010-10-15'}
252
+ )
253
+ end
254
+ end
255
+ end