puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -95,8 +95,12 @@ class Puppet::Parser::AST::PopsBridge
95
95
  when Puppet::Pops::Model::SiteDefinition
96
96
  instantiate_SiteDefinition(d, modname)
97
97
  when Puppet::Pops::Model::FunctionDefinition
98
+ # The 3x logic calling this will not know what to do with the result, it is compacted away at the end
98
99
  instantiate_FunctionDefinition(d, modname)
100
+ next
101
+ when Puppet::Pops::Model::TypeAlias
99
102
  # The 3x logic calling this will not know what to do with the result, it is compacted away at the end
103
+ instantiate_TypeAlias(d, modname)
100
104
  next
101
105
  when Puppet::Pops::Model::Application
102
106
  instantiate_ApplicationDefinition(d, modname)
@@ -242,35 +246,28 @@ class Puppet::Parser::AST::PopsBridge
242
246
  # This is for 4x evaluator/loader
243
247
  #
244
248
  def instantiate_FunctionDefinition(function_definition, modname)
245
- loaders = (Puppet.lookup(:loaders) { nil })
246
- unless loaders
247
- raise Puppet::ParseError, "Internal Error: Puppet Context ':loaders' missing - cannot define any functions"
248
- end
249
- loader =
250
- if modname.nil? || modname == ""
251
- # TODO : Later when functions can be private, a decision is needed regarding what that means.
252
- # A private environment loader could be used for logic outside of modules, then only that logic
253
- # would see the function.
254
- #
255
- # Use the private loader, this function may see the environment's dependencies (currently, all modules)
256
- loaders.private_environment_loader()
257
- else
258
- # TODO : Later check if function is private, and then add it to
259
- # private_loader_for_module
260
- #
261
- loaders.public_loader_for_module(modname)
262
- end
263
- unless loader
264
- raise Puppet::ParseError, "Internal Error: did not find public loader for module: '#{modname}'"
265
- end
249
+ loader = Puppet::Pops::Loaders.find_loader(modname)
266
250
 
267
- # Instantiate Function, and store it in the environment loader
251
+ # Instantiate Function, and store it in the loader
268
252
  typed_name, f = Puppet::Pops::Loader::PuppetFunctionInstantiator.create_from_model(function_definition, loader)
269
253
  loader.set_entry(typed_name, f, Puppet::Pops::Adapters::SourcePosAdapter.adapt(function_definition).to_uri)
270
254
 
271
255
  nil # do not want the function to inadvertently leak into 3x
272
256
  end
273
257
 
258
+ # Propagates a found TypeAlias to the appropriate loader.
259
+ # This is for 4x evaluator/loader
260
+ #
261
+ def instantiate_TypeAlias(type_alias, modname)
262
+ loader = Puppet::Pops::Loaders.find_loader(modname)
263
+
264
+ # Bind the type alias to the loader using the alias
265
+ typed_name, t = Puppet::Pops::Loader::TypeDefinitionInstantiator.create_from_model(type_alias, loader)
266
+ loader.set_entry(typed_name, t, Puppet::Pops::Adapters::SourcePosAdapter.adapt(type_alias).to_uri)
267
+
268
+ nil # do not want the type alias to inadvertently leak into 3x
269
+ end
270
+
274
271
  def code()
275
272
  Expression.new(:value => @value)
276
273
  end
@@ -20,7 +20,6 @@ class Puppet::Parser::Compiler
20
20
  include Puppet::Pops::Evaluator::Runtime3Support
21
21
 
22
22
  def self.compile(node, code_id = nil)
23
- $env_module_directories = nil
24
23
  node.environment.check_for_reparse
25
24
 
26
25
  errors = node.environment.validation_errors
@@ -28,7 +27,7 @@ class Puppet::Parser::Compiler
28
27
  errors.each { |e| Puppet.err(e) } if errors.size > 1
29
28
  errmsg = [
30
29
  "Compilation has been halted because: #{errors.first}",
31
- "For more information, see http://docs.puppetlabs.com/puppet/latest/reference/environments.html",
30
+ "For more information, see https://docs.puppetlabs.com/puppet/latest/reference/environments.html",
32
31
  ]
33
32
  raise(Puppet::Error, errmsg.join(' '))
34
33
  end
