puppet 6.17.0-x86-mingw32 → 6.21.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 (401) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +38 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +20 -21
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +1 -1
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/defaults.rb +88 -38
  22. data/lib/puppet/environments.rb +84 -59
  23. data/lib/puppet/face/catalog.rb +1 -1
  24. data/lib/puppet/face/config.rb +56 -16
  25. data/lib/puppet/face/epp.rb +12 -2
  26. data/lib/puppet/face/facts.rb +60 -0
  27. data/lib/puppet/face/node.rb +3 -3
  28. data/lib/puppet/face/node/clean.rb +2 -2
  29. data/lib/puppet/face/status.rb +1 -1
  30. data/lib/puppet/feature/base.rb +1 -1
  31. data/lib/puppet/ffi/posix.rb +10 -0
  32. data/lib/puppet/ffi/posix/constants.rb +14 -0
  33. data/lib/puppet/ffi/posix/functions.rb +24 -0
  34. data/lib/puppet/file_bucket/dipper.rb +1 -1
  35. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  36. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  37. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  38. data/lib/puppet/file_system/file_impl.rb +3 -3
  39. data/lib/puppet/functions/epp.rb +1 -0
  40. data/lib/puppet/functions/inline_epp.rb +1 -0
  41. data/lib/puppet/functions/lstrip.rb +4 -4
  42. data/lib/puppet/functions/new.rb +8 -3
  43. data/lib/puppet/functions/reverse_each.rb +1 -1
  44. data/lib/puppet/functions/rstrip.rb +4 -4
  45. data/lib/puppet/functions/step.rb +1 -1
  46. data/lib/puppet/functions/strip.rb +4 -4
  47. data/lib/puppet/gettext/config.rb +5 -5
  48. data/lib/puppet/gettext/module_translations.rb +4 -4
  49. data/lib/puppet/http.rb +1 -0
  50. data/lib/puppet/http/client.rb +1 -1
  51. data/lib/puppet/http/resolver.rb +5 -8
  52. data/lib/puppet/http/resolver/server_list.rb +18 -36
  53. data/lib/puppet/http/resolver/settings.rb +4 -4
  54. data/lib/puppet/http/resolver/srv.rb +5 -5
  55. data/lib/puppet/http/service.rb +3 -1
  56. data/lib/puppet/http/service/compiler.rb +1 -1
  57. data/lib/puppet/http/service/file_server.rb +1 -1
  58. data/lib/puppet/http/service/puppetserver.rb +39 -0
  59. data/lib/puppet/http/session.rb +5 -4
  60. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  61. data/lib/puppet/indirector/exec.rb +1 -1
  62. data/lib/puppet/indirector/fact_search.rb +60 -0
  63. data/lib/puppet/indirector/facts/facter.rb +3 -3
  64. data/lib/puppet/indirector/facts/json.rb +27 -0
  65. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  66. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  67. data/lib/puppet/indirector/hiera.rb +4 -0
  68. data/lib/puppet/indirector/indirection.rb +1 -1
  69. data/lib/puppet/indirector/json.rb +5 -1
  70. data/lib/puppet/indirector/msgpack.rb +1 -1
  71. data/lib/puppet/indirector/node/json.rb +8 -0
  72. data/lib/puppet/indirector/report/json.rb +34 -0
  73. data/lib/puppet/indirector/report/processor.rb +2 -2
  74. data/lib/puppet/indirector/request.rb +4 -4
  75. data/lib/puppet/indirector/yaml.rb +1 -1
  76. data/lib/puppet/module.rb +1 -2
  77. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  78. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  79. data/lib/puppet/network/format_support.rb +2 -2
  80. data/lib/puppet/network/formats.rb +2 -1
  81. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  82. data/lib/puppet/network/http/route.rb +2 -2
  83. data/lib/puppet/node/environment.rb +12 -5
  84. data/lib/puppet/node/facts.rb +17 -0
  85. data/lib/puppet/pal/pal_impl.rb +90 -13
  86. data/lib/puppet/parameter.rb +1 -1
  87. data/lib/puppet/parser/ast/leaf.rb +3 -2
  88. data/lib/puppet/parser/functions.rb +21 -17
  89. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  90. data/lib/puppet/parser/templatewrapper.rb +1 -1
  91. data/lib/puppet/parser/type_loader.rb +2 -2
  92. data/lib/puppet/pops/adaptable.rb +7 -13
  93. data/lib/puppet/pops/adapters.rb +8 -4
  94. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  95. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  96. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  97. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  98. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  99. data/lib/puppet/pops/loaders.rb +18 -11
  100. data/lib/puppet/pops/lookup/context.rb +1 -1
  101. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  102. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  103. data/lib/puppet/pops/types/iterable.rb +34 -8
  104. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  105. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  106. data/lib/puppet/pops/validation/checker4_0.rb +19 -15
  107. data/lib/puppet/property/list.rb +1 -1
  108. data/lib/puppet/provider/file/windows.rb +1 -1
  109. data/lib/puppet/provider/group/groupadd.rb +13 -8
  110. data/lib/puppet/provider/package/apt.rb +67 -1
  111. data/lib/puppet/provider/package/aptitude.rb +6 -0
  112. data/lib/puppet/provider/package/dpkg.rb +1 -1
  113. data/lib/puppet/provider/package/gem.rb +4 -2
  114. data/lib/puppet/provider/package/pip2.rb +17 -0
  115. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  116. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  117. data/lib/puppet/provider/package/yum.rb +1 -0
  118. data/lib/puppet/provider/package/zypper.rb +3 -0
  119. data/lib/puppet/provider/service/debian.rb +2 -0
  120. data/lib/puppet/provider/user/aix.rb +3 -3
  121. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  122. data/lib/puppet/provider/user/useradd.rb +55 -8
  123. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  124. data/lib/puppet/reference/configuration.rb +6 -5
  125. data/lib/puppet/resource/type.rb +2 -1
  126. data/lib/puppet/rest/route.rb +2 -2
  127. data/lib/puppet/settings.rb +63 -21
  128. data/lib/puppet/settings/alias_setting.rb +37 -0
  129. data/lib/puppet/settings/base_setting.rb +26 -2
  130. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  131. data/lib/puppet/test/test_helper.rb +10 -3
  132. data/lib/puppet/transaction.rb +2 -2
  133. data/lib/puppet/transaction/persistence.rb +1 -1
  134. data/lib/puppet/transaction/report.rb +12 -8
  135. data/lib/puppet/trusted_external.rb +2 -2
  136. data/lib/puppet/type.rb +4 -3
  137. data/lib/puppet/type/file.rb +2 -2
  138. data/lib/puppet/type/file/source.rb +28 -8
  139. data/lib/puppet/type/filebucket.rb +1 -1
  140. data/lib/puppet/type/notify.rb +2 -2
  141. data/lib/puppet/type/package.rb +3 -3
  142. data/lib/puppet/type/service.rb +4 -0
  143. data/lib/puppet/type/user.rb +18 -3
  144. data/lib/puppet/util.rb +26 -12
  145. data/lib/puppet/util/autoload.rb +10 -15
  146. data/lib/puppet/util/character_encoding.rb +9 -5
  147. data/lib/puppet/util/connection.rb +8 -8
  148. data/lib/puppet/util/execution.rb +2 -2
  149. data/lib/puppet/util/fact_dif.rb +62 -0
  150. data/lib/puppet/util/posix.rb +54 -5
  151. data/lib/puppet/util/rubygems.rb +5 -1
  152. data/lib/puppet/util/run_mode.rb +5 -1
  153. data/lib/puppet/util/windows.rb +1 -0
  154. data/lib/puppet/util/windows/api_types.rb +15 -1
  155. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  156. data/lib/puppet/util/windows/security.rb +4 -4
  157. data/lib/puppet/util/windows/service.rb +1 -1
  158. data/lib/puppet/util/windows/user.rb +219 -0
  159. data/lib/puppet/version.rb +1 -1
  160. data/locales/puppet.pot +342 -312
  161. data/man/man5/puppet.conf.5 +53 -18
  162. data/man/man8/puppet-agent.8 +7 -4
  163. data/man/man8/puppet-apply.8 +2 -2
  164. data/man/man8/puppet-catalog.8 +1 -1
  165. data/man/man8/puppet-config.8 +6 -6
  166. data/man/man8/puppet-describe.8 +1 -1
  167. data/man/man8/puppet-device.8 +2 -2
  168. data/man/man8/puppet-doc.8 +1 -1
  169. data/man/man8/puppet-epp.8 +1 -1
  170. data/man/man8/puppet-facts.8 +32 -1
  171. data/man/man8/puppet-filebucket.8 +3 -3
  172. data/man/man8/puppet-generate.8 +1 -1
  173. data/man/man8/puppet-help.8 +1 -1
  174. data/man/man8/puppet-key.8 +1 -1
  175. data/man/man8/puppet-lookup.8 +2 -2
  176. data/man/man8/puppet-man.8 +1 -1
  177. data/man/man8/puppet-module.8 +1 -1
  178. data/man/man8/puppet-node.8 +7 -4
  179. data/man/man8/puppet-parser.8 +1 -1
  180. data/man/man8/puppet-plugin.8 +1 -1
  181. data/man/man8/puppet-report.8 +4 -1
  182. data/man/man8/puppet-resource.8 +1 -1
  183. data/man/man8/puppet-script.8 +2 -2
  184. data/man/man8/puppet-ssl.8 +1 -1
  185. data/man/man8/puppet-status.8 +2 -2
  186. data/man/man8/puppet.8 +2 -2
  187. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  188. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  189. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  190. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  191. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  192. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  193. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  194. data/spec/integration/application/agent_spec.rb +208 -55
  195. data/spec/integration/application/apply_spec.rb +168 -149
  196. data/spec/integration/application/doc_spec.rb +16 -6
  197. data/spec/integration/application/filebucket_spec.rb +70 -21
  198. data/spec/integration/application/help_spec.rb +42 -0
  199. data/spec/integration/application/lookup_spec.rb +13 -0
  200. data/spec/integration/application/module_spec.rb +68 -0
  201. data/spec/integration/application/plugin_spec.rb +53 -3
  202. data/spec/integration/configurer_spec.rb +14 -0
  203. data/spec/integration/data_binding_spec.rb +82 -0
  204. data/spec/integration/defaults_spec.rb +19 -1
  205. data/spec/integration/directory_environments_spec.rb +17 -17
  206. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  207. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  208. data/spec/integration/node/environment_spec.rb +1 -1
  209. data/spec/integration/resource/type_collection_spec.rb +2 -6
  210. data/spec/integration/transaction_spec.rb +4 -9
  211. data/spec/integration/util/execution_spec.rb +22 -0
  212. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  213. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  214. data/spec/integration/util/windows/process_spec.rb +26 -32
  215. data/spec/integration/util/windows/registry_spec.rb +0 -10
  216. data/spec/integration/util/windows/user_spec.rb +7 -0
  217. data/spec/integration/util_spec.rb +7 -33
  218. data/spec/lib/puppet_spec/matchers.rb +0 -80
  219. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  220. data/spec/lib/puppet_spec/settings.rb +6 -1
  221. data/spec/shared_contexts/types_setup.rb +2 -0
  222. data/spec/spec_helper.rb +1 -4
  223. data/spec/unit/agent_spec.rb +8 -6
  224. data/spec/unit/application/agent_spec.rb +3 -5
  225. data/spec/unit/application/config_spec.rb +224 -4
  226. data/spec/unit/application/doc_spec.rb +2 -2
  227. data/spec/unit/application/face_base_spec.rb +6 -4
  228. data/spec/unit/application/facts_spec.rb +41 -10
  229. data/spec/unit/application/filebucket_spec.rb +0 -2
  230. data/spec/unit/application/man_spec.rb +52 -0
  231. data/spec/unit/application/resource_spec.rb +3 -1
  232. data/spec/unit/application/ssl_spec.rb +15 -2
  233. data/spec/unit/application_spec.rb +60 -13
  234. data/spec/unit/configurer/downloader_spec.rb +10 -0
  235. data/spec/unit/configurer_spec.rb +86 -37
  236. data/spec/unit/confine/feature_spec.rb +1 -1
  237. data/spec/unit/confine_spec.rb +10 -3
  238. data/spec/unit/defaults_spec.rb +20 -1
  239. data/spec/unit/environments_spec.rb +176 -32
  240. data/spec/unit/face/config_spec.rb +65 -12
  241. data/spec/unit/face/node_spec.rb +2 -13
  242. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  243. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  244. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  245. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  246. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  247. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  248. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  249. data/spec/unit/file_system_spec.rb +1 -2
  250. data/spec/unit/forge/module_release_spec.rb +2 -7
  251. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  252. data/spec/unit/http/client_spec.rb +0 -1
  253. data/spec/unit/http/resolver_spec.rb +24 -5
  254. data/spec/unit/http/service/ca_spec.rb +2 -3
  255. data/spec/unit/http/service/compiler_spec.rb +51 -3
  256. data/spec/unit/http/service/file_server_spec.rb +2 -3
  257. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  258. data/spec/unit/http/service/report_spec.rb +2 -3
  259. data/spec/unit/http/service_spec.rb +1 -2
  260. data/spec/unit/http/session_spec.rb +8 -21
  261. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  262. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  263. data/spec/unit/indirector/face_spec.rb +0 -1
  264. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  265. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  266. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  267. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  268. data/spec/unit/indirector/indirection_spec.rb +8 -12
  269. data/spec/unit/indirector/json_spec.rb +8 -8
  270. data/spec/unit/indirector/key/file_spec.rb +0 -1
  271. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  272. data/spec/unit/indirector/node/json_spec.rb +33 -0
  273. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  274. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  275. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  276. data/spec/unit/indirector/request_spec.rb +4 -4
  277. data/spec/unit/indirector/rest_spec.rb +1 -1
  278. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  279. data/spec/unit/indirector/yaml_spec.rb +7 -7
  280. data/spec/unit/indirector_spec.rb +2 -2
  281. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  282. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  283. data/spec/unit/network/authconfig_spec.rb +0 -3
  284. data/spec/unit/network/format_support_spec.rb +3 -2
  285. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  286. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  287. data/spec/unit/network/http/handler_spec.rb +0 -5
  288. data/spec/unit/node/environment_spec.rb +18 -1
  289. data/spec/unit/parser/compiler_spec.rb +3 -19
  290. data/spec/unit/parser/resource_spec.rb +14 -8
  291. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  292. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  293. data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
  294. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  295. data/spec/unit/property_spec.rb +1 -0
  296. data/spec/unit/provider/exec_spec.rb +4 -3
  297. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  298. data/spec/unit/provider/nameservice_spec.rb +66 -65
  299. data/spec/unit/provider/package/apt_spec.rb +85 -3
  300. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  301. data/spec/unit/provider/package/base_spec.rb +6 -5
  302. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  303. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  304. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  305. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  306. data/spec/unit/provider/package/pip_spec.rb +6 -11
  307. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  308. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  309. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  310. data/spec/unit/provider/package/yum_spec.rb +31 -0
  311. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  312. data/spec/unit/provider/service/base_spec.rb +2 -4
  313. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  314. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  315. data/spec/unit/provider/service/debian_spec.rb +3 -5
  316. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  317. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  318. data/spec/unit/provider/service/init_spec.rb +45 -5
  319. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  320. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  321. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  322. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  323. data/spec/unit/provider/service/runit_spec.rb +2 -1
  324. data/spec/unit/provider/service/smf_spec.rb +1 -1
  325. data/spec/unit/provider/service/src_spec.rb +3 -5
  326. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  327. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  328. data/spec/unit/provider/service/windows_spec.rb +28 -0
  329. data/spec/unit/provider/user/aix_spec.rb +5 -0
  330. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  331. data/spec/unit/provider/user/pw_spec.rb +2 -0
  332. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  333. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  334. data/spec/unit/provider_spec.rb +8 -10
  335. data/spec/unit/puppet_pal_2pec.rb +40 -0
  336. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  337. data/spec/unit/reports/store_spec.rb +17 -13
  338. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  339. data/spec/unit/resource/type_spec.rb +1 -1
  340. data/spec/unit/resource_spec.rb +11 -10
  341. data/spec/unit/rest/route_spec.rb +4 -4
  342. data/spec/unit/settings_spec.rb +576 -239
  343. data/spec/unit/ssl/base_spec.rb +0 -1
  344. data/spec/unit/ssl/host_spec.rb +0 -5
  345. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  346. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  347. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  348. data/spec/unit/transaction/persistence_spec.rb +15 -0
  349. data/spec/unit/transaction/report_spec.rb +2 -0
  350. data/spec/unit/transaction_spec.rb +13 -4
  351. data/spec/unit/type/file/content_spec.rb +0 -1
  352. data/spec/unit/type/file/selinux_spec.rb +0 -2
  353. data/spec/unit/type/file/source_spec.rb +1 -1
  354. data/spec/unit/type/file_spec.rb +0 -6
  355. data/spec/unit/type/filebucket_spec.rb +1 -1
  356. data/spec/unit/type/group_spec.rb +13 -6
  357. data/spec/unit/type/resources_spec.rb +7 -7
  358. data/spec/unit/type/service_spec.rb +36 -3
  359. data/spec/unit/type/tidy_spec.rb +0 -1
  360. data/spec/unit/type/user_spec.rb +31 -2
  361. data/spec/unit/type_spec.rb +2 -2
  362. data/spec/unit/util/at_fork_spec.rb +2 -2
  363. data/spec/unit/util/autoload_spec.rb +5 -1
  364. data/spec/unit/util/backups_spec.rb +1 -2
  365. data/spec/unit/util/character_encoding_spec.rb +4 -4
  366. data/spec/unit/util/command_line_spec.rb +11 -6
  367. data/spec/unit/util/execution_spec.rb +15 -11
  368. data/spec/unit/util/inifile_spec.rb +6 -14
  369. data/spec/unit/util/log_spec.rb +8 -7
  370. data/spec/unit/util/logging_spec.rb +3 -3
  371. data/spec/unit/util/posix_spec.rb +363 -15
  372. data/spec/unit/util/rubygems_spec.rb +2 -2
  373. data/spec/unit/util/run_mode_spec.rb +6 -6
  374. data/spec/unit/util/selinux_spec.rb +76 -52
  375. data/spec/unit/util/storage_spec.rb +3 -1
  376. data/spec/unit/util/suidmanager_spec.rb +44 -41
  377. data/spec/unit/util_spec.rb +13 -6
  378. metadata +49 -50
  379. data/spec/integration/faces/config_spec.rb +0 -91
  380. data/spec/integration/faces/documentation_spec.rb +0 -57
  381. data/spec/integration/file_bucket/file_spec.rb +0 -50
  382. data/spec/integration/file_serving/content_spec.rb +0 -7
  383. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  384. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  385. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  386. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  387. data/spec/integration/module_tool/forge_spec.rb +0 -51
  388. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  389. data/spec/integration/provider/service/init_spec.rb +0 -48
  390. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  391. data/spec/integration/provider/service/windows_spec.rb +0 -50
  392. data/spec/integration/reference/providers_spec.rb +0 -21
  393. data/spec/integration/reports_spec.rb +0 -13
  394. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  395. data/spec/integration/ssl/host_spec.rb +0 -72
  396. data/spec/integration/ssl/key_spec.rb +0 -99
  397. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  398. data/spec/unit/face/catalog_spec.rb +0 -6
  399. data/spec/unit/face/man_spec.rb +0 -25
  400. data/spec/unit/face/module_spec.rb +0 -3
  401. 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,36 +51,37 @@ 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
