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
@@ -234,8 +234,8 @@ describe Puppet::Application::Doc do
234
234
  end
235
235
  end
236
236
 
237
- it "should operate in master run_mode" do
238
- expect(@doc.class.run_mode.name).to eq(:master)
237
+ it "should operate in server run_mode" do
238
+ expect(@doc.class.run_mode.name).to eq(:server)
239
239
 
240
240
  @doc.setup_rdoc
241
241
  end
@@ -423,16 +423,18 @@ EOT
423
423
  it "should work if asked to render json" do
424
424
  allow(app.command_line).to receive(:args).and_return(%w{count_args a b c --render-as json})
425
425
  expect {
426
- expect { app.run }.to exit_with(0)
427
- }.to have_printed(/3/)
426
+ app.run
427
+ }.to exit_with(0)
428
+ .and output(/3/).to_stdout
428
429
  end
429
430
 
430
431
  it "should invoke when_rendering hook 's' when asked to render-as 's'" do
431
432
  allow(app.command_line).to receive(:args).and_return(%w{with_s_rendering_hook --render-as s})
432
433
  app.action = app.face.get_action(:with_s_rendering_hook)
433
434
  expect {
434
- expect { app.run }.to exit_with(0)
435
- }.to have_printed(/you invoked the 's' rendering hook/)
435
+ app.run
436
+ }.to exit_with(0)
437
+ .and output(/you invoked the 's' rendering hook/).to_stdout
436
438
  end
437
439
  end
438
440
 
@@ -2,21 +2,52 @@ require 'spec_helper'
2
2
  require 'puppet/application/facts'
3
3
 
4
4
  describe Puppet::Application::Facts do
5
+ let(:app) { Puppet::Application[:facts] }
6
+ let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:25"} }
7
+
5
8
  before :each do
6
- allow(subject.command_line).to receive(:subcommand_name).and_return('facts')
9
+ Puppet::Node::Facts.indirection.terminus_class = :memory
7
10
  end
8
11
 
9
- it "should return facts if a key is given to find" do
10
- Puppet::Node::Facts.indirection.reset_terminus_class
11
- expect(Puppet::Node::Facts.indirection).to receive(:find).and_return(Puppet::Node::Facts.new('whatever', {}))
12
- allow(subject.command_line).to receive(:args).and_return(%w{find whatever --render-as yaml})
12
+ it "returns facts for a given node" do
13
+ facts = Puppet::Node::Facts.new('whatever', values)
14
+ Puppet::Node::Facts.indirection.save(facts)
15
+
16
+ app.command_line.args = %w{find whatever --render-as yaml}
17
+
18
+ # due to PUP-10105 we emit the class tag when we shouldn't
19
+ expected = Regexp.new(<<~END)
20
+ --- !ruby/object:Puppet::Node::Facts
21
+ name: whatever
22
+ values:
23
+ filesystems: apfs,autofs,devfs
24
+ macaddress: "64:52:11:22:03:25"
25
+ END
13
26
 
14
27
  expect {
15
- expect {
16
- subject.run
17
- }.to exit_with(0)
18
- }.to have_printed(/object:Puppet::Node::Facts/)
28
+ app.run
29
+ }.to exit_with(0)
30
+ .and output(expected).to_stdout
31
+ end
19
32
 
20
- expect(@logs).to be_empty
33
+ it "returns facts for the current node when the name is omitted" do
34
+ facts = Puppet::Node::Facts.new(Puppet[:certname], values)
35
+ Puppet::Node::Facts.indirection.save(facts)
36
+
37
+ app.command_line.args = %w{find --render-as yaml}
38
+
39
+ # due to PUP-10105 we emit the class tag when we shouldn't
40
+ expected = Regexp.new(<<~END)
41
+ --- !ruby/object:Puppet::Node::Facts
42
+ name: #{Puppet[:certname]}
43
+ values:
44
+ filesystems: apfs,autofs,devfs
45
+ macaddress: "64:52:11:22:03:25"
46
+ END
47
+
48
+ expect {
49
+ app.run
50
+ }.to exit_with(0)
51
+ .and output(expected).to_stdout
21
52
  end
22
53
  end
