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
@@ -0,0 +1,30 @@
1
+ concurrent-ruby (1.1.5)
2
+
3
+ deep_merge (1.0.1)
4
+
5
+ fast_gettext (1.1.2)
6
+
7
+ gettext (3.2.2)
8
+
9
+ hiera-eyaml (3.2.0)
10
+
11
+ highline (1.6.21)
12
+
13
+ hocon (1.3.1, 1.2.5)
14
+
15
+ locale (2.1.3, 2.1.2)
16
+
17
+ multi_json (1.14.1)
18
+
19
+ optimist (3.0.1)
20
+
21
+ puppet-resource_api (1.8.13)
22
+
23
+ puppetserver-ca (1.8.0)
24
+
25
+ semantic_puppet (1.0.2)
26
+
27
+ text (1.3.1)
28
+
29
+ world_airports (1.1.3)
30
+
@@ -6,6 +6,10 @@ test_aix_user:
6
6
  no_password_user:
7
7
  lastupdate = another_last_update
8
8
 
9
+ tab_password_user:
10
+ password = some_password
11
+ lastupdate = another_last_update
12
+
9
13
  daemon:
10
14
  password = *
11
15
 
@@ -15,21 +15,17 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
15
15
  let(:formatter) { Puppet::Network::FormatHandler.format(:rich_data_json) }
16
16
 
17
17
  context 'server_list' do
18
- before :each do
19
- Puppet[:log_level] = 'debug'
20
- end
21
-
22
18
  it "uses the first server in the list" do
23
19
  Puppet[:server_list] = '127.0.0.1'
20
+ Puppet[:log_level] = 'debug'
24
21
 
25
22
  server.start_server do |port|