83
80
  end
84
81
 
85
82
  it "server_list takes precedence over server" do
86
83
  Puppet[:server] = 'notvalid.example.com'
84
+ Puppet[:log_level] = 'debug'
87
85
 
88
86
  server.start_server do |port|
89
87
  Puppet[:server_list] = "127.0.0.1:#{port}"
@@ -96,15 +94,16 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
96
94
 
97
95
  report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
98
96
  expect(report.master_used).to eq("127.0.0.1:#{port}")
97
+ expect(report.server_used).to eq("127.0.0.1:#{port}")
99
98
  end
100
99
  end
101
100
  end
102
101
 
103
102
  context 'rich data' do
104
- it "applies deferred values" do
103
+ it "calls a deferred 4x function" do
105
104
  catalog_handler = -> (req, res) {
106
105
  catalog = compile_to_catalog(<<-MANIFEST, node)
107
- notify { 'deferred':
106
+ notify { 'deferred4x':
108
107
  message => Deferred('join', [[1,2,3], ':'])
109
108
  }
110
109
  MANIFEST
@@ -114,13 +113,71 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
114
113
  }
115
114
 
116
115
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
117
- Puppet[:masterport] = port
116
+ Puppet[:serverport] = port
118
117
  expect {
119
- expect {
120
- agent.command_line.args << '--test'
121
- agent.run
122
- }.to exit_with(2)
123
- }.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!
124
181
  end
125
182
  end
126
183
 
@@ -137,13 +194,12 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
137
194
  }
