puppet 4.2.3-x64-mingw32 → 4.3.0-x64-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 (337) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +1 -1
  3. data/ext/debian/puppet.init +0 -1
  4. data/ext/debian/puppet.logrotate +14 -5
  5. data/ext/osx/puppet.plist +0 -2
  6. data/ext/redhat/client.init +13 -5
  7. data/ext/redhat/logrotate +15 -3
  8. data/ext/redhat/puppet.spec.erb +5 -1
  9. data/ext/redhat/server.init +1 -1
  10. data/ext/systemd/puppet.service +1 -0
  11. data/lib/puppet.rb +12 -0
  12. data/lib/puppet/agent.rb +4 -4
  13. data/lib/puppet/agent/locker.rb +11 -2
  14. data/lib/puppet/application/agent.rb +5 -1
  15. data/lib/puppet/application/apply.rb +4 -0
  16. data/lib/puppet/application/filebucket.rb +78 -4
  17. data/lib/puppet/application/lookup.rb +356 -0
  18. data/lib/puppet/application/master.rb +3 -0
  19. data/lib/puppet/configurer.rb +9 -5
  20. data/lib/puppet/context.rb +16 -1
  21. data/lib/puppet/context/trusted_information.rb +21 -1
  22. data/lib/puppet/daemon.rb +17 -13
  23. data/lib/puppet/data_binding.rb +4 -2
  24. data/lib/puppet/data_providers.rb +12 -13
  25. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  26. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  27. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  28. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  29. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  30. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  31. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  32. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  33. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  34. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  35. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  36. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  37. data/lib/puppet/defaults.rb +12 -2
  38. data/lib/puppet/error.rb +4 -0
  39. data/lib/puppet/face/module/changes.rb +2 -1
  40. data/lib/puppet/feature/cfacter.rb +1 -0
  41. data/lib/puppet/file_bucket/dipper.rb +58 -2
  42. data/lib/puppet/functions.rb +2 -4
  43. data/lib/puppet/functions/assert_type.rb +48 -12
  44. data/lib/puppet/functions/defined.rb +79 -48
  45. data/lib/puppet/functions/each.rb +85 -27
  46. data/lib/puppet/functions/filter.rb +58 -23
  47. data/lib/puppet/functions/hiera.rb +76 -3
  48. data/lib/puppet/functions/hiera_array.rb +65 -3
  49. data/lib/puppet/functions/hiera_hash.rb +74 -2
  50. data/lib/puppet/functions/hiera_include.rb +75 -2
  51. data/lib/puppet/functions/lookup.rb +19 -17
  52. data/lib/puppet/functions/map.rb +56 -21
  53. data/lib/puppet/functions/match.rb +29 -12
  54. data/lib/puppet/functions/reduce.rb +95 -58
  55. data/lib/puppet/functions/versioncmp.rb +36 -0
  56. data/lib/puppet/functions/with.rb +15 -7
  57. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  58. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  59. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  61. data/lib/puppet/indirector/hiera.rb +4 -0
  62. data/lib/puppet/indirector/json.rb +1 -1
  63. data/lib/puppet/indirector/msgpack.rb +1 -1
  64. data/lib/puppet/indirector/request.rb +7 -8
  65. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  66. data/lib/puppet/info_service.rb +7 -0
  67. data/lib/puppet/info_service/class_information_service.rb +111 -0
  68. data/lib/puppet/module_tool/metadata.rb +32 -9
  69. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  70. data/lib/puppet/network/authconfig.rb +21 -1
  71. data/lib/puppet/network/authorization.rb +8 -1
  72. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  73. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  74. data/lib/puppet/node/environment.rb +9 -2
  75. data/lib/puppet/parser.rb +3 -0
  76. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  77. data/lib/puppet/parser/compiler.rb +302 -12
  78. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  79. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  80. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  81. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  82. data/lib/puppet/parser/environment_compiler.rb +165 -0
  83. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  84. data/lib/puppet/parser/functions/defined.rb +105 -68
  85. data/lib/puppet/parser/functions/each.rb +85 -27
  86. data/lib/puppet/parser/functions/filter.rb +59 -23
  87. data/lib/puppet/parser/functions/hiera.rb +83 -27
  88. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  89. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  90. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  91. data/lib/puppet/parser/functions/map.rb +55 -20
  92. data/lib/puppet/parser/functions/match.rb +27 -12
  93. data/lib/puppet/parser/functions/reduce.rb +97 -60
  94. data/lib/puppet/parser/functions/with.rb +16 -8
  95. data/lib/puppet/parser/resource.rb +98 -19
  96. data/lib/puppet/plugins/configuration.rb +3 -2
  97. data/lib/puppet/plugins/data_providers.rb +12 -60
  98. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  99. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  100. data/lib/puppet/pops.rb +19 -17
  101. data/lib/puppet/pops/adapters.rb +12 -0
  102. data/lib/puppet/pops/binder/binder.rb +2 -2
  103. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  104. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  105. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  106. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  107. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  108. data/lib/puppet/pops/binder/injector.rb +4 -4
  109. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  110. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  111. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  112. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  113. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  114. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  115. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  116. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  117. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  118. data/lib/puppet/pops/issues.rb +1 -1
  119. data/lib/puppet/pops/label_provider.rb +1 -1
  120. data/lib/puppet/pops/lookup.rb +25 -47
  121. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  122. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  123. data/lib/puppet/pops/merge_strategy.rb +73 -5
  124. data/lib/puppet/pops/model/factory.rb +34 -0
  125. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  126. data/lib/puppet/pops/model/model_meta.rb +15 -0
  127. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  128. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  129. data/lib/puppet/pops/parser/egrammar.ra +56 -3
  130. data/lib/puppet/pops/parser/eparser.rb +1549 -1352
  131. data/lib/puppet/pops/parser/lexer2.rb +31 -6
  132. data/lib/puppet/pops/parser/locator.rb +1 -1
  133. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  134. data/lib/puppet/pops/types/enumeration.rb +1 -2
  135. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  136. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  137. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  138. data/lib/puppet/pops/types/type_factory.rb +87 -148
  139. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  140. data/lib/puppet/pops/types/type_parser.rb +116 -127
  141. data/lib/puppet/pops/types/types.rb +1394 -255
  142. data/lib/puppet/pops/types/types_meta.rb +0 -234
  143. data/lib/puppet/pops/validation.rb +7 -2
  144. data/lib/puppet/pops/validation/checker4_0.rb +28 -0
  145. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  146. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  147. data/lib/puppet/provider/package/dnf.rb +41 -0
  148. data/lib/puppet/provider/package/gem.rb +7 -2
  149. data/lib/puppet/provider/package/rpm.rb +1 -0
  150. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  151. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  152. data/lib/puppet/provider/package/windows/package.rb +9 -1
  153. data/lib/puppet/provider/package/yum.rb +14 -9
  154. data/lib/puppet/provider/service/bsd.rb +1 -1
  155. data/lib/puppet/provider/service/debian.rb +21 -0
  156. data/lib/puppet/provider/service/init.rb +6 -0
  157. data/lib/puppet/provider/service/rcng.rb +51 -0
  158. data/lib/puppet/provider/service/redhat.rb +2 -1
  159. data/lib/puppet/provider/service/smf.rb +43 -2
  160. data/lib/puppet/provider/service/src.rb +27 -0
  161. data/lib/puppet/provider/service/systemd.rb +15 -3
  162. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  163. data/lib/puppet/reference/report.rb +9 -12
  164. data/lib/puppet/reports.rb +5 -1
  165. data/lib/puppet/resource.rb +50 -73
  166. data/lib/puppet/resource/capability_finder.rb +95 -0
  167. data/lib/puppet/resource/catalog.rb +47 -7
  168. data/lib/puppet/resource/status.rb +0 -2
  169. data/lib/puppet/resource/type.rb +238 -44
  170. data/lib/puppet/resource/type_collection.rb +60 -2
  171. data/lib/puppet/settings.rb +2 -2
  172. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  173. data/lib/puppet/ssl/oids.rb +9 -1
  174. data/lib/puppet/transaction.rb +4 -1
  175. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  176. data/lib/puppet/transaction/resource_harness.rb +9 -4
  177. data/lib/puppet/type.rb +74 -3
  178. data/lib/puppet/type/augeas.rb +8 -0
  179. data/lib/puppet/type/file/source.rb +14 -12
  180. data/lib/puppet/type/user.rb +4 -2
  181. data/lib/puppet/util/windows/security.rb +4 -1
  182. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  183. data/lib/puppet/version.rb +1 -1
  184. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  185. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  186. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  187. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  188. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  189. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  190. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  191. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  192. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  193. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  194. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  195. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  198. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  201. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  202. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  203. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  204. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  205. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  206. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  207. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  208. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  209. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  210. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  211. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  212. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  213. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  214. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  215. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  216. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  217. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  218. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  219. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  220. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  224. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  225. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  226. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  227. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  228. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  229. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  230. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  231. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  232. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  233. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  234. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  235. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  236. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  238. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  239. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  241. data/spec/integration/data_binding_spec.rb +229 -0
  242. data/spec/integration/file_bucket/file_spec.rb +2 -2
  243. data/spec/integration/parser/compiler_spec.rb +23 -19
  244. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  245. data/spec/integration/parser/undef_param_spec.rb +1 -1
  246. data/spec/integration/resource/catalog_spec.rb +1 -1
  247. data/spec/integration/type/package_spec.rb +2 -0
  248. data/spec/integration/util/windows/security_spec.rb +18 -0
  249. data/spec/lib/matchers/include_in_order.rb +2 -2
  250. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  251. data/spec/spec_helper.rb +7 -0
  252. data/spec/unit/agent/locker_spec.rb +4 -4
  253. data/spec/unit/agent_spec.rb +0 -8
  254. data/spec/unit/application/agent_spec.rb +5 -0
  255. data/spec/unit/application/apply_spec.rb +8 -0
  256. data/spec/unit/application/filebucket_spec.rb +87 -1
  257. data/spec/unit/application/lookup_spec.rb +195 -0
  258. data/spec/unit/appmgmt_spec.rb +657 -0
  259. data/spec/unit/capability_spec.rb +414 -0
  260. data/spec/unit/configurer_spec.rb +7 -1
  261. data/spec/unit/context/trusted_information_spec.rb +24 -1
  262. data/spec/unit/daemon_spec.rb +18 -8
  263. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  264. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  265. data/spec/unit/functions/assert_type_spec.rb +5 -7
  266. data/spec/unit/functions/defined_spec.rb +2 -2
  267. data/spec/unit/functions/epp_spec.rb +2 -2
  268. data/spec/unit/functions/lookup_spec.rb +200 -9
  269. data/spec/unit/functions/regsubst_spec.rb +17 -8
  270. data/spec/unit/functions/scanf_spec.rb +1 -1
  271. data/spec/unit/functions/split_spec.rb +2 -2
  272. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  273. data/spec/unit/functions4_spec.rb +58 -72
  274. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  275. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  276. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  277. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  278. data/spec/unit/indirector/request_spec.rb +8 -8
  279. data/spec/unit/info_service_spec.rb +236 -0
  280. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  281. data/spec/unit/network/authconfig_spec.rb +62 -32
  282. data/spec/unit/network/authorization_spec.rb +30 -2
  283. data/spec/unit/network/http/connection_spec.rb +14 -19
  284. data/spec/unit/parser/compiler_spec.rb +86 -2
  285. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  286. data/spec/unit/parser/resource_spec.rb +2 -20
  287. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  288. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  289. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  290. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  291. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
  292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  293. data/spec/unit/pops/label_provider_spec.rb +5 -1
  294. data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
  295. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  296. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  297. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  298. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  299. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  300. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  301. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  302. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  303. data/spec/unit/pops/types/type_parser_spec.rb +7 -12
  304. data/spec/unit/pops/validator/validator_spec.rb +25 -0
  305. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  306. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  307. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  308. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  309. data/spec/unit/provider/package/gem_spec.rb +7 -0
  310. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  311. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  312. data/spec/unit/provider/package/yum_spec.rb +21 -13
  313. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  314. data/spec/unit/provider/service/debian_spec.rb +27 -0
  315. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  316. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  317. data/spec/unit/provider/service/smf_spec.rb +30 -5
  318. data/spec/unit/provider/service/src_spec.rb +19 -4
  319. data/spec/unit/provider/service/systemd_spec.rb +78 -29
  320. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  321. data/spec/unit/reports_spec.rb +10 -0
  322. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  323. data/spec/unit/resource/catalog_spec.rb +31 -8
  324. data/spec/unit/resource/type_collection_spec.rb +23 -2
  325. data/spec/unit/resource/type_spec.rb +1 -1
  326. data/spec/unit/resource_spec.rb +22 -4
  327. data/spec/unit/settings_spec.rb +90 -1
  328. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  329. data/spec/unit/ssl/oids_spec.rb +8 -0
  330. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  331. data/spec/unit/transaction/report_spec.rb +24 -1
  332. data/spec/unit/type/package_spec.rb +1 -0
  333. data/spec/unit/type/user_spec.rb +14 -7
  334. data/spec/unit/type_spec.rb +1 -1
  335. metadata +169 -5
  336. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  337. data/spec/integration/data_binding.rb +0 -104