26
- Puppet[:masterport] = port
23
+ Puppet[:serverport] = port
27
24
  expect {
28
- expect {
29
- agent.command_line.args << '--test'
30
- agent.run
31
- }.to exit_with(0)
32
- }.to output(%r{HTTP GET https://127.0.0.1:#{port}/status/v1/simple/master returned 200 OK}).to_stdout
25
+ agent.command_line.args << '--test'
26
+ agent.run
27
+ }.to exit_with(0)
28
+ .and output(%r{HTTP GET https://127.0.0.1:#{port}/status/v1/simple/master returned 200 OK}).to_stdout
33
29
  end
34
30
  end
35
31
 
@@ -37,16 +33,17 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
37
33
  Puppet[:server_list] = "puppet.example.com,#{Puppet[:server]}"
38
34
 
39
35
  server.start_server do |port|
40
- Puppet[:masterport] = port
36
+ Puppet[:serverport] = port
41
37
  expect {
42
- expect {
43
- agent.command_line.args << '--test'
44
- agent.run
45
- }.to exit_with(0)
46
- }.to output(%r{Unable to connect to server from server_list setting: Request to https://puppet.example.com:#{port}/status/v1/simple/master failed}).to_stdout
38
+ agent.command_line.args << '--test'
39
+ agent.run
40
+ }.to exit_with(0)
41
+ .and output(%r{Notice: Applied catalog}).to_stdout
42
+ .and output(%r{Unable to connect to server from server_list setting: Request to https://puppet.example.com:#{port}/status/v1/simple/master failed}).to_stderr
47
43
 
48
44
  report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
49
45
  expect(report.master_used).to eq("127.0.0.1:#{port}")
46
+ expect(report.server_used).to eq("127.0.0.1:#{port}")
50
47
  end
51
48
  end
52
49
 
@@ -54,40 +51,59 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
54
51
  Puppet[:server_list] = "puppet.example.com"
55
52
 
56
53
  expect {
57
- expect {
58
- expect {
59
- agent.command_line.args << '--test'
60
- agent.run
61
- }.to exit_with(1)
62
- }.to output(%r{Unable to connect to server from server_list setting: Could not select a functional puppet master from server_list: 'puppet.example.com'}).to_stdout
63
- }.to output(/Error: Could not run Puppet configuration client: Could not select a functional puppet master from server_list: 'puppet.example.com'/).to_stderr
54
+ agent.command_line.args << '--test'
55
+ agent.run
56
+ }.to exit_with(1)
57
+ .and output(a_string_matching(%r{Unable to connect to server from server_list setting})
58
+ .and matching(/Error: Could not run Puppet configuration client: Could not select a functional puppet server from server_list: 'puppet.example.com'/)).to_stderr
64
59
 
65
60
  # I'd expect puppet to update the last run report even if the server_list was
66
61
  # exhausted, but it doesn't work that way currently, see PUP-6708
67
62
  expect(File).to_not be_exist(Puppet[:lastrunreport])
68
63
  end
69
64
 
70
- it "omits master_used when not using server_list" do
65
+ it "omits server_used when not using server_list" do
66
+ Puppet[:log_level] = 'debug'
67
+
71
68
  server.start_server do |port|
72
- Puppet[:masterport] = port
69
+ Puppet[:serverport] = port
73
70
  expect {
74
- expect {
75
- agent.command_line.args << '--test'
76
- agent.run
77
- }.to exit_with(0)
78
- }.to output(%r{Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
71
+ agent.command_line.args << '--test'
72
+ agent.run
73
+ }.to exit_with(0)
74
+ .and output(%r{Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
79
75
  end
80
76
 
81
77
  report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
82
78
  expect(report.master_used).to be_nil
79
+ expect(report.server_used).to be_nil
80
+ end
81
+
82
+ it "server_list takes precedence over server" do
83
+ Puppet[:server] = 'notvalid.example.com'
84
+ Puppet[:log_level] = 'debug'
85
+
86
+ server.start_server do |port|
87
+ Puppet[:server_list] = "127.0.0.1:#{port}"
88
+
89
+ expect {
90
+ agent.command_line.args << '--test'
91
+ agent.run
92
+ }.to exit_with(0)
93
+ .and output(%r{Debug: Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
94
+
95
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
96
+ expect(report.master_used).to eq("127.0.0.1:#{port}")
97
+ expect(report.server_used).to eq("127.0.0.1:#{port}")
98
+ end
83
99
  end
84
100
  end
85
101
 
86
102
  context 'rich data' do
87
- it "applies deferred values" do
103
+ it "calls a deferred 4x function" do
88
104
  catalog_handler = -> (req, res) {
89
105
  catalog = compile_to_catalog(<<-MANIFEST, node)
90
- notify { 'deferred':
106
+ notify { 'deferred4x':
91
107
  message => Deferred('join', [[1,2,3], ':'])
92
108
  }
93
109
  MANIFEST
@@ -97,13 +113,71 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
97
113
  }
98
114
 
99
115
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
100
- Puppet[:masterport] = port
116
+ Puppet[:serverport] = port
101
117
  expect {
102
- expect {
103
- agent.command_line.args << '--test'
104
- agent.run
105
- }.to exit_with(2)
106
- }.to output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred\]/message: defined 'message' as '1:2:3'}).to_stdout
118
+ agent.command_line.args << '--test'
119
+ agent.run
120
+ }.to exit_with(2)
121
+ .and output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred4x\]/message: defined 'message' as '1:2:3'}).to_stdout
122
+ end
123
+ end
124
+
125
+ it "calls a deferred 3x function" do
126
+ catalog_handler = -> (req, res) {
127
+ catalog = compile_to_catalog(<<-MANIFEST, node)
128
+ notify { 'deferred3x':
129
+ message => Deferred('sprintf', ['%s', 'I am deferred'])
130
+ }
131
+ MANIFEST
132
+
133
+ res.body = formatter.render(catalog)
134
+ res['Content-Type'] = formatter.mime
135
+ }
136
+
137
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
138
+ Puppet[:serverport] = port
139
+ expect {
140
+ agent.command_line.args << '--test'
141
+ agent.run
142
+ }.to exit_with(2)
143
+ .and output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred3x\]/message: defined 'message' as 'I am deferred'}).to_stdout
144
+ end
145
+ end
146
+
147
+ it "re-evaluates a deferred function in a cached catalog" do
148
+ Puppet[:report] = false
149
+ Puppet[:use_cached_catalog] = true
150
+ Puppet[:usecacheonfailure] = false
151
+
152
+ catalog_dir = File.join(Puppet[:client_datadir], 'catalog')
153
+ Puppet::FileSystem.mkpath(catalog_dir)
154
+ cached_catalog_path = "#{File.join(catalog_dir, Puppet[:certname])}.json"
155
+
156
+ # our catalog contains a deferred function that calls `binary_file`
157
+ # to read `source`. The function returns a Binary object, whose
158
+ # base64 value is printed to stdout
159
+ source = tmpfile('deferred_source')
160
+ catalog = File.read(my_fixture('cached_deferred_catalog.json'))
161
+ catalog.gsub!('__SOURCE_PATH__', source)
162
+ File.write(cached_catalog_path, catalog)
163
+
164
+ # verify we get a different result each time the deferred function
165
+ # is evaluated, and reads `source`.
166
+ {
167
+ '1234' => 'MTIzNA==',
168
+ '5678' => 'NTY3OA=='
169
+ }.each_pair do |content, base64|
170
+ File.write(source, content)
171
+
172
+ expect {
173
+ agent.command_line.args << '-t'
174
+ agent.run
175
+
176
+ }.to exit_with(2)
177
+ .and output(/Notice: #{base64}/).to_stdout
178
+
179
+ # reset state so we can run again
180
+ Puppet::Application.clear!
107
181
  end
108
182
  end
109
183
 
@@ -120,19 +194,40 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
120
194
  }
121
195
 
122
196
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
123
- Puppet[:masterport] = port
197
+ Puppet[:serverport] = port
124
198
  expect {
125
- expect {
126
- agent.command_line.args << '--test'
127
- agent.run
128
- }.to exit_with(2)
129
- }.to output(a_string_matching(
199
+ agent.command_line.args << '--test'
200
+ agent.run
201
+ }.to exit_with(2)
202
+ .and output(a_string_matching(
130
203
  /Notice: Sensitive \[value redacted\]/
131
204
  ).and matching(
132
205
  /Notify\[sensitive\]\/message: changed \[redacted\] to \[redacted\]/
133
206
  )).to_stdout
134
207
  end
135
208
  end
209
+
210
+ it "applies binary data in a cached catalog" do
211
+ catalog = compile_to_catalog(<<-MANIFEST, node)
212
+ notify { 'some title':
213
+ message => Binary.new('aGk=')
214
+ }
215
+ MANIFEST
216
+
217
+ catalog_dir = File.join(Puppet[:client_datadir], 'catalog')
218
+ Puppet::FileSystem.mkpath(catalog_dir)
219
+ cached_catalog = "#{File.join(catalog_dir, Puppet[:certname])}.json"
220
+ File.write(cached_catalog, catalog.render(:rich_data_json))
221
+
222
+ expect {
223
+ Puppet[:report] = false
224
+ Puppet[:use_cached_catalog] = true
225
+ Puppet[:usecacheonfailure] = false
226
+ agent.command_line.args << '-t'
227
+ agent.run
228
+ }.to exit_with(2)
229
+ .and output(%r{defined 'message' as 'hi'}).to_stdout
230
+ end
136
231
  end
137
232
 
138
233
  context 'static catalogs' do
@@ -163,7 +258,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
163
258
  }
164
259
 
165
260
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
166
- Puppet[:masterport] = port
261
+ Puppet[:serverport] = port
167
262
  expect {
168
263
  expect {
169
264
  agent.command_line.args << '--test'
@@ -208,13 +303,12 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
208
303
  }
209
304
 
210
305
  server.start_server(mounts: mounts) do |port|
211
- Puppet[:masterport] = port
306
+ Puppet[:serverport] = port
212
307
  expect {
213
- expect {
214
- agent.command_line.args << '--test'
215
- agent.run
216
- }.to exit_with(2)
217
- }.to output(/content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}4cf49285ae567157ebfba72bd04ccf32'/).to_stdout
308
+ agent.command_line.args << '--test'
309
+ agent.run
310
+ }.to exit_with(2)
311
+ .and output(/content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}4cf49285ae567157ebfba72bd04ccf32'/).to_stdout
218
312
 
219
313
  # verify puppet restored binary content
220
314
  expect(File.binread(path)).to eq(binary_content)
@@ -257,7 +351,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
257
351
  }