138
195
 
139
196
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
140
- Puppet[:masterport] = port
197
+ Puppet[:serverport] = port
141
198
  expect {
142
- expect {
143
- agent.command_line.args << '--test'
144
- agent.run
145
- }.to exit_with(2)
146
- }.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(
147
203
  /Notice: Sensitive \[value redacted\]/
148
204
  ).and matching(
149
205
  /Notify\[sensitive\]\/message: changed \[redacted\] to \[redacted\]/
@@ -202,7 +258,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
202
258
  }
203
259
 
204
260
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
205
- Puppet[:masterport] = port
261
+ Puppet[:serverport] = port
206
262
  expect {
207
263
  expect {
208
264
  agent.command_line.args << '--test'
@@ -247,13 +303,12 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
247
303
  }
248
304
 
249
305
  server.start_server(mounts: mounts) do |port|
250
- Puppet[:masterport] = port
306
+ Puppet[:serverport] = port
251
307
  expect {
252
- expect {
253
- agent.command_line.args << '--test'
254
- agent.run
255
- }.to exit_with(2)
256
- }.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
257
312
 
258
313
  # verify puppet restored binary content
259
314
  expect(File.binread(path)).to eq(binary_content)
@@ -296,7 +351,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
296
351
  }
297
352
 
298
353
  server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