@@ -42,7 +42,6 @@ describe Puppet::Application::Filebucket do
42
42
  describe "during setup" do
43
43
  before :each do
44
44
  allow(Puppet::Log).to receive(:newdestination)
45
- allow(Puppet).to receive(:settraps)
46
45
  allow(Puppet::FileBucket::Dipper).to receive(:new)
47
46
  allow(@filebucket.options).to receive(:[])
48
47
  end
@@ -157,7 +156,6 @@ describe Puppet::Application::Filebucket do
157
156
  describe "when running" do
158
157
  before :each do
159
158
  allow(Puppet::Log).to receive(:newdestination)
160
- allow(Puppet).to receive(:settraps)
161
159
  allow(Puppet::FileBucket::Dipper).to receive(:new)
162
160
  allow(@filebucket.options).to receive(:[])
163
161
 
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'puppet/face'
3
+
4
+ describe Puppet::Face[:man, :current] do
5
+ let(:pager) { '/path/to/our/pager' }
6
+
7
+ around do |example|
8
+ Puppet::Util.withenv('MANPAGER' => pager) do
9
+ example.run
10
+ end
11
+ end
12
+
13
+ it 'is deprecated' do
14
+ expect(subject).to be_deprecated
15
+ end
16
+
17
+ it 'has a man action' do
18
+ expect(subject).to be_action(:man)
19
+ end
20
+
21
+ it 'accepts a call with no arguments' do
22
+ expect { subject.man }.to output(/USAGE: puppet man <action>/).to_stdout
23
+ end
24
+
25
+ it 'raises an ArgumentError when given too many arguments' do
26
+ expect {
27
+ subject.man(:man, 'agent', 'extra')
28
+ }.to raise_error(ArgumentError)
29
+ .and output(/USAGE: puppet man <action>/).to_stdout
30
+ end
31
+
32
+ it "exits with 0 when generating man documentation for each available application" do
33
+ # turn off deprecation warning
34
+ Puppet[:disable_warnings] = ['deprecations']
35
+
36
+ allow(Puppet::Util).to receive(:which).with('ronn').and_return(nil)
37
+ allow(Puppet::Util).to receive(:which).with(pager).and_return(pager)
38
+
39
+ Puppet::Application.available_application_names.each do |name|
40
+ next if %w{man face_base indirection_base}.include? name
41
+
42
+ app = Puppet::Application[:man]
43
+ app.command_line.args << 'man' << name
44
+
45
+ expect {
46
+ allow(IO).to receive(:popen).with(pager, 'w:UTF-8').and_yield($stdout)
47
+ app.run
48
+ }.to exit_with(0)
49
+ .and output(/puppet-#{name}/m).to_stdout
50
+ end
51
+ end
52
+ end
@@ -51,7 +51,9 @@ describe Puppet::Application::Resource do
51
51
  # provider is a parameter that should always be available
52
52
  @resource_app.extra_params = [ :provider ]
53
53
 
54
- expect { @resource_app.main }.to have_printed(/provider\s+=>/)
54
+ expect {
55
+ @resource_app.main
56
+ }.to output(/provider\s+=>/).to_stdout
55
57
  end
56
58
  end
57
59
 
@@ -38,7 +38,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
38
38
  def expects_command_to_pass(expected_output = nil)
39
39
  expect {
40
40
  ssl.run_command
41
- }.to have_printed(expected_output)
41
+ }.to output(expected_output).to_stdout
42
42
  end
43
43
 
44
44
  def expects_command_to_fail(message)
@@ -46,7 +46,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
46
46
  expect {
47
47
  ssl.run_command
48
48
  }.to raise_error(Puppet::Error, message)
49
- }.to have_printed(/.*/) # ignore output
49
+ }.to output(/.*/).to_stdout
50
50
  end
51
51
 
52
52
  shared_examples_for 'an ssl action' do
@@ -266,6 +266,19 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
266
266
  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'encrypted-key.pem'), Puppet[:hostprivkey])
267
267
  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'signed.pem'), Puppet[:hostcert])
268
268
 