258
352
 
259
353
  server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
260
- Puppet[:masterport] = puppetserver_port
354
+ Puppet[:serverport] = puppetserver_port
261
355
 
262
356
  # override path to system cacert bundle, this must be done before
263
357
  # the SSLContext is created and the call to X509::Store.set_default_paths
@@ -309,7 +403,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
309
403
  }
310
404
 
311
405
  server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
312
- Puppet[:masterport] = puppetserver_port
406
+ Puppet[:serverport] = puppetserver_port
313
407
 
314
408
  # override path to system cacert bundle, this must be done before
315
409
  # the SSLContext is created and the call to X509::Store.set_default_paths
@@ -325,6 +419,56 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
325
419
  end
326
420
  end
327
421
  end
422
+
423
+ it 'accepts HTTPS servers whose cert is in the external CA store' do
424
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
425
+ https = PuppetSpec::HTTPSServer.new(
426
+ ca_cert: unknown_ca_cert,
427
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
428
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
429
+ )
430
+
431
+ # create a temp cacert bundle
432
+ ssl_file = tmpfile('systemstore')
433
+ File.write(ssl_file, unknown_ca_cert.to_pem)
434
+
435
+ response_proc = -> (req, res) {
436
+ res.status = 200
437
+ res.body = response_body
438
+ }
439
+
440
+ https.start_server(response_proc: response_proc) do |https_port|
441
+ catalog_handler = -> (req, res) {
442
+ catalog = compile_to_catalog(<<-MANIFEST, node)
443
+ file { "#{path}":
444
+ ensure => file,
445
+ backup => false,
446
+ checksum => sha1,
447
+ checksum_value => '#{digest}',
448
+ source => "https://127.0.0.1:#{https_port}/path/to/file"
449
+ }
450
+ MANIFEST
451
+
452
+ res.body = formatter.render(catalog)
453
+ res['Content-Type'] = formatter.mime
454
+ }
455
+
456
+ server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
457
+ Puppet[:serverport] = puppetserver_port
458
+
459
+ # set path to external cacert bundle, this must be done before
460
+ # the SSLContext is created
461
+ Puppet[:ssl_trust_store] = ssl_file
462
+ expect {
463
+ agent.command_line.args << '--test'
464
+ agent.run
465
+ }.to exit_with(2)
466
+ .and output(%r{https_file_source.*/ensure: created}).to_stdout
467
+ end
468
+
469
+ expect(File.binread(path)).to eq("from https server")
470
+ end
471
+ end
328
472
  end