299
- Puppet[:masterport] = puppetserver_port
354
+ Puppet[:serverport] = puppetserver_port
300
355
 
301
356
  # override path to system cacert bundle, this must be done before
302
357
  # the SSLContext is created and the call to X509::Store.set_default_paths
@@ -348,7 +403,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
348
403
  }
349
404
 
350
405
  server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
351
- Puppet[:masterport] = puppetserver_port
406
+ Puppet[:serverport] = puppetserver_port
352
407
 
353
408
  # override path to system cacert bundle, this must be done before
354
409
  # the SSLContext is created and the call to X509::Store.set_default_paths
@@ -399,7 +454,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
399
454
  }
400
455
 
401
456
  server.start_server(mounts: {catalog: catalog_handler}) do |puppetserver_port|
402
- Puppet[:masterport] = puppetserver_port
457
+ Puppet[:serverport] = puppetserver_port
403
458
 
404
459
  # set path to external cacert bundle, this must be done before
405
460
  # the SSLContext is created
@@ -439,7 +494,7 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
439
494
  it "waits for other agent run to finish before starting" do
440
495
  server.start_server do |port|
441
496
  path = Puppet[:agent_catalog_run_lockfile]
442
- Puppet[:masterport] = port
497
+ Puppet[:serverport] = port
443
498
  Puppet[:waitforlock] = 1