@@ -21,7 +21,8 @@ module Puppet
21
21
  :default => false,
22
22
  :type => :boolean,
23
23
  :desc => 'Whether to enable a pre-Facter 3.0 release of native Facter (distributed as
24
- the "cfacter" package). This is not necessary if Facter 3.0 or later is installed.',
24
+ the "cfacter" package). This is not necessary if Facter 3.0 or later is installed.
25
+ This setting is deprecated, as Facter 3 is now the default in puppet-agent.',
25
26
  :hook => proc do |value|
26
27
  return unless value
27
28
  raise ArgumentError, 'facter has already evaluated facts.' if Facter.instance_variable_get(:@collection)
@@ -526,6 +527,15 @@ module Puppet
526
527
  :desc => "The directory where catalog previews per node are generated."
527
528
  }
528
529
  )
530
+
531
+ define_settings(:main,
532
+ :app_management => {
533
+ :default => false,
534
+ :type => :boolean,
535
+ :desc => "Whether the application management feature is on or off. You must restart Puppet Server after changing this setting.",
536
+ }
537
+ )
538
+
529
539
  Puppet.define_settings(:module_tool,
530
540
  :module_repository => {
531
541
  :default => 'https://forgeapi.puppetlabs.com',
@@ -545,7 +555,7 @@ module Puppet
545
555
  },
546
556
  :module_groups => {
547
557
  :default => nil,
548
- :desc => "Extra module groups to request from the Puppet Forge",
558
+ :desc => "Extra module groups to request from the Puppet Forge. This is an internal setting, and users should never change it.",
549
559
  }
550
560
  )