269
+ # To verify the client cert we need the root and intermediate certs and crls.
270
+ # We don't need to do this with `ssl-client` cert above, because it is issued
271
+ # directly from the generated TestCa above.
272
+ File.open(Puppet[:localcacert], 'w') do |f|
273
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem')))
274
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate.pem')))
275
+ end
276
+
277
+ File.open(Puppet[:hostcrl], 'w') do |f|
278
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'crl.pem')))
279
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate-crl.pem')))
280
+ end
281
+
269
282
  Puppet[:passfile] = file_containing('passfile', '74695716c8b6')
270
283
 
271
284
  expects_command_to_pass(%r{Verified client certificate 'CN=signed' fingerprint})
@@ -7,8 +7,10 @@ require 'timeout'
7
7
 
8
8
  describe Puppet::Application do
9
9
  before(:each) do
10
- @app = Class.new(Puppet::Application).new
11
- @appclass = @app.class
10
+ @appclass = Class.new(Puppet::Application) do
11
+ def handle_unknown(opt, arg); end
12
+ end
13
+ @app = @appclass.new
12
14
 
13
15
  allow(@app).to receive(:name).and_return("test_app")
14
16
  end
@@ -118,6 +120,11 @@ describe Puppet::Application do
118
120
  @appclass.run_mode :agent
119
121
  expect(@appclass.run_mode.name).to eq(:agent)
120
122
  end
123
+
124
+ it "considers :server to be master" do
125
+ @appclass.run_mode :server
126
+ expect(@appclass.run_mode).to be_master
127
+ end
121
128
  end
122
129
 
123
130
  describe ".environment_mode" do
@@ -147,7 +154,7 @@ describe Puppet::Application do
147
154
  describe "when dealing with run_mode" do
148
155
 
149
156
  class TestApp < Puppet::Application
150
- run_mode :master
157
+ run_mode :server
151
158
  def run_command
152
159
  # no-op
153
160
  end
@@ -159,16 +166,16 @@ describe Puppet::Application do
159
166
  app = TestApp.new
160
167
  app.initialize_app_defaults
161
168
 
162
- expect(Puppet.run_mode).to be_master
169
+ expect(Puppet.run_mode).to be_server
163
170
  end
164
171
 
165
172
  it "should sadly and frighteningly allow run_mode to change at runtime via #run" do
166
173
  app = TestApp.new
167
174
  app.run
168
175
 
169
- expect(app.class.run_mode.name).to eq(:master)
176
+ expect(app.class.run_mode.name).to eq(:server)
170
177
 
171
- expect(Puppet.run_mode).to be_master
178
+ expect(Puppet.run_mode).to be_server
172
179
  end
173
180
  end
174
181
 
@@ -506,6 +513,40 @@ describe Puppet::Application do
506
513
 
507
514
  expect { @app.configure_indirector_routes }.to raise_error(Puppet::Error, /mapping values are not allowed/)
508
515
  end
516
+
517
+ it "should treat master routes on server application" do
518
+ allow(@app).to receive(:name).and_return("server")
519
+
520
+ Puppet[:route_file] = tmpfile('routes')
521
+ File.open(Puppet[:route_file], 'w') do |f|
522
+ f.print <<-ROUTES
523
+ master:
524
+ node:
525
+ terminus: exec
526
+ ROUTES
527
+ end
528
+
529
+ @app.configure_indirector_routes
530
+
531
+ expect(Puppet::Node.indirection.terminus_class).to eq('exec')
532
+ end
533
+
534
+ it "should treat server routes on master application" do
535
+ allow(@app).to receive(:name).and_return("master")
536
+
537
+ Puppet[:route_file] = tmpfile('routes')
538
+ File.open(Puppet[:route_file], 'w') do |f|
539
+ f.print <<-ROUTES
540
+ server:
541
+ node:
542
+ terminus: exec
543
+ ROUTES
544
+ end
545
+
546
+ @app.configure_indirector_routes
547
+
548
+ expect(Puppet::Node.indirection.terminus_class).to eq('exec')
549
+ end
509
550
  end
510
551
 
511
552
  describe "when running" do
@@ -555,13 +596,6 @@ describe Puppet::Application do
555
596
  end
556
597
 
557
598
  it "should raise an error if dispatch returns no command" do