444
499
 
445
500
  th = Thread.new {
@@ -480,4 +535,102 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
480
535
  th.kill # kill thread so we don't wait too much
481
536
  end
482
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
603
+
604
+ context "reporting" do
605
+ it "stores a finalized report" do
606
+ catalog_handler = -> (req, res) {
607
+ catalog = compile_to_catalog(<<-MANIFEST, node)
608
+ notify { 'foo':
609
+ require => Notify['bar']
610
+ }
611
+
612
+ notify { 'bar':
613
+ require => Notify['foo']
614
+ }
615
+ MANIFEST
616
+
617
+ res.body = formatter.render(catalog)
618
+ res['Content-Type'] = formatter.mime
619
+ }
620
+
621
+ server.start_server(mounts: {catalog: catalog_handler}) do |port|
622
+ Puppet[:serverport] = port
623
+ expect {
624
+ agent.command_line.args << '--test'
625
+ agent.run
626
+ }.to exit_with(1)
627
+ .and output(%r{Applying configuration}).to_stdout
628
+ .and output(%r{Found 1 dependency cycle}).to_stderr
629
+
630
+ report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
631
+ expect(report.status).to eq("failed")
632
+ expect(report.metrics).to_not be_empty
633
+ end
634
+ end
635
+ end
483
636
  end
@@ -6,6 +6,8 @@ require 'puppet_spec/https'
6
6
  describe "apply", unless: Puppet::Util::Platform.jruby? do
7
7
  include PuppetSpec::Files
8
8
 
9
+ let(:apply) { Puppet::Application[:apply] }
10
+
9
11
  before :each do
10
12
  Puppet[:reports] = "none"
11
13
  # Let exceptions be raised instead of exiting
@@ -19,76 +21,51 @@ describe "apply", unless: Puppet::Util::Platform.jruby? do
19
21
  resource = Puppet::Resource.new(:file, file_to_create, :parameters => {:content => "my stuff"})
20
22
  catalog.add_resource resource
21
23
 
22
- manifest = file_containing("manifest", catalog.to_json)
23
-
24
- puppet = Puppet::Application[:apply]
25
- puppet.options[:catalog] = manifest
26
-
27
- puppet.apply
24
+ apply.command_line.args = ['--catalog', file_containing("manifest", catalog.to_json)]
25
+ expect {
26
+ apply.run
27
+ }.to output(/ensure: defined content as/).to_stdout
28
28
 
29
29
  expect(Puppet::FileSystem.exist?(file_to_create)).to be_truthy
30
30
  expect(File.read(file_to_create)).to eq("my stuff")
31
31
  end
32
32
 
33
- context 'from environment with a pcore defined resource type' do
34
- include PuppetSpec::Compiler
35
-
36
- let!(:envdir) { tmpdir('environments') }
33
+ context 'and pcore types are available' do
34
+ let(:envdir) { my_fixture('environments') }
37
35
  let(:env_name) { 'spec' }
38
- let(:dir_structure) {
39
- {
40
- '.resource_types' => {
41
- 'applytest.pp' => <<-CODE
42
- Puppet::Resource::ResourceType3.new(
43
- 'applytest',
44
- [Puppet::Resource::Param.new(String, 'message')],
45
- [Puppet::Resource::Param.new(String, 'name', true)])
46
- CODE
47
- },
48
- 'modules' => {
49
- 'amod' => {
50
- 'lib' => {
51
- 'puppet' => {
52
- 'type' => { 'applytest.rb' => <<-CODE
53
- Puppet::Type.newtype(:applytest) do
54
- newproperty(:message) do
55
- def sync
56
- Puppet.send(@resource[:loglevel], self.should)
57
- end
58
36
 
59
- def retrieve
60
- :absent
61
- end
37
+ before(:each) do
38
+ Puppet[:environmentpath] = envdir
39
+ Puppet[:environment] = env_name
40
+ end
62
41
 
63
- def insync?(is)
64
- false
65
- end
42
+ it 'does not load the pcore type' do
43
+ apply = Puppet::Application[:apply]
44
+ apply.command_line.args = [ '-e', "Applytest { message => 'the default'} applytest { 'applytest was here': }" ]
66
45
 
67
- defaultto { @resource[:name] }
68
- end
46
+ expect {
47
+ apply.run
48
+ }.to exit_with(0)
49
+ .and output(a_string_matching(
50
+ /the Puppet::Type says hello/
51
+ ).and matching(
52
+ /applytest was here/
53
+ )).to_stdout
54
+ end
55
+ end
69
56
 
70
- newparam(:name) do
71
- desc "An arbitrary tag for your own reference; the name of the message."
72
- Puppet.notice('the Puppet::Type says hello')
73
- isnamevar
74
- end
75
- end
76
- CODE
77
- }
78
- }
79
- }
80
- }
81
- }
82
- }
83
- }
57
+ context 'from environment with a pcore defined resource type' do
58
+ include PuppetSpec::Compiler
84
59
 
60
+ let(:envdir) { my_fixture('environments') }
61
+ let(:env_name) { 'spec' }
85
62
  let(:environments) { Puppet::Environments::Directories.new(envdir, []) }
86
63
  let(:env) { Puppet::Node::Environment.create(:'spec', [File.join(envdir, 'spec', 'modules')]) }
87
64
  let(:node) { Puppet::Node.new('test', :environment => env) }
65
+
88
66
  around(:each) do |example|
89
67
  Puppet::Type.rmtype(:applytest)
90
68
  Puppet[:environment] = env_name
91
- dir_contained_in(envdir, env_name => dir_structure)
92
69
  Puppet.override(:environments => environments, :current_environment => env) do
93
70
  example.run
94
71
  end
@@ -96,12 +73,13 @@ end
96
73
 
97
74
  it 'does not load the pcore type' do
98
75
  catalog = compile_to_catalog('applytest { "applytest was here":}', node)
99
- apply = Puppet::Application[:apply]
100
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
76
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
101
77
 
102
78
  Puppet[:environmentpath] = envdir
103
79
  expect_any_instance_of(Puppet::Pops::Loader::Runtime3TypeLoader).not_to receive(:find)
104
- expect { apply.run }.to have_printed(/the Puppet::Type says hello.*applytest was here/m)
80
+ expect {
81
+ apply.run
82
+ }.to output(/the Puppet::Type says hello.*applytest was here/m).to_stdout
105
83
  end
106
84
 
107
85
  # Test just to verify that the Pcore Resource Type and not the Ruby one is produced when the catalog is produced
@@ -113,7 +91,9 @@ end
113
91
 
114
92
  expect(compiler.loaders.runtime3_type_loader.instance_variable_get(:@resource_3x_loader)).to receive(:set_entry).once.with(tn, rt, instance_of(String))
115
93
  .and_return(Puppet::Pops::Loader::Loader::NamedEntry.new(tn, rt, nil))
116
- expect { compiler.compile }.not_to have_printed(/the Puppet::Type says hello/)
94
+ expect {
95
+ compiler.compile
96
+ }.not_to output(/the Puppet::Type says hello/).to_stdout
117
97
  end
118
98
 
119
99
  it "does not fail when pcore type is loaded twice" do
@@ -226,36 +206,36 @@ end
226
206
  catalog = compile_to_catalog('include mod', node)
227
207
 
228
208
  Puppet[:environment] = env_name
229
- apply = Puppet::Application[:apply]
230
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
231
- expect { apply.run_command; exit(0) }.to exit_with(0)
232
- expect(@logs.map(&:to_s)).to include('The Street 23')
209
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
210
+
211
+ expect {
212
+ apply.run
213
+ }.to output(%r{Notify\[The Street 23\]/message: defined 'message' as 'The Street 23'}).to_stdout
233
214
  end
234
215
  end
235
216
 
236
- it "applies a given file even when a directory environment is specified" do
217
+ it "raises if the environment directory does not exist" do
237
218
  manifest = file_containing("manifest.pp", "notice('it was applied')")
219
+ apply.command_line.args = [manifest]
238
220
 
239
221
  special = Puppet::Node::Environment.create(:special, [])
240
222
  Puppet.override(:current_environment => special) do
241
223
  Puppet[:environment] = 'special'
242
- puppet = Puppet::Application[:apply]
243
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
244
- expect { puppet.run_command }.to exit_with(0)
224
+ expect {
225
+ apply.run
226
+ }.to raise_error(Puppet::Environments::EnvironmentNotFound,
227
+ /Could not find a directory environment named 'special' anywhere in the path/)
245
228
  end
246
-
247
- expect(@logs.map(&:to_s)).to include('it was applied')
248
229
  end
249
230
 
250
231
  it "adds environment to the $server_facts variable" do
251
232
  manifest = file_containing("manifest.pp", "notice(\"$server_facts\")")
233
+ apply.command_line.args = [manifest]
252
234
 
253
- puppet = Puppet::Application[:apply]
254
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
255
-
256
- expect { puppet.run_command }.to exit_with(0)
257
-
258
- expect(@logs.map(&:to_s)).to include(/{environment =>.*/)
235
+ expect {
236
+ apply.run
237
+ }.to exit_with(0)
238
+ .and output(/{environment => production}/).to_stdout
259
239
  end
260
240
 
261
241
  it "applies a given file even when an ENC is configured", :unless => Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
@@ -271,48 +251,36 @@ end
271
251
  Puppet[:environment] = 'special'
272
252
  Puppet[:node_terminus] = 'exec'
273
253
  Puppet[:external_nodes] = enc
274
- puppet = Puppet::Application[:apply]
275
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
276
- expect { puppet.run_command }.to exit_with(0)
254
+ apply.command_line.args = [manifest]
255
+ expect {
256
+ apply.run
257
+ }.to exit_with(0)
258
+ .and output(/Notice: Scope\(Class\[main\]\): specific manifest applied/).to_stdout
277
259
  end
278
-
279
- expect(@logs.map(&:to_s)).to include('specific manifest applied')
280
260
  end
281
261
 
282
262
  context "handles errors" do
283
263
  it "logs compile errors once" do
284
- Puppet.initialize_settings([])
285
- apply = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => []))
286
- apply.options[:code] = '08'
287
-
288
- msg = 'valid octal'
289
- callback = Proc.new do |actual|
290
- expect(actual.scan(Regexp.new(msg))).to eq([msg])
291
- end
292
-
293
- expect do
264
+ apply.command_line.args = ['-e', '08']
265
+ expect {
294
266
  apply.run
295
- end.to have_printed(callback).and_exit_with(1)
267
+ }.to exit_with(1)
268
+ .and output(/Not a valid octal number/).to_stderr
296
269
  end