551
561
 
data/lib/puppet/error.rb CHANGED
@@ -93,4 +93,8 @@ module Puppet
93
93
  class MissingCommand < Puppet::Error
94
94
  end
95
95
 
96
+ # Raised when we failed to aquire a lock
97
+ class LockError < Puppet::Error
98
+ end
99
+
96
100
  end
@@ -4,7 +4,8 @@ Puppet::Face.define(:module, '1.0.0') do
4
4
  description <<-EOT
5
5
  Shows any files in a module that have been modified since it was
6
6
  installed. This action compares the files on disk to the md5 checksums
7
- included in the module's metadata.
7
+ included in the module's checksums.json or, if that is missing, in
8
+ metadata.json.
8
9
  EOT
9
10
 
10
11
  returns "Array of strings representing paths of modified files."
@@ -2,6 +2,7 @@ require 'facter'
2
2
  require 'puppet/util/feature'
3
3
 
4
4
  Puppet.features.add :cfacter do
5
+ Puppet.deprecation_warning("The cfacter setting is deprecated. You can use Facter 3 and higher without this setting.")
5
6
  begin
6
7
  require 'cfacter'
7
8
 
@@ -2,6 +2,8 @@ require 'pathname'
2
2
  require 'puppet/file_bucket'
3
3
  require 'puppet/file_bucket/file'