558
- allow(@app).to receive(:get_command).and_return(nil)
559
- expect(Puppet).to receive(:send_log).with(:err, "Could not run: No valid command or main")
560
- expect { @app.run }.to exit_with 1
561
- end
562
-
563
- it "should raise an error if dispatch returns an invalid command" do
564
- allow(@app).to receive(:get_command).and_return(:this_function_doesnt_exist)
565
599
  expect(Puppet).to receive(:send_log).with(:err, "Could not run: No valid command or main")
566
600
  expect { @app.run }.to exit_with 1
567
601
  end
@@ -679,5 +713,18 @@ describe Puppet::Application do
679
713
 
680
714
  @app.handle_logdest_arg(nil)
681
715
  end
716
+
717
+ it "accepts multiple destinations as a comma sepparated list" do
718
+ dest1 = '/tmp/path1'
719
+ dest2 = 'console'
720
+ dest3 = '/tmp/path2'
721
+ dest_args = [dest1, dest2, dest3].join(' , ')
722
+
723
+ [dest1, dest2, dest3].each do |dest|
724
+ expect(Puppet::Util::Log).to receive(:newdestination).with(dest)
725
+ end
726
+
727
+ @app.handle_logdest_arg(dest_args)
728
+ end
682
729
  end
683
730
  end
@@ -228,5 +228,15 @@ describe Puppet::Configurer::Downloader do
228
228
 
229
229
  expect { @dler.evaluate }.not_to raise_error
230
230
  end
231
+
232
+ it "raises an exception if catalog application fails" do
233
+ Puppet[:ignore_plugin_errors] = false
234
+
235
+ expect(@dler.file).to receive(:retrieve).and_raise(Puppet::Error, "testing")
236
+
237
+ expect {
238
+ @dler.evaluate
239
+ }.to raise_error(Puppet::Error, /testing/)
240
+ end
231
241
  end
232
242
  end
@@ -104,7 +104,7 @@ describe Puppet::Configurer::FactHandler do
104
104
  expect(text).to include(test_fact[:encoded])
105
105
 
106
106
  # this is not sufficient to test whether these values are sent via HTTP GET or HTTP POST in actual catalog request