297
270
 
298
271
  it "logs compile post processing errors once" do
299
- Puppet.initialize_settings([])
300
- apply = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => []))
301
272
  path = File.expand_path('/tmp/content_file_test.Q634Dlmtime')
302
- apply.options[:code] = "file { '#{path}':
273
+ apply.command_line.args = ['-e', "file { '#{path}':
303
274
  content => 'This is the test file content',
304
275
  ensure => present,
305
276
  checksum => mtime
306
- }"
307
-
308
- msg = 'You cannot specify content when using checksum'
309
- callback = Proc.new do |actual|
310
- expect(actual.scan(Regexp.new(msg))).to eq([msg])
311
- end
277
+ }"]
312
278
 
313
- expect do
279
+ expect {
314
280
  apply.run
315
- end.to have_printed(callback).and_exit_with(1)
281
+ }.to exit_with(1)
282
+ .and output(/Compiled catalog/).to_stdout
283
+ .and output(/You cannot specify content when using checksum/).to_stderr
316
284
  end
317
285
  end
318
286
 
@@ -337,51 +305,42 @@ end
337
305
  Puppet[:environmentpath] = envdir
338
306
  end
339
307
 
340
- def init_cli_args_and_apply_app(args, execute)
341
- Puppet.initialize_settings(args)
342
- puppet = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => args))
343
- puppet.options[:code] = execute
344
- return puppet
345
- end
308
+ context "given a modulepath" do
309
+ let(:args) { ['-e', execute] }
346
310
 