4
4
  require 'puppet/indirector/request'
5
+ require 'puppet/util/diff'
6
+ require 'tempfile'
5
7
 
6
8
  class Puppet::FileBucket::Dipper
7
9
  include Puppet::Util::Checksums
@@ -22,7 +24,7 @@ class Puppet::FileBucket::Dipper
22
24
  @rest_path = nil
23
25
  else
24
26
  @local_path = nil
25
- @rest_path = "https://#{server}:#{port}/#{environment}/file_bucket_file/"
27
+ @rest_path = "filebucket://#{server}:#{port}/"
26
28
  end
27
29
  @checksum_type = Puppet[:digest_algorithm].to_sym
28
30
  @digest = method(@checksum_type)
@@ -56,6 +58,46 @@ class Puppet::FileBucket::Dipper
56
58
  end
57
59
  end
58
60
 
61
+ # Diffs two filebucket files identified by their sums
62
+ def diff(checksum_a, checksum_b, file_a, file_b)
63
+ raise RuntimeError, "Diff is not supported on this platform" if Puppet[:diff] == ""
64
+ if checksum_a
65
+ source_path = "#{@rest_path}#{@checksum_type}/#{checksum_a}"
66
+ if checksum_b
67
+ file_diff = Puppet::FileBucket::File.indirection.find(
68
+ source_path,
69
+ :bucket_path => @local_path,
70
+ :diff_with => checksum_b)
71
+ elsif file_b
72
+ tmp_file = ::Tempfile.new('diff')
73
+ begin
74
+ restore(tmp_file.path, checksum_a)
75
+ file_diff = Puppet::Util::Diff.diff(tmp_file.path, file_b)
76
+ ensure
77
+ tmp_file.close
78
+ tmp_file.unlink
79
+ end
80
+ else
81
+ raise Puppet::Error, "Please provide a file or checksum do diff with"
82
+ end
83
+ elsif file_a
84
+ if checksum_b
85
+ tmp_file = ::Tempfile.new('diff')
86
+ begin
87
+ restore(tmp_file.path, checksum_b)
88
+ file_diff = Puppet::Util::Diff.diff(file_a, tmp_file.path)
89
+ ensure
90
+ tmp_file.close
91
+ tmp_file.unlink
92
+ end
93
+ elsif file_b
94
+ file_diff = Puppet::Util::Diff.diff(file_a, file_b)
95
+ end
96
+ end
97
+ raise Puppet::Error, "Failed to diff files" unless file_diff
98
+ file_diff.to_s
99
+ end
100
+
59
101
  # Retrieves a file by sum.