107
- expect(JSON.parse(URI.unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
107
+ expect(JSON.parse(Puppet::Util.uri_unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
108
108
  end
109
109
  end
110
110
  end
@@ -129,7 +129,7 @@ describe Puppet::Configurer::FactHandler do
129
129
  expect(to_upload).to eq({:facts_format => 'application/json', :facts => text})
130
130
  expect(text).to include(test_fact[:encoded])
131
131
 
132
- expect(JSON.parse(URI.unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
132
+ expect(JSON.parse(Puppet::Util.uri_unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
133
133
  end
134
134
  end
135
135
  end
@@ -138,9 +138,9 @@ describe Puppet::Configurer::FactHandler do
138
138
  facts = Puppet::Node::Facts.new(Puppet[:node_name_value], 'my_name_fact' => 'other_node_name')
139
139
  Puppet::Node::Facts.indirection.save(facts)
140
140
 
141
- # prefer URI.unescape but validate CGI also works
141
+ # prefer Puppet::Util.uri_unescape but validate CGI also works
142
142
  encoded_facts = facthandler.facts_for_uploading[:facts]
143
- expect(URI.unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
143
+ expect(Puppet::Util.uri_unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
144
144
  expect(CGI.unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
145
145
  end
146
146
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/configurer'
3
- require 'webmock/rspec'
4
3
 
5
4
  describe Puppet::Configurer do
6
5
  before do
@@ -85,6 +84,44 @@ describe Puppet::Configurer do
85
84
  expect(configurer.run).to eq(0)
86
85
  end
87
86
 
87
+ it "fails the run if pluginsync fails when usecacheonfailure is false" do
88
+ Puppet[:ignore_plugin_errors] = false
89
+
90
+ # --test implies these, set them so we don't fall back to a cached catalog
91
+ Puppet[:use_cached_catalog] = false
92
+ Puppet[:usecacheonfailure] = false
93
+
94
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
95
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
96
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
97
+ )
98
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
99
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
100
+ )
101
+
102
+ configurer.run(pluginsync: true)
103
+
104
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: %r{Failed to apply catalog: Failed to retrieve pluginfacts: Could not retrieve information from environment production source\(s\) puppet:///pluginfacts}))
105
+ end
106
+
107
+ it "applies a cached catalog if pluginsync fails when usecacheonfailure is true" do
108
+ Puppet[:ignore_plugin_errors] = false
109
+
110
+ Puppet[:use_cached_catalog] = false
111
+ Puppet[:usecacheonfailure] = true
112
+
113
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
114
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
115
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
116
+ )
117
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
118
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
119
+ )
120
+
121
+ expect(configurer.run(pluginsync: true, :report => report)).to eq(0)
122
+ expect(report.cached_catalog_status).to eq('on_failure')
123
+ end
124
+
88
125
  it "applies a cached catalog when it can't connect to the master" do
89
126
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
90
127
 
@@ -96,7 +133,8 @@ describe Puppet::Configurer do
96
133
  end
97
134
 
98
135
  it "should initialize a transaction report if one is not provided" do
99
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
136
+ # host and settings catalogs each create a report...
137
+ expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
100
138
 
101
139
  configurer.run
102
140
  end
@@ -192,22 +230,21 @@ describe Puppet::Configurer do
192
230
  end
193
231
 
194
232
  it "should remove the report as a log destination when the run is finished" do
195
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
196
-
197
- configurer.run
233
+ configurer.run(report: report)
198
234
 
199
235
  expect(Puppet::Util::Log.destinations).not_to include(report)
200
236
  end
201
237
 
202
- it "should return the report exit_status as the result of the run" do
203
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
204
- expect(report).to receive(:exit_status).and_return(1234)
238
+ it "should return an exit status of 2 due to the notify resource 'changing'" do
239
+ cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
240
+ cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
205
241
 
206
- expect(configurer.run).to eq(1234)
242
+ expect(configurer.run(catalog: cat, report: report)).to eq(2)
207
243
  end
208
244
 
209
245
  it "should return nil if catalog application fails" do
210
- expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
246
+ expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
247
+
211
248
  expect(configurer.run(catalog: catalog, report: report)).to be_nil
212
249
  end
213
250
 
@@ -222,34 +259,28 @@ describe Puppet::Configurer do
222
259
  end
223
260
 
224
261
  it "should include the pre-run command failure in the report" do
225
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
226
-
227
262
  Puppet.settings[:prerun_command] = "/my/command"
228
263
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
229
264
 
230
- expect(configurer.run).to be_nil
265
+ expect(configurer.run(report: report)).to be_nil
231
266
  expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
232
267
  end
233
268
 
234
269
  it "should send the transaction report even if the post-run command fails" do
235
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
236
-
237
270
  Puppet.settings[:postrun_command] = "/my/command"
238
271
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
239
272
  expect(configurer).to receive(:send_report).with(report)
240
273
 
241
- expect(configurer.run).to be_nil
274
+ expect(configurer.run(report: report)).to be_nil
242
275
  end
243
276
 
244
277
  it "should include the post-run command failure in the report" do
245
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
246
-
247
278
  Puppet.settings[:postrun_command] = "/my/command"
248
279
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
249
280
 
250
281
  expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
251
282
 
252
- expect(configurer.run).to be_nil
283
+ expect(configurer.run(report: report)).to be_nil
253
284
  end
254
285
 
255
286
  it "should execute post-run command even if the pre-run command fails" do
@@ -262,34 +293,28 @@ describe Puppet::Configurer do
262
293
  end
263
294
 
264
295
  it "should finalize the report" do
265
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
266
-
267
296
  expect(report).to receive(:finalize_report)
268
- configurer.run
297
+ configurer.run(report: report)
269
298
  end
270
299
 
271
300
  it "should not apply the catalog if the pre-run command fails" do
272
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
273
-
274
301
  Puppet.settings[:prerun_command] = "/my/command"
275
302
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
276
303
 
277
304
  expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
278
305
  expect(configurer).to receive(:send_report)
279
306
 
280
- expect(configurer.run).to be_nil
307
+ expect(configurer.run(report: report)).to be_nil
281
308
  end
282
309
 
283
310
  it "should apply the catalog, send the report, and return nil if the post-run command fails" do
284
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
285
-
286
311
  Puppet.settings[:postrun_command] = "/my/command"
287
312
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
288
313
 
289
314
  expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
290
315
  expect(configurer).to receive(:send_report)
291
316
 
292
- expect(configurer.run).to be_nil
317
+ expect(configurer.run(report: report)).to be_nil
293
318
  end
294
319
 
295
320
  it 'includes total time metrics in the report after successfully applying the catalog' do
@@ -546,6 +571,15 @@ describe Puppet::Configurer do
546
571
  end
547
572
  end
548
573
 
574
+ def expects_pluginsync
575
+ metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
576
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
577
+
578
+ # response retains owner/group/mode due to source_permissions => use
579
+ facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
580
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
581
+ end
582
+
549
583
  def expects_new_catalog_only(catalog)
550
584
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
551
585
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
@@ -562,6 +596,7 @@ describe Puppet::Configurer do
562
596
  end
563
597
 
564
598
  def expects_fallback_to_new_catalog(catalog)
599
+ expects_pluginsync
565
600
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
566
601
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
567
602
  end
@@ -598,7 +633,6 @@ describe Puppet::Configurer do
598
633
  it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
599
634
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
600
635
  expects_fallback_to_new_catalog(catalog)
601
- expect(configurer).to receive(:download_plugins)
602
636
 
603
637
  configurer.run
604
638
  end
@@ -636,6 +670,7 @@ describe Puppet::Configurer do
636
670
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
637
671
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
638
672
  expects_neither_new_or_cached_catalog
673
+ expects_pluginsync
639
674
 
640
675
  # after failing to use a cached catalog, we'll need to pluginsync before getting
641
676
  # a new catalog, which also fails.
@@ -656,8 +691,7 @@ describe Puppet::Configurer do
656
691
  end
657
692
 
658
693
  it "applies the catalog passed as options when the catalog cache terminus is not set" do
659
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
660
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
694
+ expects_pluginsync
661
695
 
662
696
  catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
663
697
  configurer.run(catalog: catalog.to_ral)
@@ -1010,30 +1044,45 @@ describe Puppet::Configurer do
1010
1044
  options = {}
1011
1045
  configurer.run(options)
1012
1046
  expect(options[:report].master_used).to eq('myserver:123')
1047
+ expect(options[:report].server_used).to eq('myserver:123')
1013
1048
  end
1014
1049
 
1015
- it "should report when a server is unavailable" do
1050
+ it "should report when usecacheonfailure is false and server is unavailable" do
1016
1051
  Puppet.settings[:server_list] = ["myserver:123"]
1052
+ Puppet[:usecacheonfailure] = false
1017
1053
 
1018
1054
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: [500, "Internal Server Error"])
1019
1055
 
1020
- allow(Puppet).to receive(:debug)
1021
- expect(Puppet).to receive(:debug).with("Puppet server myserver:123 is unavailable: 500 Internal Server Error")
1022
-
1023
1056
  expect {
1024
1057
  configurer.run
1025
- }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
1058
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list:/)
1059
+
1060
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: /Puppet server myserver:123 is unavailable: 500 Internal Server Error/))
1026
1061
  end
1027
1062
 
1028
1063
  it "should error when no servers in 'server_list' are reachable" do
1029
1064
  Puppet.settings[:server_list] = "myserver:123,someotherservername"
1065
+ Puppet[:usecacheonfailure] = false
1030
1066
 
1031
1067
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 400)
1032
1068
  stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 400)
1033
1069
 
1034
1070
  expect{
1035
1071
  configurer.run
1036
- }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
1072
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list: 'myserver:123,someotherservername'/)
1073
+ end
1074
+
1075
+ it "should not error when usecacheonfailure is true and no servers in 'server_list' are reachable" do
1076
+ Puppet.settings[:server_list] = "myserver:123,someotherservername"
1077
+ Puppet[:usecacheonfailure] = true
1078
+
1079
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 400)
1080
+ stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 400)
1081
+
1082
+ options = {}
1083
+
1084
+ expect(configurer.run(options)).to eq(0)
1085
+ expect(options[:report].server_used).to be_nil
1037
1086
  end
1038
1087
 
1039
1088
  it "should not make multiple node requests when the server is found" do