347
- context "given the --modulepath option" do
348
- let(:args) { ['-e', execute, '--modulepath', modulepath] }
311
+ before :each do
312
+ Puppet[:modulepath] = modulepath
349
313
 
350
- it "looks in --modulepath even when the default directory environment exists" do
351
- apply = init_cli_args_and_apply_app(args, execute)
314
+ apply.command_line.args = args
315
+ end
352
316
 
353
- expect do
354
- expect { apply.run }.to exit_with(0)
355
- end.to have_printed('amod class included')
317
+ it "looks in modulepath even when the default directory environment exists" do
318
+ expect {
319
+ apply.run
320
+ }.to exit_with(0)
321
+ .and output(/amod class included/).to_stdout
356
322
  end
357
323
 
358
- it "looks in --modulepath even when given a specific directory --environment" do
359
- args << '--environment' << 'production'
360
- apply = init_cli_args_and_apply_app(args, execute)
324
+ it "looks in modulepath even when given a specific directory --environment" do
325
+ apply.command_line.args = args << '--environment' << 'production'
361
326
 
362
- expect do
363
- expect { apply.run }.to exit_with(0)
364
- end.to have_printed('amod class included')
327
+ expect {
328
+ apply.run
329
+ }.to exit_with(0)
330
+ .and output(/amod class included/).to_stdout
365
331
  end
366
332
 
367
- it "looks in --modulepath when given multiple paths in --modulepath" do
368
- args = ['-e', execute, '--modulepath', [tmpdir('notmodulepath'), modulepath].join(File::PATH_SEPARATOR)]
369
- apply = init_cli_args_and_apply_app(args, execute)
333
+ it "looks in modulepath when given multiple paths in modulepath" do
334
+ Puppet[:modulepath] = [tmpdir('notmodulepath'), modulepath].join(File::PATH_SEPARATOR)
370
335
 
371
- expect do
372
- expect { apply.run }.to exit_with(0)
373
- end.to have_printed('amod class included')
336
+ expect {
337
+ apply.run
338
+ }.to exit_with(0)
339
+ .and output(/amod class included/).to_stdout
374
340
  end
375
341
  end
376
342
 
377
- # When executing an ENC script, output cannot be captured using
378
- # expect { }.to have_printed(...)
379
- # External node script execution will fail, likely due to the tampering
380
- # with the basic file descriptors.
381
- # Workaround: Define a log destination and merely inspect logs.
382
343
  context "with an ENC" do
383
- let(:logdest) { tmpfile('logdest') }
384
- let(:args) { ['-e', execute, '--logdest', logdest ] }
385
344
  let(:enc) do