60
102
  def getfile(sum)
61
103
  get_bucket_file(sum).to_s
@@ -109,10 +151,24 @@ class Puppet::FileBucket::Dipper
109
151
  end
110
152
  end
111
153
 
154
+ # List Filebucket content.
155
+ def list(fromdate, todate)
156
+ raise Puppet::Error, "Listing remote file buckets is not allowed" unless local?
157
+
158
+ source_path = "#{@rest_path}#{@checksum_type}/"
159
+ file_bucket_list = Puppet::FileBucket::File.indirection.find(
160
+ source_path,
161
+ :bucket_path => @local_path,
162
+ :list_all => true,
163
+ :fromdate => fromdate,
164
+ :todate => todate)
165
+ raise Puppet::Error, "File not found" unless file_bucket_list
166
+ file_bucket_list.to_s
167
+ end
168
+
112
169
  private
113
170
  def absolutize_path( path )
114
171
  Pathname.new(path).realpath
115
172
  end
116
173
 
117
174
  end
118
-
@@ -349,12 +349,10 @@ module Puppet::Functions
349
349
  def block_param(*type_and_name)
350
350
  case type_and_name.size
351
351
  when 0
352
- # the type must be an independent instance since it will be contained in another type
353
- type = @all_callables.copy
352
+ type = @all_callables
354
353
  name = :block
355
354
  when 1
356
- # the type must be an independent instance since it will be contained in another type
357
- type = @all_callables.copy
355
+ type = @all_callables
358
356
  name = type_and_name[0]
359
357
  when 2
360
358
  type_string, name = type_and_name
@@ -1,18 +1,54 @@
1
- # Returns the given value if it is an instance of the given type, and raises an error otherwise.
2
- # Optionally, if a block is given (accepting two parameters), it will be called instead of raising
3
- # an error. This to enable giving the user richer feedback, or to supply a default value.
1
+ # Returns the given value if it is of the given
2
+ # [data type](https://docs.puppetlabs.com/puppet/latest/reference/lang_data.html), or
3
+ # otherwise either raises an error or executes an optional two-parameter
4
+ # [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html).
4
5
  #
5
- # @example how to assert type
6
- # # assert that `$b` is a non empty `String` and assign to `$a`
7
- # $a = assert_type(String[1], $b)
6
+ # The function takes two mandatory arguments, in this order:
8
7
  #
9
- # @example using custom error message
10
- # $a = assert_type(String[1], $b) |$expected, $actual| { fail("The name cannot be empty") }
8
+ # 1. The expected data type.
9
+ # 2. A value to compare against the expected data type.
11
10
  #
12
- # @example using a warning and a default
13
- # $a = assert_type(String[1], $b) |$expected, $actual| { warning("Name is empty, using default") 'anonymous' }
11
+ # @example Using `assert_type`
14
12
  #
15
- # See the documentation for "The Puppet Type System" for more information about types.
13
+ # ~~~ puppet
14
+ # $raw_username = 'Amy Berry'
15
+ #
16
+ # # Assert that $raw_username is a non-empty string and assign it to $valid_username.
17
+ # $valid_username = assert_type(String[1], $raw_username)
18
+ #
19
+ # # $valid_username contains "Amy Berry".
20
+ # # If $raw_username was an empty string or a different data type, the Puppet run would
21
+ # # fail with an "Expected type does not match actual" error.
22
+ # ~~~
23
+ #
24
+ # You can use an optional lambda to provide enhanced feedback. The lambda takes two
25
+ # mandatory parameters, in this order:
26
+ #
27
+ # 1. The expected data type as described in the function's first argument.
28
+ # 2. The actual data type of the value.
29
+ #
30
+ # @example Using `assert_type` with a warning and default value
31
+ #
32
+ # ~~~ puppet
33
+ # $raw_username = 'Amy Berry'
34
+ #
35
+ # # Assert that $raw_username is a non-empty string and assign it to $valid_username.
36
+ # # If it isn't, output a warning describing the problem and use a default value.
37
+ # $valid_username = assert_type(String[1], $raw_username) |$expected, $actual| {
38
+ # warning( "The username should be \'${expected}\', not \'${actual}\'. Using 'anonymous'." )
39
+ # 'anonymous'
40
+ # }
41
+ #
42
+ # # $valid_username contains "Amy Berry".
43
+ # # If $raw_username was an empty string, the Puppet run would set $valid_username to
44
+ # # "anonymous" and output a warning: "The username should be 'String[1, default]', not
45
+ # # 'String[0, 0]'. Using 'anonymous'."
46
+ # ~~~
47
+ #
48
+ # For more information about data types, see the
49
+ # [documentation](https://docs.puppetlabs.com/puppet/latest/reference/lang_data.html).
50
+ #
51
+ # @since 4.0.0
16
52
  #