@@ -803,14 +802,7 @@ class Puppet::Parser::Compiler
803
802
  if trusted_param
804
803
  # Blows up if it is a parameter as it will be set as $trusted by the compiler as if it was a variable
805
804
  node.parameters.delete('trusted')
806
- if trusted_param.is_a?(Hash) && %w{authenticated certname extensions}.all? {|key| trusted_param.has_key?(key) }
807
- # looks like a hash of trusted data - resurrect it
808
- # Allow root to trust the authenticated information if option --trusted is given
809
- if !Puppet.features.root?
810
- # Set as not trusted - but keep the information
811
- trusted_param['authenticated'] = false
812
- end
813
- else
805
+ unless trusted_param.is_a?(Hash) && %w{authenticated certname extensions}.all? {|key| trusted_param.has_key?(key) }
814
806
  # trusted is some kind of garbage, do not resurrect
815
807
  trusted_param = nil
816
808
  end
@@ -842,7 +834,8 @@ class Puppet::Parser::Compiler
842
834
  # Set the node's parameters into the top-scope as variables.
843
835
  def set_node_parameters
844
836
  node.parameters.each do |param, value|
845
- @topscope[param.to_s] = value
837
+ # Ensure node does not leak Symbol instances in general
838
+ @topscope[param.to_s] = value.is_a?(Symbol) ? value.to_s : value
846
839
  end
847
840
  # These might be nil.
848
841
  catalog.client_version = node.parameters["clientversion"]
@@ -3,7 +3,6 @@ require 'puppet/parser/compiler'
3
3
  class Puppet::Parser::EnvironmentCompiler < Puppet::Parser::Compiler
4
4
  def self.compile(env)
5
5
  begin
6
- $env_module_directories = nil
7
6
  env.check_for_reparse
8
7
 
9
8
  node = Puppet::Node.new(env)