386
345
  script_containing('enc_script',
387
346
  :windows => '@echo environment: spec',
@@ -394,17 +353,23 @@ end
394
353
  end
395
354
 
396
355
  it "should use the environment that the ENC mandates" do
397
- apply = init_cli_args_and_apply_app(args, execute)
398
- expect { apply.run }.to exit_with(0)
399
- expect(@logs.map(&:to_s)).to include('amod class included')
356
+ apply.command_line.args = ['-e', execute]
357
+
358
+ expect {
359
+ apply.run
360
+ }.to exit_with(0)
361
+ .and output(a_string_matching(/amod class included/)
362
+ .and matching(/Compiled catalog for .* in environment spec/)).to_stdout
400
363
  end
401
364
 
402
365
  it "should prefer the ENC environment over the configured one and emit a warning" do
403
- apply = init_cli_args_and_apply_app(args + [ '--environment', 'production' ], execute)
404
- expect { apply.run }.to exit_with(0)
405
- logs = @logs.map(&:to_s)
406
- expect(logs).to include('amod class included')
407
- expect(logs).to include(match(/doesn't match server specified environment/))
366
+ apply.command_line.args = ['-e', execute, '--environment', 'production']
367
+
368
+ expect {
369
+ apply.run
370
+ }.to exit_with(0)
371
+ .and output(a_string_matching('amod class included')
372
+ .and matching(/doesn't match server specified environment/)).to_stdout
408
373
  end
409
374
  end
410
375
  end
@@ -475,8 +440,7 @@ class amod::bad_type {
475
440
  context 'and the file is not serialized with rich_data' do
476
441
  it 'will notify a string that is the result of Regexp#inspect (from Runtime3xConverter)' do
477
442
  catalog = compile_to_catalog(execute, node)
478
- apply = Puppet::Application[:apply]
479
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
443
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
480
444
  expect(apply).to receive(:apply_catalog) do |cat|
481
445
  expect(cat.resource(:notify, 'rx')['message']).to be_a(String)
482
446
  expect(cat.resource(:notify, 'bin')['message']).to be_a(String)
@@ -491,8 +455,7 @@ class amod::bad_type {
491
455
 
492
456
  it 'will notify a string that is the result of to_s on uknown data types' do
493
457
  json = compile_to_catalog('include amod::bad_type', node).to_json
494
- apply = Puppet::Application[:apply]
495
- apply.options[:catalog] = file_containing('manifest', json)
458
+ apply.command_line.args = ['--catalog', file_containing('manifest', json)]
496
459
  expect(apply).to receive(:apply_catalog) do |catalog|
497
460
  expect(catalog.resource(:notify, 'bogus')['message']).to be_a(String)
498
461
  end
@@ -514,11 +477,10 @@ class amod::bad_type {
514
477
  context 'and the file is serialized with rich_data' do
515
478
  it 'will notify a regexp using Regexp#to_s' do
516
479
  catalog = compile_to_catalog(execute, node)
517
- apply = Puppet::Application[:apply]
518
480
  serialized_catalog = Puppet.override(rich_data: true) do
519
481
  catalog.to_json
520
482
  end
521
- apply.options[:catalog] = file_containing('manifest', serialized_catalog)
483
+ apply.command_line.args = ['--catalog', file_containing('manifest', serialized_catalog)]
522
484
  expect(apply).to receive(:apply_catalog) do |cat|
523
485
  expect(cat.resource(:notify, 'rx')['message']).to be_a(Regexp)
524
486
  # The resource return in this expect is a String, but since it was a Binary type that
@@ -541,7 +503,6 @@ class amod::bad_type {
541
503
  let(:env_dir) { File.join(Puppet[:environmentpath], env_name) }
542
504
  let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(env_dir, 'modules')]) }
543
505
  let(:node) { Puppet::Node.new(Puppet[:certname], environment: environment) }
544
- let(:apply) { Puppet::Application[:apply] }
545
506
 
546
507
  before :each do
547
508
  Puppet[:environment] = env_name
@@ -564,7 +525,7 @@ class amod::bad_type {
564
525
 
565
526
  expect {
566
527
  apply.command_line.args << manifest
567
- apply.run
528
+ apply.run
568
529
  }.to exit_with(0)
569
530
  .and output(a_string_matching(
570
531
  /dir1\]\/ensure: created/
@@ -579,6 +540,46 @@ class amod::bad_type {
579
540
  end
580
541
  end
581
542
 
543
+ context 'http file sources' do
544
+ include_context 'https client'
545
+
546
+ it "requires the caller to URL encode special characters in the request path and query" do
547
+ Puppet[:server] = '127.0.0.1'
548
+ request = nil
549
+
550
+ response_proc = -> (req, res) {
551
+ request = req
552
+
553
+ res['Content-Type'] = 'text/plain'
554
+ res.body = "from the server"
555
+ }
556
+
557
+ https = PuppetSpec::HTTPSServer.new
558
+ https.start_server(response_proc: response_proc) do |https_port|
559
+ dest = tmpfile('http_file_source')
560
+
561
+ # spaces in path are encoded as %20 and '[' in query is encoded as %5B,
562
+ # but ':', '=', '-' are not encoded
563
+ manifest = file_containing("manifest.pp", <<~MANIFEST)
564
+ file { "#{dest}":
565
+ ensure => file,
566
+ source => "https://#{Puppet[:server]}:#{https_port}/path%20to%20file?x=b%5Bc&sv=2019-02-02&st=2020-07-28T20:18:53Z&se=2020-07-28T21:03:00Z&sr=b&sp=r&sig=JaZhcqxT4akJcOwUdUGrQB2m1geUoh89iL8WMag8a8c=",
567
+ }
568
+ MANIFEST
569
+
570
+ expect {
571
+ apply.command_line.args << manifest
572
+ apply.run
573
+ }.to exit_with(0)
574
+ .and output(%r{Main/File\[#{dest}\]/ensure: defined content as}).to_stdout
575
+
576
+ expect(request.path).to eq('/path to file')
577
+ expect(request.query).to include('x' => 'b[c')
578
+ expect(request.query).to include('sig' => 'JaZhcqxT4akJcOwUdUGrQB2m1geUoh89iL8WMag8a8c=')
579
+ end
580
+ end
581
+ end
582
+
582
583
  context 'http report processor' do
583
584
  include_context 'https client'
584
585
 
@@ -586,7 +587,6 @@ class amod::bad_type {
586
587
  Puppet[:reports] = 'http'
587
588
  end
588
589
 
589
- let(:apply) { Puppet::Application[:apply] }
590
590
  let(:unknown_server) do
591
591
  unknown_ca_cert = cert_fixture('unknown-ca.pem')
592
592
  PuppetSpec::HTTPSServer.new(
@@ -663,4 +663,23 @@ class amod::bad_type {
663
663
  end
664
664
  end
665
665
  end
666
+
667
+ context 'rich data' do
668
+ it "calls a deferred 4x function" do
669
+ apply.command_line.args = ['-e', 'notify { "deferred3x": message => Deferred("join", [[1,2,3], ":"]) }']
670
+
671
+ expect {
672
+ apply.run
673
+ }.to exit_with(0) # for some reason apply returns 0 instead of 2
674
+ .and output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred3x\]/message: defined 'message' as '1:2:3'}).to_stdout
675
+ end
676
+
677
+ it "calls a deferred 3x function" do
678
+ apply.command_line.args = ['-e', 'notify { "deferred4x": message => Deferred("sprintf", ["%s", "I am deferred"]) }']
679
+ expect {
680
+ apply.run
681
+ }.to exit_with(0) # for some reason apply returns 0 instead of 2
682
+ .and output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred4x\]/message: defined 'message' as 'I am deferred'}).to_stdout
683
+ end
684
+ end
666
685
  end