17
53
  Puppet::Functions.create_function(:assert_type) do
18
54
  dispatch :assert_type do
@@ -42,7 +78,7 @@ Puppet::Functions.create_function(:assert_type) do
42
78
  # Do not give all the details - i.e. format as Integer, instead of Integer[n, n] for exact value, which
43
79
  # is just confusing. (OTOH: may need to revisit, or provide a better "type diff" output.
44
80
  #
45
- actual = Puppet::Pops::Types::TypeCalculator.generalize!(inferred_type)
81
+ actual = Puppet::Pops::Types::TypeCalculator.generalize(inferred_type)
46
82
  raise Puppet::Pops::Types::TypeAssertionError.new("assert_type(): Expected type #{type} does not match actual: #{actual}", type,actual)
47
83
  end
48
84
  end
@@ -1,70 +1,101 @@
1
- # Determines whether
2
- # a given class or resource type is defined. This function can also determine whether a
3
- # specific resource has been declared, or whether a variable has been assigned a value
4
- # (including undef...as opposed to never having been assigned anything). Returns true
5
- # or false. Accepts class names, type names, resource references, and variable
6
- # reference strings of the form '$name'. When more than one argument is
7
- # supplied, defined() returns true if any are defined.
1
+ # Determines whether a given class or resource type is defined and returns a Boolean
2
+ # value. You can also use `defined` to determine whether a specific resource is defined,
3
+ # or whether a variable has a value (including `undef`, as opposed to the variable never
4
+ # being declared or assigned).
5
+ #
6
+ # This function takes at least one string argument, which can be a class name, type name,
7
+ # resource reference, or variable reference of the form `'$name'`.
8
8
  #
9
9
  # The `defined` function checks both native and defined types, including types
10
- # provided as plugins via modules. Types and classes are both checked using their names:
10
+ # provided by modules. Types and classes are matched by their names. The function matches
11
+ # resource declarations by using resource references.
12
+ #
13
+ # **Examples**: Different types of `defined` function matches
14
+ #
15
+ # ~~~ puppet
16
+ # # Matching resource types
17
+ # defined("file")
18
+ # defined("customtype")
19
+ #
20
+ # # Matching defines and classes
21
+ # defined("foo")
22
+ # defined("foo::bar")
23
+ #
24
+ # # Matching variables
25
+ # defined('$name')
26
+ #
27
+ # # Matching declared resources
28
+ # defined(File['/tmp/file'])
29
+ # ~~~
30
+ #
31
+ # Puppet depends on the configuration's evaluation order when checking whether a resource
32
+ # is declared.
11
33
  #
12
- # defined("file")
13
- # defined("customtype")
14
- # defined("foo")
15
- # defined("foo::bar")
16
- # defined('$name')
34
+ # @example Importance of evaluation order when using `defined`
17
35
  #
18
- # Resource declarations are checked using resource references, e.g.
19
- # `defined( File['/tmp/myfile'] )`, or `defined( Class[myclass] )`.
20
- # Checking whether a given resource
21
- # has been declared is, unfortunately, dependent on the evaluation order of
22
- # the configuration, and the following code will not work:
36
+ # ~~~ puppet
37
+ # # Assign values to $is_defined_before and $is_defined_after using identical `defined`
38
+ # # functions.
23
39
  #
24
- # if defined(File['/tmp/foo']) {
25
- # notify { "This configuration includes the /tmp/foo file.":}
26
- # }
27
- # file { "/tmp/foo":
28
- # ensure => present,
29
- # }
40
+ # $is_defined_before = defined(File['/tmp/file'])
30
41
  #
31
- # However, this order requirement refers to evaluation order only, and ordering of
32
- # resources in the configuration graph (e.g. with `before` or `require`) does not
33
- # affect the behavior of `defined`.
42
+ # file { "/tmp/file":
43
+ # ensure => present,
44
+ # }
34
45
  #
35
- # You may also search using types:
46
+ # $is_defined_after = defined(File['/tmp/file'])
36
47
  #
37
- # defined(Resource['file','/some/file'])
38
- # defined(File['/some/file'])
39
- # defined(Class['foo'])
48
+ # # $is_defined_before returns false, but $is_defined_after returns true.
49
+ # ~~~
40
50
  #
41
- # The `defined` function does not answer if data types (e.g. `Integer`) are defined. If
42
- # given the string 'integer' the result is false, and if given a non CatalogEntry type,
43
- # an error is raised.
51
+ # This order requirement only refers to evaluation order. The order of resources in the
52
+ # configuration graph (e.g. with `before` or `require`) does not affect the `defined`
53
+ # function's behavior.
44
54
  #