329
473
 
330
474
  context 'multiple agents running' do
@@ -350,7 +494,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
350
494
  it "waits for other agent run to finish before starting" do
351
495
  server.start_server do |port|
352
496
  path = Puppet[:agent_catalog_run_lockfile]
353
- Puppet[:masterport] = port
497
+ Puppet[:serverport] = port
354
498
  Puppet[:waitforlock] = 1
355
499
 
356
500
  th = Thread.new {
@@ -391,4 +535,69 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
391
535
  th.kill # kill thread so we don't wait too much
392
536
  end
393
537
  end
538
+
539
+ context 'cached catalogs' do
540
+ it 'falls back to a cached catalog' do
541
+ catalog_handler = -> (req, res) {
542
+ catalog = compile_to_catalog(<<-MANIFEST, node)
543
+ notify { 'a message': }
544
+ MANIFEST
545
+
546
+ res.body = formatter.render(catalog)
547
+ res['Content-Type'] = formatter.mime
548
+ }
549
+
550
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
551
+ Puppet[:serverport] = port
552
+ expect {
553
+ agent.command_line.args << '--test'
554
+ agent.run
555
+ }.to exit_with(2)
556
+ .and output(%r{Caching catalog for #{Puppet[:certname]}}).to_stdout
557
+ end
558
+
559
+ # reset state so we can run again
560
+ Puppet::Application.clear!
561
+
562
+ # --test above turns off `usecacheonfailure` so re-enable here
563
+ Puppet[:usecacheonfailure] = true
564
+
565
+ # run agent without server
566
+ expect {
567
+ agent.command_line.args << '--no-daemonize' << '--onetime' << '--server' << '127.0.0.1'
568
+ agent.run
569
+ }.to exit_with(2)
570
+ .and output(a_string_matching(
571
+ /Using cached catalog from environment 'production'/
572
+ ).and matching(
573
+ /Notify\[a message\]\/message:/
574
+ )).to_stdout
575
+ .and output(/the agent run will continue/).to_stderr
576
+ end
577
+
578
+ it 'preserves the old cached catalog if validation fails with the old one' do
579
+ catalog_handler = -> (req, res) {
580
+ catalog = compile_to_catalog(<<-MANIFEST, node)
581
+ exec { 'unqualified_command': }
582
+ MANIFEST
583
+
584
+ res.body = formatter.render(catalog)
585
+ res['Content-Type'] = formatter.mime
586
+ }
587
+
588
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
589
+ Puppet[:serverport] = port
590
+ expect {
591
+ agent.command_line.args << '--test'
592
+ agent.run
593
+ }.to exit_with(1)
594
+ .and output(/Using configured environment/).to_stdout
595
+ .and output(%r{Validation of Exec\[unqualified_command\] failed: 'unqualified_command' is not qualified and no path was specified}).to_stderr
596
+ end
597
+
598
+ # cached catalog should not be updated
599
+ cached_catalog = "#{File.join(Puppet[:client_datadir], 'catalog', Puppet[:certname])}.json"
600
+ expect(File).to_not be_exist(cached_catalog)
601
+ end
602
+ end
394
603
  end