@@ -16,6 +16,6 @@ Puppet::Parser::Functions::newfunction(:fqdn_rand, :arity => -2, :type => :rvalu
16
16
  node. (For example, `fqdn_rand(30)`, `fqdn_rand(30, 'expensive job 1')`, and
17
17
  `fqdn_rand(30, 'expensive job 2')` will produce totally different numbers.)") do |args|
18
18
  max = args.shift.to_i
19
- seed = Digest::MD5.hexdigest([self['::fqdn'],args].join(':')).hex
19
+ seed = Digest::MD5.hexdigest([self['::fqdn'],max,args].join(':')).hex
20
20
  Puppet::Util.deterministic_rand_int(seed,max)
21
21
  end
@@ -1,6 +1,6 @@
1
1
  Puppet::Parser::Functions::newfunction(:inline_template, :type => :rvalue, :arity => -2, :doc =>
2
2
  "Evaluate a template string and return its value. See
3
- [the templating docs](http://docs.puppetlabs.com/puppet/latest/reference/lang_template.html) for
3
+ [the templating docs](https://docs.puppetlabs.com/puppet/latest/reference/lang_template.html) for
4
4
  more information. Note that if multiple template strings are specified, their
5
5
  output is all concatenated and returned as the output of the function.") do |vals|
6
6
 
@@ -1,154 +1,133 @@
1
1
  Puppet::Parser::Functions.newfunction(:lookup, :type => :rvalue, :arity => -2, :doc => <<-'ENDHEREDOC') do |args|
2
- Looks up data defined using Data Binding, and Data Providers using different strategies. The lookup searches in
3
- Data Bindings first (if configured; typically Hiera), then in the environments data provider (if any), and last in
4
- the module's data provider (if any) of the module the call to lookup originates from. Thus, the global Data Binding
5
- has higher priority than data provided in the environment, which has higher priority than data provided in a module,
6
-
7
- The lookup function can be called in one of these ways:
8
-
9
- lookup(name)
10
- lookup(name, value_type)
11
- lookup(name, value_type, merge)
12
- lookup(name, value_type, merge, default_value)
13
- lookup(options_hash)
14
- lookup(name, options_hash)
15
-
16
- The function may optionally be called with a code block / lambda with the following signature:
17
-
18
- lookup(...) |$name| { ... }
19
-
20
- The block, if present, is mutually exclusive to the `default_value` and will be called with the `name` used in the
21
- lookup when no value is found. The value produced by the block then becomes the value produced by the lookup.
22
-
23
- The meaning of the parameters or content of the options hash is:
24
-
25
- * `name` - The name or array of names to lookup (first found is returned)
26
- * `value_type` - The type to assert. Defaults to 'Data' See 'Type Specification' below.
27
- * `default_value` - The default value if there was no value found (must comply with the data type)
28
- * `override` - a hash with map from names to values that are used instead of the underlying bindings. If the name
29
- is found here it wins. Defaults to an empty hash.
30
- * `default_values_hash` - a hash with map from names to values that are used as a last resort to obtain a value.
31
- Defaults to an empty hash.
32
- * `merge` - A string of type Enum[unique, hash, merge] or a hash with the key 'strategy' set to that string. See
33
- 'Merge Strategies' below.
34
-
35
- It is not permitted to pass the `name` as both a parameter and in the options hash.
36
-
37
- The search will proceed as follows:
38
- 1. For each name given in the `name` array (or once, if it's just one name):
39
- - If a matching key is found in the `override` hash, it's value is immediately type checked and returned
40
- - Search and optionally merge Data Binding, environment data providers, and module data providers
41
- - Type check and return the value if a matching key is found
42
- 2. For each name given in the `name` array (or once, if it's just one name):
43
- - Type check and return the value if a matching key is found in the `default_values_hash`
44
- 3. Type check and return either the given `default_value` or the result of calling the code block if either exist
45
- 4. Raise an error indicating that no matching value was found
46
-
47
- *Merge Strategies*
48
-
49
- The default behavior of the lookup is to return the first value that is found for the given `name`. The optional
50
- `merge` parameter will change this so that a lookup makes an attempt to find values in all three sources (the Data
51
- Binder, the environment, and the module scope) and then merge these values according to the given strategy. This
52
- does not apply to values found in the 'override' hash. Such values are returned immediately without merging.
53
- Note that `merge` is passed on to allow the underlying provider to return a merged result
54
-
55
- The valid strategies are:
56
- - 'hash' Performs a simple hash-merge by overwriting keys of lower lookup priority. Merged values must be of Hash type
57
- - 'unique' Appends everything to an array containing no nested arrays and where all duplicates have been removed. Can
58
- append values of Scalar or Array[Scalar] type
59
- - 'deep' Performs a deep merge on values of Array and Hash type. See documentation for the DeepMerge gem's deep_merge
60
- operation for details and options.
61
-
62
- The 'deep' strategy can use additional options to control its behavior. Options can be passed as top level
63
- keys in the `merge` parameter when it is a given as a hash. Recognized options are:
64
- - 'knockout_prefix' Set to string value to signify prefix which deletes elements from existing element. Defaults is _undef_
65
- - 'sort_merged_arrays' Set to _true_ to sort all arrays that are merged together. Default is _false_
66
- - 'unpack_arrays' Set to string value used as a deliminator to join all array values and then split them again. Default is _undef_
67
- - 'merge_hash_arrays' Set to _true_ to merge hashes within arrays. Default is _false_
68
-
69
- *Type Specification*
70
-
71
- The type specification is a type in the Puppet Type System, e.g.:
72
- * `Integer`, an integral value with optional range e.g.:
73
- * `Integer[0, default]` - 0 or positive
74
- * `Integer[default, -1]` - negative,
75
- * `Integer[1,100]` - value between 1 and 100 inclusive
76
- * `String`- any string
77
- * `Float` - floating point number (same signature as for Integer for `Integer` ranges)
78
- * `Boolean` - true of false (strict)
79
- * `Array` - an array (of Data by default), or parameterized as `Array[<element_type>]`, where
80
- `<element_type>` is the expected type of elements
81
- * `Hash`, - a hash (of default `Literal` keys and `Data` values), or parameterized as
82
- `Hash[<value_type>]`, `Hash[<key_type>, <value_type>]`, where `<key_type>`, and
83
- `<value_type>` are the types of the keys and values respectively
84
- (key is `Literal` by default).
85
- * `Data` - abstract type representing any `Literal` (including _undef_), `Array[Data]`, or `Hash[Literal, Data]`
86
- * `Pattern[<p1>, <p2>, ..., <pn>]` - an enumeration of valid patterns (one or more) where
87
- a pattern is a regular expression string or regular expression,
88
- e.g. `Pattern['.com$', '.net$']`, `Pattern[/[a-z]+[0-9]+/]`
89
- * `Enum[<s1>, <s2>, ..., <sn>]`, - an enumeration of exact string values (one or more)
90
- e.g. `Enum[blue, red, green]`.
91
- * `Variant[<t1>, <t2>,...<tn>]` - matches one of the listed types (at least one must be given)
92
- e.g. `Variant[Integer[8000,8999], Integer[20000, 99999]]` to accept a value in either range
93
- * `Regexp`- a regular expression (i.e. the result is a regular expression, not a string
94
- matching a regular expression).
95
-
96
- For more options and details about types, see the Puppet Language Reference
97
-
98
- *Handling of undef*
99
-
100
- When no match is found for the given `name` when searching all sources, (including the `override`and
101
- `default_values_hash`), then the value used is either the `default_value` or the value produced by the given block.
102
- If neither is provided, then the lookup will always raise an error. Note that this only applies when there's no
103
- match for the given `name`. It does not happen when a value is found and that value happens to be _undef_.
104
-
105
- *Validation of returned value*
2
+ Uses the Puppet lookup system to retrieve a value for a given key. By default,
3
+ this returns the first value found (and fails compilation if no values are
4
+ available), but you can configure it to merge multiple values into one, fail
5
+ gracefully, and more.
6
+
7
+ When looking up a key, Puppet will search up to three tiers of data, in the
8
+ following order:
9
+
10
+ 1. Hiera.
11
+ 2. The current environment's data provider.
12
+ 3. The indicated module's data provider, if the key is of the form
13
+ `<MODULE NAME>::<SOMETHING>`.
14
+
15
+ #### Arguments
16
+
17
+ You must provide the name of a key to look up, and can optionally provide other
18
+ arguments. You can combine these arguments in the following ways:
19
+
20
+ * `lookup( <NAME>, [<VALUE TYPE>], [<MERGE BEHAVIOR>], [<DEFAULT VALUE>] )`
21
+ * `lookup( [<NAME>], <OPTIONS HASH> )`
22
+ * `lookup( as above ) |$key| { # lambda returns a default value }`
23
+
24
+ Arguments in `[square brackets]` are optional.
25
+
26
+ The arguments accepted by `lookup` are as follows:
27
+
28
+ 1. `<NAME>` (string or array) --- The name of the key to look up.
29
+ * This can also be an array of keys. If Puppet doesn't find anything for the
30
+ first key, it will try again with the subsequent ones, only resorting to a
31
+ default value if none of them succeed.
32
+ 2. `<VALUE TYPE>` (data type) --- A
33
+ [data type](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_type.html)
34
+ that must match the retrieved value; if not, the lookup (and catalog
35
+ compilation) will fail. Defaults to `Data` (accepts any normal value).
36
+ 3. `<MERGE BEHAVIOR>` (string or hash; see **"Merge Behaviors"** below) ---
37
+ Whether (and how) to combine multiple values. If present, this overrides any
38
+ merge behavior specified in the data sources. Defaults to no value; Puppet will
39
+ use merge behavior from the data sources if present, and will otherwise do a
40
+ first-found lookup.
41
+ 4. `<DEFAULT VALUE>` (any normal value) --- If present, `lookup` returns this
42
+ when it can't find a normal value. Default values are never merged with found
43
+ values. Like a normal value, the default must match the value type. Defaults to
44
+ no value; if Puppet can't find a normal value, the lookup (and compilation) will
45
+ fail.
46
+ 5. `<OPTIONS HASH>` (hash) --- Alternate way to set the arguments above, plus
47
+ some less-common extra options. If you pass an options hash, you can't combine
48
+ it with any regular arguments (except `<NAME>`). An options hash can have the
49
+ following keys:
50
+ * `'name'` --- Same as `<NAME>` (argument 1). You can pass this as an
51
+ argument or in the hash, but not both.
52
+ * `'value_type'` --- Same as `<VALUE TYPE>` (argument 2).
53
+ * `'merge'` --- Same as `<MERGE BEHAVIOR>` (argument 3).
54
+ * `'default_value'` --- Same as `<DEFAULT VALUE>` (argument 4).
55
+ * `'default_values_hash'` (hash) --- A hash of lookup keys and default
56
+ values. If Puppet can't find a normal value, it will check this hash for the
57
+ requested key before giving up. You can combine this with `default_value` or
58
+ a lambda, which will be used if the key isn't present in this hash. Defaults
59
+ to an empty hash.
60
+ * `'override'` (hash) --- A hash of lookup keys and override values. Puppet
61
+ will check for the requested key in the overrides hash _first;_ if found, it
62
+ returns that value as the _final_ value, ignoring merge behavior. Defaults
63
+ to an empty hash.
64
+
65
+ Finally, `lookup` can take a lambda, which must accept a single parameter.
66
+ This is yet another way to set a default value for the lookup; if no results are
67
+ found, Puppet will pass the requested key to the lambda and use its result as
68
+ the default value.
69
+
70
+ #### Merge Behaviors
71
+
72
+ Puppet lookup uses a hierarchy of data sources, and a given key might have
73
+ values in multiple sources. By default, Puppet returns the first value it finds,
74
+ but it can also continue searching and merge all the values together.
75
+
76
+ > **Note:** Data sources can use the special `lookup_options` metadata key to
77
+ request a specific merge behavior for a key. The `lookup` function will use that
78
+ requested behavior unless you explicitly specify one.
79
+
80
+ The valid merge behaviors are:
81
+
82
+ * `'first'` --- Returns the first value found, with no merging. Puppet lookup's
83
+ default behavior.
84
+ * `'unique'` (called "array merge" in classic Hiera) --- Combines any number of
85
+ arrays and scalar values to return a merged, flattened array with all duplicate
86
+ values removed. The lookup will fail if any hash values are found.
87
+ * `'hash'` --- Combines the keys and values of any number of hashes to return a
88
+ merged hash. If the same key exists in multiple source hashes, Puppet will use
89
+ the value from the highest-priority data source; it won't recursively merge the
90
+ values.
91
+ * `'deep'` --- Combines the keys and values of any number of hashes to return a
92
+ merged hash. If the same key exists in multiple source hashes, Puppet will
93
+ recursively merge hash or array values (with duplicate values removed from
94
+ arrays). For conflicting scalar values, the highest-priority value will win.
95
+ * `{'strategy' => 'first|unique|hash'}` --- Same as the string versions of these
96
+ merge behaviors.
97
+ * `{'strategy' => 'deep', <DEEP OPTION> => <VALUE>, ...}` --- Same as `'deep'`,
98
+ but can adjust the merge with additional options. The available options are:
99
+ * `'knockout_prefix'` (string or undef) --- A string prefix to indicate a
100
+ value should be _removed_ from the final result. Defaults to `undef`, which
101
+ disables this feature.
102
+ * `'sort_merged_arrays'` (boolean) --- Whether to sort all arrays that are
103
+ merged together. Defaults to `false`.
104
+ * `'unpack_arrays'` (string or undef) --- A delimiter string; Puppet will
105
+ join merged arrays with this delimiter, then split them again. Defaults to
106
+ `undef`, which disables this feature.
107
+ * `'merge_hash_arrays'` (boolean) --- Whether to merge hashes within arrays.
108
+ Defaults to `false`.
109
+
110
+ #### Examples
111
+
112
+ Look up a key and return the first value found:
113
+
114
+ lookup('ntp::service_name')
115
+
116
+ Do a unique merge lookup of class names, then add all of those classes to the
117
+ catalog (like `hiera_include`):
118
+
119
+ lookup('classes', Array[String], 'unique').include
120
+
121
+ Do a deep hash merge lookup of user data, but let higher priority sources
122
+ remove values by prefixing them with `--`:
123
+
124
+ lookup( { 'name' => 'users',
125
+ 'merge' => {
126
+ 'strategy' => 'deep',
127
+ 'knockout_prefix' => '--',
128
+ },
129
+ })
106
130
 
107
- The produced value is subject to type validation using the `value_type` (if given) and an error is raised unless
108
- the resulting value is of correct type.
109
-
110
- *Examples*
111
-
112
- When called with one argument; **the name**, it
113
- returns the bound value with the given name after having asserted it has the default datatype `Data`:
114
-
115
- lookup('the_name')
116
-
117
- When called with two arguments; **the name**, and **the expected type**, it
118
- returns the bound value with the given name after having asserted it has the given data
119
- type ('String' in the example):
120
-
121
- lookup('the_name', String)
122
-
123
- When called with four arguments, **the name**, the **expected type**, the **merge** strategy, and a
124
- **default value**, it returns the bound value with the given name, or the default after having asserted the value
125
- has the given data type:
126
-
127
- lookup('the_name', String, undef, 'Fred')
128
- lookup('the_name', Array[String], 'unique', [Fred])
129
-
130
- Using a lambda to provide a default value by calling a function:
131
-
132
- lookup('the_size', Integer[1,100]) |$name| {
133
- obtain_size_default()
134
- }
135
-
136
- There are two ways to make lookup return undef when no matching key was found instead of raising an error.
137
- Either call it with four arguments (the `merge` argument must be present even when using the default strategy
138
- to ensure that the four argument variant is used):
139
-
140
- $are_you_there = lookup('peekaboo', Optional[String], undef, undef)
141
-
142
- or call it using an options hash:
143
-
144
- $are_you_there = lookup('peekaboo', { 'default_value' => undef })
145
- $are_you_there = lookup({ 'name' => 'peekaboo', 'default_value' => undef })
146
-
147
- or with a block that produces an undef value:
148
-
149
- $are_you_there = lookup('peekaboo', Optional[String]) |$name| { undef }
150
-
151
- - Since 4.0.0
152
131
  ENDHEREDOC
153
132
  function_fail(["lookup() has been converted to 4x API"])
154
133
  end
@@ -3,7 +3,7 @@ Puppet::Parser::Functions::newfunction(
3
3
  :type => :rvalue,
4
4
  :arity => -3,
5
5
  :doc => <<-DOC
6
- Applies a [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
6
+ Applies a [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
7
7
  to every value in a data structure and returns an array containing the results.
8
8
 
9
9
  This function takes two mandatory arguments, in this order:
@@ -34,6 +34,7 @@ $matches = "abc123".match(/([a-z]+)([1-9]+)/)
34
34
  ~~~ ruby
35
35
  $matches = ["abc123","def456"].match(/([a-z]+)([1-9]+)/)
36
36
  # $matches contains [[abc123, abc, 123], [def456, def, 456]]
37
+ ~~~
37
38
 
38
39
  - Since 4.0.0
39
40
  DOC
@@ -5,37 +5,26 @@ Puppet::Parser::Functions::newfunction(
5
5
  :type => :rvalue,
6
6
  :arity => 2,
7
7
  :doc => <<-DOC
8
- Scans a string and returns an array of one or more converted values as directed by a given format string.args
9
- See the documenation of Ruby's String::scanf method for details about the supported formats (which
10
- are similar but not identical to the formats used in Puppet's `sprintf` function.
8
+ Scans a string and returns an array of one or more converted values based on the given format string.
9
+ See the documenation of Ruby's String#scanf method for details about the supported formats (which
10
+ are similar but not identical to the formats used in Puppet's `sprintf` function.)
11
11
 
12
- This function takes two mandatory arguments: the first is the String to
13
- convert, and the second the format String. The result of the scan is an Array,
14
- with each sucessfully scanned and transformed value.args The scanning stops if
15
- a scan is unsuccesful and the scanned result up to that point is returned. If
16
- there was no succesful scan at all, the result is an empty Array.
12
+ This function takes two mandatory arguments: the first is the string to convert, and the second is
13
+ the format string. The result of the scan is an array, with each sucessfully scanned and transformed value.
14
+ The scanning stops if a scan is unsuccesful, and the scanned result up to that point is returned. If there
15
+ was no succesful scan, the result is an empty array.
17
16
 
18
- scanf("42", "%i")[0] == 42
17
+ "42".scanf("%i")
19
18
 
19
+ You can also optionally pass a lambda to scanf, to do additional validation or processing.
20
20
 
21
- When used with the future parser, an optional parameterized block may be given.
22
- The block is called with the result that is produced by scanf if no block is
23
- present, the result of the block is then returned by the function.
24
-
25
- The optional code block is typically used to assert that the scan was
26
- succesful, and either produce the same input, or perform unwrapping of
27
- the result:
28
-
29
- "42".scanf("%i")
30
- "42".scanf("%i") |$x| {
31
- unless $x[0] =~ Integer {
32
- fail "Expected a well formed integer value, got '$x[0]'"
33
- }
34
- $x[0]
21
+ "42".scanf("%i") |$x| {
22
+ unless $x[0] =~ Integer {
23
+ fail "Expected a well formed integer value, got '$x[0]'"
35
24
  }
36
-
37
- - since 3.7.4 with `parser = future`
38
- - since 3.7.5 with classic parser
25
+ $x[0]
26
+ }
27
+ - since 4.0.0
39
28
  DOC
40
29
  ) do |args|
41
30
  data = args[0]
@@ -3,42 +3,35 @@ Puppet::Parser::Functions::newfunction(
3
3
  :type => :rvalue,
4
4
  :arity => -3,
5
5
  :doc => <<-DOC
6
- Applies a parameterized block to each _slice_ of elements in a sequence of selected entries from the first
7
- argument and returns the first argument, or if no block is given returns a new array with a concatenation of
8
- the slices.
6
+ This function takes two mandatory arguments: the first should be an array or hash, and the second specifies
7
+ the number of elements to include in each slice.
9
8
 
10
- This function takes two mandatory arguments: the first, `$a`, should be an Array, Hash, or something of
11
- enumerable type (integer, Integer range, or String), and the second, `$n`, the number of elements to include
12
- in each slice. The optional third argument should be a a parameterized block as produced by the puppet syntax:
13
-
14
- $a.slice($n) |$x| { ... }
15
- slice($a) |$x| { ... }
16
-
17
- The parameterized block should have either one parameter (receiving an array with the slice), or the same number
18
- of parameters as specified by the slice size (each parameter receiving its part of the slice).
19
- In case there are fewer remaining elements than the slice size for the last slice it will contain the remaining
20
- elements. When the block has multiple parameters, excess parameters are set to undef for an array or
21
- enumerable type, and to empty arrays for a Hash.
22
-
23
- $a.slice(2) |$first, $second| { ... }
24
-
25
- When the first argument is a Hash, each `key,value` entry is counted as one, e.g, a slice size of 2 will produce
9
+ When the first argument is a hash, each key value pair is counted as one. For example, a slice size of 2 will produce
26
10
  an array of two arrays with key, and value.
27
11
 
28
- Example Using slice with Hash
29
-
30
12
  $a.slice(2) |$entry| { notice "first ${$entry[0]}, second ${$entry[1]}" }
31
13
  $a.slice(2) |$first, $second| { notice "first ${first}, second ${second}" }
32
14
 
33
- When called without a block, the function produces a concatenated result of the slices.
34
-
35
- Example Using slice without a block
15
+ The function produces a concatenated result of the slices.
36
16
 
37
17
  slice([1,2,3,4,5,6], 2) # produces [[1,2], [3,4], [5,6]]
38
18
  slice(Integer[1,6], 2) # produces [[1,2], [3,4], [5,6]]
39
19
  slice(4,2) # produces [[0,1], [2,3]]
40
20
  slice('hello',2) # produces [[h, e], [l, l], [o]]
41
21
 
22
+ You can also optionally pass a lambda to slice.
23
+
24
+ $a.slice($n) |$x| { ... }
25
+ slice($a) |$x| { ... }
26
+
27
+ The lambda should have either one parameter (receiving an array with the slice), or the same number
28
+ of parameters as specified by the slice size (each parameter receiving its part of the slice).
29
+ If there are fewer remaining elements than the slice size for the last slice, it will contain the remaining
30
+ elements. If the lambda has multiple parameters, excess parameters are set to undef for an array, or
31
+ to empty arrays for a hash.
32
+
33
+ $a.slice(2) |$first, $second| { ... }
34
+
42
35
  - Since 4.0.0
43
36
  DOC
44
37
  ) do |args|
@@ -12,7 +12,7 @@ Split a string variable into an array using the specified split regexp.
12
12
  $string = 'v1.v2:v3.v4'
13
13
  $array_var1 = split($string, ':')
14
14
  $array_var2 = split($string, '[.]')
15
- $array_var3 = split($string, '[.:]')
15
+ $array_var3 = split($string, Regexp['[.:]'])
16
16
 
17
17
  `$array_var1` now holds the result `['v1.v2', 'v3.v4']`,
18
18
  while `$array_var2` holds `['v1', 'v2:v3', 'v4']`, and