45
- # The rules for asking for undef, empty strings, and the main class are different from 3.x
46
- # (non future parser) and 4.x (with future parser or in Puppet 4.0.0 and later):
55
+ # > **Warning:** Avoid relying on the result of the `defined` function in modules, as you
56
+ # > might not be able to guarantee the evaluation order well enough to produce consistent
57
+ # > results. This can cause other code that relies on the function's result to behave
58
+ # > inconsistently or fail.
47
59
  #
48
- # defined('') # 3.x => true, 4.x => false
49
- # defined(undef) # 3.x => true, 4.x => error
50
- # defined('main') # 3.x => false, 4.x => true
60
+ # If you pass more than one argument to `defined`, the function returns `true` if _any_
61
+ # of the arguments are defined. You can also match resources by type, allowing you to
62
+ # match conditions of different levels of specificity, such as whether a specific resource
63
+ # is of a specific data type.
51
64
  #
52
- # With the future parser, it is also possible to ask specifically if a name is
53
- # a resource type (built in or defined), or a class, by giving its type:
65
+ # @example Matching multiple resources and resources by different types with `defined`
54
66
  #
55
- # defined(Type[Class['foo']])
56
- # defined(Type[Resource['foo']])
67
+ # ~~~ puppet
68
+ # file { "/tmp/file1":
69
+ # ensure => file,
70
+ # }
57
71
  #
58
- # Which is different from asking:
72
+ # $tmp_file = file { "/tmp/file2":
73
+ # ensure => file,
74
+ # }
59
75
  #
60
- # defined('foo')
76
+ # # Each of these statements return `true` ...
77
+ # defined(File['/tmp/file1'])
78
+ # defined(File['/tmp/file1'],File['/tmp/file2'])
79
+ # defined(File['/tmp/file1'],File['/tmp/file2'],File['/tmp/file3'])
80
+ # # ... but this returns `false`.
81
+ # defined(File['/tmp/file3'])
61
82
  #
62
- # Since the later returns true if 'foo' is either a class, a built-in resource type, or a user defined
63
- # resource type, and a specific request like `Type[Class['foo']]` only returns true if `'foo'` is a class.
83
+ # # Each of these statements returns `true` ...
84
+ # defined(Type[Resource['file','/tmp/file2']])
85
+ # defined(Resource['file','/tmp/file2'])
86
+ # defined(File['/tmp/file2'])
87
+ # defined('$tmp_file')
88
+ # # ... but each of these returns `false`.
89
+ # defined(Type[Resource['exec','/tmp/file2']])
90
+ # defined(Resource['exec','/tmp/file2'])
91
+ # defined(File['/tmp/file3'])
92
+ # defined('$tmp_file2')
93
+ # ~~~
64
94
  #
65
95
  # @since 2.7.0
66
- # @since 3.6.0 variable reference and future parser types")
96
+ # @since 3.6.0 variable reference and future parser types
67
97
  # @since 3.8.1 type specific requests with future parser
98
+ # @since 4.0.0
68
99
  #
69
100
  Puppet::Functions.create_function(:'defined', Puppet::Functions::InternalFunction) do
70
101
 
@@ -1,38 +1,96 @@
1
- # Applies a parameterized block to each element in a sequence of selected entries from the first
2
- # argument and returns the first argument.
1
+ # Runs a [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # repeatedly using each value in a data structure, then returns the values unchanged.
3
3
  #
4
- # This function takes two mandatory arguments: the first should be an Array or a Hash or something that is
5
- # of enumerable type (integer, Integer range, or String), and the second
6
- # a parameterized block as produced by the puppet syntax:
4
+ # This function takes two mandatory arguments, in this order:
7
5
  #
8
- # $a.each |$x| { ... }
9
- # each($a) |$x| { ... }
6
+ # 1. An array or hash the function will iterate over.
7
+ # 2. A lambda, which the function calls for each element in the first argument. It can
8
+ # request one or two parameters.
10
9
  #
11
- # When the first argument is an Array (or of enumerable type other than Hash), the parameterized block
12
- # should define one or two block parameters.
13
- # For each application of the block, the next element from the array is selected, and it is passed to
14
- # the block if the block has one parameter. If the block has two parameters, the first is the elements
15
- # index, and the second the value. The index starts from 0.
10
+ # @example Using the `each` function
16
11
  #
17
- # $a.each |$index, $value| { ... }
18
- # each($a) |$index, $value| { ... }
12
+ # `$data.each |$parameter| { <PUPPET CODE BLOCK> }`
19
13
  #
20
- # When the first argument is a Hash, the parameterized block should define one or two parameters.
21
- # When one parameter is defined, the iteration is performed with each entry as an array of `[key, value]`,
22
- # and when two parameters are defined the iteration is performed with key and value.
14
+ # or
23
15
  #
24
- # $a.each |$entry| { ..."key ${$entry[0]}, value ${$entry[1]}" }
25
- # $a.each |$key, $value| { ..."key ${key}, value ${value}" }
16
+ # `each($data) |$parameter| { <PUPPET CODE BLOCK> }`
26
17
  #
27
- # @example using each
18
+ # When the first argument (`$data` in the above example) is an array, Puppet passes each
19
+ # value in turn to the lambda, then returns the original values.
28
20
  #
29
- # [1,2,3].each |$val| { ... } # 1, 2, 3
30
- # [5,6,7].each |$index, $val| { ... } # (0, 5), (1, 6), (2, 7)
31
- # {a=>1, b=>2, c=>3}].each |$val| { ... } # ['a', 1], ['b', 2], ['c', 3]
32
- # {a=>1, b=>2, c=>3}.each |$key, $val| { ... } # ('a', 1), ('b', 2), ('c', 3)
33
- # Integer[ 10, 20 ].each |$index, $value| { ... } # (0, 10), (1, 11) ...
34
- # "hello".each |$char| { ... } # 'h', 'e', 'l', 'l', 'o'
35
- # 3.each |$number| { ... } # 0, 1, 2
21
+ # @example Using the `each` function with an array and a one-parameter lambda
22
+ #
23
+ # ~~~ puppet
24
+ # # For the array $data, run a lambda that creates a resource for each item.
25
+ # $data = ["routers", "servers", "workstations"]
26
+ # $data.each |$item| {
27
+ # notify { $item:
28
+ # message => $item
29
+ # }
30
+ # }
31
+ # # Puppet creates one resource for each of the three items in $data. Each resource is
32
+ # # named after the item's value and uses the item's value in a parameter.
33
+ # ~~~
34
+ #
35
+ # When the first argument is a hash, Puppet passes each key and value pair to the lambda
36
+ # as an array in the form `[key, value]` and returns the original hash.
37
+ #
38
+ # @example Using the `each` function with a hash and a one-parameter lambda
39
+ #
40
+ # ~~~ puppet
41
+ # # For the hash $data, run a lambda using each item as a key-value array that creates a
42
+ # # resource for each item.
43
+ # $data = {"rtr" => "Router", "svr" => "Server", "wks" => "Workstation"}
44
+ # $data.each |$items| {
45
+ # notify { $items[0]:
46
+ # message => $items[1]
47
+ # }
48
+ # }
49
+ # # Puppet creates one resource for each of the three items in $data, each named after the
50
+ # # item's key and containing a parameter using the item's value.
51
+ # ~~~
52
+ #
53
+ # When the first argument is an array and the lambda has two parameters, Puppet passes the
54
+ # array's indexes (enumerated from 0) in the first parameter and its values in the second
55
+ # parameter.
56
+ #
57
+ # @example Using the `each` function with an array and a two-parameter lambda
58
+ #
59
+ # ~~~ puppet
60
+ # # For the array $data, run a lambda using each item's index and value that creates a
61
+ # # resource for each item.
62
+ # $data = ["routers", "servers", "workstations"]
63
+ # $data.each |$index, $value| {
64
+ # notify { $value:
65
+ # message => $index
66
+ # }
67
+ # }
68
+ # # Puppet creates one resource for each of the three items in $data, each named after the
69
+ # # item's value and containing a parameter using the item's index.
70
+ # ~~~
71
+ #
72
+ # When the first argument is a hash, Puppet passes its keys to the first parameter and its
73
+ # values to the second parameter.
74
+ #
75
+ # @example Using the `each` function with a hash and a two-parameter lambda
76
+ #
77
+ # ~~~ puppet
78
+ # # For the hash $data, run a lambda using each item's key and value to create a resource
79
+ # # for each item.
80
+ # $data = {"rtr" => "Router", "svr" => "Server", "wks" => "Workstation"}
81
+ # $data.each |$key, $value| {
82
+ # notify { $key:
83
+ # message => $value
84
+ # }
85
+ # }
86
+ # # Puppet creates one resource for each of the three items in $data, each named after the
87
+ # # item's key and containing a parameter using the item's value.
88
+ # ~~~
89
+ #
90
+ # For an example that demonstrates how to create multiple `file` resources using `each`,
91
+ # see the Puppet
92
+ # [iteration](https://docs.puppetlabs.com/puppet/latest/reference/lang_iteration.html)
93
+ # documentation.
36
94
  #
37
95
  # @since 4.0.0
38
96
  #