puppet 4.3.2 → 4.4.0

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 (487) hide show
  1. checksums.yaml +4 -4
  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/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. 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
  328. 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
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. 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
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. 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
  333. 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
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -0,0 +1,82 @@
1
+ # Reverses the order of the elements of something that is iterable and optionally runs a
2
+ # [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html) for each
3
+ # element.
4
+ #
5
+ # This function takes one to two arguments.
6
+ #
7
+ # 1. An `Iterable` that the function will iterate over.
8
+ # 2. An optional lambda, which the function calls for each element in the first argument. It must
9
+ # request one parameter.
10
+ #
11
+ # @example Using the `reverse_each` function
12
+ #
13
+ # `$data.reverse_each |$parameter| { <PUPPET CODE BLOCK> }`
14
+ #
15
+ # or
16
+ #
17
+ # `$reverse_data = $data.reverse_each`
18
+ #
19
+ # or
20
+ #
21
+ # `reverse_each($data) |$parameter| { <PUPPET CODE BLOCK> }`
22
+ #
23
+ # or
24
+ #
25
+ # `$reverse_data = reverse_each($data)`
26
+ #
27
+ # When no second argument is present, Puppet returns an `Iterable` that represents the reverse
28
+ # order of its first argument. This allows methods on `Iterable` to be chained.
29
+ #
30
+ # When a lamdba is given as the second argument, Puppet iterates the first argument in reverse
31
+ # order and passes each value in turn to the lambda, then returns `undef`.
32
+ #
33
+ # @example Using the `reverse_each` function with an array and a one-parameter lambda
34
+ #
35
+ # ~~~ puppet
36
+ # # Puppet will log a notice for each of the three items in $data in reverse order.
37
+ # $data = [1,2,3]
38
+ # $data.reverse_each |$item| { notice($item) }
39
+ #
40
+ # ~~~
41
+ #
42
+ # When no second argument is present, Puppet returns a new `Iterable` which allows it to
43
+ # be directly chained into another function that takes an `Iterable` as an argument.
44
+ #
45
+ # @example Using the `reverse_each` function chained with a `map` function.
46
+ #
47
+ # # For the array $data, return an array containing each value multiplied by 10 in reverse order
48
+ # $data = [1,2,3]
49
+ # $transformed_data = $data.reverse_each.map |$item| { $item * 10 }
50
+ # # $transformed_data is set to [30,20,10]
51
+ # ~~~
52
+ #
53
+ # @example The same example using `reverse_each` function chained with a `map` in alternative syntax
54
+ #
55
+ # # For the array $data, return an array containing each value multiplied by 10 in reverse order
56
+ # $data = [1,2,3]
57
+ # $transformed_data = map(reverse_each($data)) |$item| { $item * 10 }
58
+ # # $transformed_data is set to [30,20,10]
59
+ # ~~~
60
+ #
61
+ # @since 4.4.0
62
+ #
63
+ Puppet::Functions.create_function(:reverse_each) do
64
+ dispatch :reverse_each do
65
+ param 'Iterable', :iterable
66
+ end
67
+
68
+ dispatch :reverse_each_block do
69
+ param 'Iterable', :iterable
70
+ block_param 'Callable[1,1]', :block
71
+ end
72
+
73
+ def reverse_each(iterable)
74
+ # produces an Iterable
75
+ Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).reverse_each
76
+ end
77
+
78
+ def reverse_each_block(iterable, &block)
79
+ Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).reverse_each(&block)
80
+ nil
81
+ end
82
+ end
@@ -1,23 +1,16 @@
1
- # Scans a string and returns an array of one or more converted values as directed by a given format string.args
2
- # See the documenation of Ruby's String::scanf method for details about the supported formats (which
3
- # are similar but not identical to the formats used in Puppet's `sprintf` function.
4
- #
5
- # This function takes two mandatory arguments: the first is the String to convert, and the second
6
- # the format String. A parameterized block may optionally be given, which is called with the result
7
- # that is produced by scanf if no block is present, the result of the block is then returned by
8
- # the function.
9
- #
10
- # The result of the scan is an Array, with each sucessfully scanned and transformed value.args The scanning
11
- # stops if a scan is unsuccesful and the scanned result up to that point is returned. If there was no
12
- # succesful scan at all, the result is an empty Array. The optional code block is typically used to
13
- # assert that the scan was succesful, and either produce the same input, or perform unwrapping of
14
- # the result
15
- #
16
- # @example scanning an integer in string form (result is an array with
17
- # integer, or empty if unsuccessful)
1
+ # Scans a string and returns an array of one or more converted values based on the given format string.
2
+ # See the documenation of Ruby's String#scanf method for details about the supported formats (which
3
+ # are similar but not identical to the formats used in Puppet's `sprintf` function.)
4
+ #
5
+ # This function takes two mandatory arguments: the first is the string to convert, and the second is
6
+ # the format string. The result of the scan is an array, with each sucessfully scanned and transformed value.
7
+ # The scanning stops if a scan is unsuccesful, and the scanned result up to that point is returned. If there
8
+ # was no succesful scan, the result is an empty array.
9
+ #
18
10
  # "42".scanf("%i")
19
11
  #
20
- # @example scanning and processing resulting array to assert result and unwrap
12
+ # You can also optionally pass a lambda to scanf, to do additional validation or processing.
13
+ #
21
14
  #
22
15
  # "42".scanf("%i") |$x| {
23
16
  # unless $x[0] =~ Integer {
@@ -26,6 +19,10 @@
26
19
  # $x[0]
27
20
  # }
28
21
  #
22
+ #
23
+ #
24
+ #
25
+ #
29
26
  # @since 4.0.0
30
27
  #
31
28
  Puppet::Functions.create_function(:scanf) do
@@ -1,51 +1,45 @@
1
- # Applies a parameterized block to each _slice_ of elements in a sequence of selected entries from the first
2
- # argument and returns the first argument, or if no block is given returns a new array with a concatenation of
3
- # the slices.
1
+ # This function takes two mandatory arguments: the first should be an array or hash, and the second specifies
2
+ # the number of elements to include in each slice.
4
3
  #
5
- # This function takes two mandatory arguments: the first, `$a`, should be an Array, Hash, or something of
6
- # enumerable type (integer, Integer range, or String), and the second, `$n`, the number of elements to include
7
- # in each slice. The optional third argument should be a a parameterized block as produced by the puppet syntax:
8
- #
9
- # $a.slice($n) |$x| { ... }
10
- # slice($a) |$x| { ... }
11
- #
12
- # The parameterized block should have either one parameter (receiving an array with the slice), or the same number
13
- # of parameters as specified by the slice size (each parameter receiving its part of the slice).
14
- # In case there are fewer remaining elements than the slice size for the last slice it will contain the remaining
15
- # elements. When the block has multiple parameters, excess parameters are set to undef for an array or
16
- # enumerable type, and to empty arrays for a Hash.
17
- #
18
- # $a.slice(2) |$first, $second| { ... }
19
- #
20
- # When the first argument is a Hash, each `key,value` entry is counted as one, e.g, a slice size of 2 will produce
4
+ # When the first argument is a hash, each key value pair is counted as one. For example, a slice size of 2 will produce
21
5
  # an array of two arrays with key, and value.
22
6
  #
23
- # @example Using slice with Hash
24
- #
25
7
  # $a.slice(2) |$entry| { notice "first ${$entry[0]}, second ${$entry[1]}" }
26
8
  # $a.slice(2) |$first, $second| { notice "first ${first}, second ${second}" }
27
9
  #
28
- # When called without a block, the function produces a concatenated result of the slices.
29
- #
30
- # @example Using slice without a block
10
+ # The function produces a concatenated result of the slices.
31
11
  #
32
12
  # slice([1,2,3,4,5,6], 2) # produces [[1,2], [3,4], [5,6]]
33
13
  # slice(Integer[1,6], 2) # produces [[1,2], [3,4], [5,6]]
34
14
  # slice(4,2) # produces [[0,1], [2,3]]
35
15
  # slice('hello',2) # produces [[h, e], [l, l], [o]]
36
16
  #
17
+ #
18
+ # You can also optionally pass a lambda to slice.
19
+ #
20
+ # $a.slice($n) |$x| { ... }
21
+ # slice($a) |$x| { ... }
22
+ #
23
+ # The lambda should have either one parameter (receiving an array with the slice), or the same number
24
+ # of parameters as specified by the slice size (each parameter receiving its part of the slice).
25
+ # If there are fewer remaining elements than the slice size for the last slice, it will contain the remaining
26
+ # elements. If the lambda has multiple parameters, excess parameters are set to undef for an array, or
27
+ # to empty arrays for a hash.
28
+ #
29
+ # $a.slice(2) |$first, $second| { ... }
30
+ #
37
31
  # @since 4.0.0
38
32
  #
39
33
  Puppet::Functions.create_function(:slice) do
40
34
  dispatch :slice_Hash do
41
35
  param 'Hash[Any, Any]', :hash
42
- param 'Integer[1, default]', :slize_size
36
+ param 'Integer[1, default]', :slice_size
43
37
  optional_block_param
44
38
  end
45
39
 
46
40
  dispatch :slice_Enumerable do
47
- param 'Any', :enumerable
48
- param 'Integer[1, default]', :slize_size
41
+ param 'Iterable', :enumerable
42
+ param 'Integer[1, default]', :slice_size
49
43
  optional_block_param
50
44
  end
51
45
 
@@ -55,7 +49,7 @@ Puppet::Functions.create_function(:slice) do
55
49
  end
56
50
 
57
51
  def slice_Enumerable(enumerable, slice_size, &pblock)
58
- enum = asserted_enumerable(enumerable)
52
+ enum = Puppet::Pops::Types::Iterable.asserted_iterable(self, enumerable)
59
53
  result = slice_Common(enum, slice_size, nil, block_given? ? pblock : nil)
60
54
  block_given? ? enumerable : result
61
55
  end
@@ -114,12 +108,4 @@ Puppet::Functions.create_function(:slice) do
114
108
  end
115
109
  serving_size
116
110
  end
117
-
118
- def asserted_enumerable(obj)
119
- unless enum = Puppet::Pops::Types::Enumeration.enumerator(obj)
120
- raise ArgumentError, ("#{self.class.name}(): wrong argument type (#{obj.class}; must be something enumerable.")
121
- end
122
- enum
123
- end
124
-
125
111
  end
@@ -6,7 +6,7 @@
6
6
  # $string = 'v1.v2:v3.v4'
7
7
  # $array_var1 = split($string, /:/)
8
8
  # $array_var2 = split($string, '[.]')
9
- # $array_var3 = split($string, Regexp('[.:]'))
9
+ # $array_var3 = split($string, Regexp['[.:]'])
10
10
  #
11
11
  # `$array_var1` now holds the result `['v1.v2', 'v3.v4']`,
12
12
  # while `$array_var2` holds `['v1', 'v2:v3', 'v4']`, and
@@ -15,7 +15,7 @@
15
15
  # Note that in the second example, we split on a literal string that contains
16
16
  # a regexp meta-character (.), which must be escaped. A simple
17
17
  # way to do that for a single character is to enclose it in square
18
- # brackets; a backslash will also escape a single character.") do |args|
18
+ # brackets; a backslash will also escape a single character.
19
19
  #
20
20
  Puppet::Functions.create_function(:split) do
21
21
  dispatch :split_String do
@@ -0,0 +1,88 @@
1
+ # Provides stepping with given interval over elements in an iterable and optionally runs a
2
+ # [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html) for each
3
+ # element.
4
+ #
5
+ # This function takes two to three arguments.
6
+ #
7
+ # 1. An 'Iterable' that the function will iterate over.
8
+ # 2. An `Integer` step factor. This must be a positive integer.
9
+ # 3. An optional lambda, which the function calls for each element in the interval. It must
10
+ # request one parameter.
11
+ #
12
+ # @example Using the `step` function
13
+ #
14
+ # `$data.step(<n>) |$parameter| { <PUPPET CODE BLOCK> }`
15
+ #
16
+ # or
17
+ #
18
+ # `$stepped_data = $data.step(<n>)`
19
+ #
20
+ # or
21
+ #
22
+ # `step($data, <n>) |$parameter| { <PUPPET CODE BLOCK> }`
23
+ #
24
+ # or
25
+ #
26
+ # `$stepped_data = step($data, <n>)`
27
+ #
28
+ # When no block is given, Puppet returns an `Iterable` that yields the first element and every nth successor
29
+ # element, from its first argument. This allows functions on iterables to be chained.
30
+ #
31
+ # When a block is given, Puppet iterates and calls the block with the first element and then with
32
+ # every nth successor element. It then returns `undef`.
33
+ #
34
+ # @example Using the `step` function with an array, a step factor, and a one-parameter block
35
+ #
36
+ # ~~~ puppet
37
+ # # For the array $data, call a block with the first element and then with each 3rd successor element
38
+ # $data = [1,2,3,4,5,6,7,8]
39
+ # $data.step(3) |$item| {
40
+ # notice($item)
41
+ # }
42
+ # # Puppet notices the values '1', '4', '7'.
43
+ # ~~~
44
+ #
45
+ # When no block is given, Puppet returns a new `Iterable` which allows it to be directly chained into
46
+ # another function that takes an `Iterable` as an argument.
47
+ #
48
+ # @example Using the `step` function chained with a `map` function.
49
+ #
50
+ # # For the array $data, return an array, set to the first element and each 5th successor element, in reverse
51
+ # # order multiplied by 10
52
+ # $data = Integer[0,20]
53
+ # $transformed_data = $data.step(5).map |$item| { $item * 10 }
54
+ # # $transformed_data contains [0,50,100,150,200]
55
+ # ~~~
56
+ #
57
+ # @example The same example using `step` function chained with a `map` in alternative syntax
58
+ #
59
+ # # For the array $data, return an array, set to the first and each 5th successor, in reverse order, multiplied by 10
60
+ # $data = Integer[0,20]
61
+ # $transformed_data = map(step($data, 5)) |$item| { $item * 10 }
62
+ # # $transformed_data contains [0,50,100,150,200]
63
+ # ~~~
64
+ #
65
+ # @since 4.4.0
66
+ #
67
+ Puppet::Functions.create_function(:step) do
68
+ dispatch :step do
69
+ param 'Iterable', :iterable
70
+ param 'Integer[1]', :step
71
+ end
72
+
73
+ dispatch :step_block do
74
+ param 'Iterable', :iterable
75
+ param 'Integer[1]', :step
76
+ block_param 'Callable[1,1]', :block
77
+ end
78
+
79
+ def step(iterable, step)
80
+ # produces an Iterable
81
+ Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).step(step)
82
+ end
83
+
84
+ def step_block(iterable, step, &block)
85
+ Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).step(step, &block)
86
+ nil
87
+ end
88
+ end
@@ -0,0 +1,70 @@
1
+ # Returns the data type of a given value with a given degree of generality.
2
+ #
3
+ # @example Using `type()`
4
+ #
5
+ # ~~~ puppet
6
+ # notice type(42) =~ Type[Integer]
7
+ # ~~~
8
+ #
9
+ # Would notice true
10
+ #
11
+ # By default, the best possible inference is made where all details are retained.
12
+ # This is good when the type is used for futher type calculations but is overwhelmingly
13
+ # rich i information if it is used in a error message.
14
+ #
15
+ # The optional argument `inference_method` may be given as (from lowest to highest fidelity):
16
+ #
17
+ # * ´generalized` - reduces to common type and drops size constraints
18
+ # * `reduced` - reduces to common type in collections
19
+ # * `detailed` - (defaut) all details about inferred types is retained
20
+ #
21
+ # @example Using `type()` with different qualities:
22
+ #
23
+ # ~~~ puppet
24
+ # notice type([3.14, 42], generalized)
25
+ # notice type([3.14, 42], reduced)
26
+ # notice type([3.14, 42], detailed)
27
+ # notice type([3.14, 42])
28
+ # ~~~
29
+ #
30
+ # Would notice the four values:
31
+ #
32
+ # 1. 'Array[Numeric]'
33
+ # 2. 'Array[Numeric, 2, 2]'
34
+ # 3. 'Tuple[Float[3.14], Integer[42,42]]]'
35
+ # 4. 'Tuple[Float[3.14], Integer[42,42]]]'
36
+ #
37
+ # @param value [Any] - the value for which data type is returned
38
+ # @param inference_type[Enum[generalized, reduced, detailed]] inference_type
39
+ # @returns [Type] - the inferred type
40
+ #
41
+ # @since 4.4.0
42
+ #
43
+ Puppet::Functions.create_function(:type) do
44
+ dispatch :type_detailed do
45
+ param 'Any', :value
46
+ optional_param 'Enum[detailed]', :inference_method
47
+ end
48
+
49
+ dispatch :type_parameterized do
50
+ param 'Any', :value
51
+ param 'Enum[reduced]', :inference_method
52
+ end
53
+
54
+ dispatch :type_generalized do
55
+ param 'Any', :value
56
+ param 'Enum[generalized]', :inference_method
57
+ end
58
+
59
+ def type_detailed(value, _ = nil)
60
+ Puppet::Pops::Types::TypeCalculator.infer_set(value)
61
+ end
62
+
63
+ def type_parameterized(value, _)
64
+ Puppet::Pops::Types::TypeCalculator.infer(value)
65
+ end
66
+
67
+ def type_generalized(value, _)
68
+ Puppet::Pops::Types::TypeCalculator.infer(value).generalize
69
+ end
70
+ end
@@ -26,7 +26,7 @@
26
26
  # iterated over in order. This is useful for many datasets.
27
27
  #
28
28
  # The implementation is adapted from Robert Sedgewick's Left Leaning Red-Black Tree implementation,
29
- # which can be found at http://www.cs.princeton.edu/~rs/talks/LLRB/Java/RedBlackBST.java
29
+ # which can be found at https://www.cs.princeton.edu/~rs/talks/LLRB/Java/RedBlackBST.java
30
30
  #
31
31
  # Most methods have O(log n) complexity.
32
32
 
@@ -2,12 +2,15 @@ require 'puppet/node'
2
2
  require 'puppet/resource/catalog'
3
3
  require 'puppet/indirector/code'
4
4
  require 'puppet/util/profiler'
5
+ require 'puppet/util/checksums'
5
6
  require 'yaml'
7
+ require 'uri'
6
8
 
7
9
  class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
8
10
  desc "Compiles catalogs on demand using Puppet's compiler."
9
11
 
10
12
  include Puppet::Util
13
+ include Puppet::Util::Checksums
11
14
 
12
15
  attr_accessor :code
13
16
 
@@ -47,7 +50,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
47
50
  node = node_from_request(request)
48
51
  node.trusted_data = Puppet.lookup(:trusted_information) { Puppet::Context::TrustedInformation.local(node) }.to_h
49
52
 
50
- if catalog = compile(node, request.options[:code_id])
53
+ if catalog = compile(node, request.options)
51
54
  return catalog
52
55
  else
53
56
  # This shouldn't actually happen; we should either return
@@ -81,23 +84,203 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
81
84
  node.add_server_facts(@server_facts)
82
85
  end
83
86
 
87
+ # Determine which checksum to use; if agent_checksum_type is not nil,
88
+ # use the first entry in it that is also in known_checksum_types.
89
+ # If no match is found, return nil.
90
+ def common_checksum_type(agent_checksum_type)
91
+ if agent_checksum_type
92
+ agent_checksum_types = agent_checksum_type.split('.').map {|type| type.to_sym}
93
+ checksum_type = agent_checksum_types.drop_while do |type|
94
+ not known_checksum_types.include? type
95
+ end.first
96
+ end
97
+ checksum_type
98
+ end
99
+
100
+ def get_content_uri(metadata, source, environment_path)
101
+ # The static file content server doesn't know how to expand mountpoints, so
102
+ # we need to do that ourselves from the actual system path of the source file.
103
+ # This does that, while preserving any user-specified server or port.
104
+ source_path = Pathname.new(metadata.full_path)
105
+ path = source_path.relative_path_from(environment_path).to_s
106
+ source_as_uri = URI.parse(URI.escape(source))
107
+ server = source_as_uri.host
108
+ port = ":#{source_as_uri.port}" if source_as_uri.port
109
+ return "puppet://#{server}#{port}/#{path}"
110
+ end
111
+
112
+ # Helper method to decide if a file resource's metadata can be inlined.
113
+ # Also used to profile/log reasons for not inlining.
114
+ def inlineable?(resource, sources)
115
+ case
116
+ when resource[:ensure] == 'absent'
117
+ return Puppet::Util::Profiler.profile("Not inlining absent resource", [:compiler, :static_compile_inlining, :skipped_file_metadata, :absent]) { false }
118
+ when sources.empty?
119
+ return Puppet::Util::Profiler.profile("Not inlining resource without sources", [:compiler, :static_compile_inlining, :skipped_file_metadata, :no_sources]) { false }
120
+ when (not (sources.all? {|source| source =~ /^puppet:/}))
121
+ return Puppet::Util::Profiler.profile("Not inlining unsupported source scheme", [:compiler, :static_compile_inlining, :skipped_file_metadata, :unsupported_scheme]) { false }
122
+ else
123
+ return true
124
+ end
125
+ end
126
+
127
+ # Return true if metadata is inlineable, meaning the request's source is
128
+ # for the 'modules' mount and the resolved path is of the form:
129
+ # $codedir/environments/$environment/*/*/files/**
130
+ def inlineable_metadata?(metadata, source, environment_path)
131
+ source_as_uri = URI.parse(URI.escape(source))
132
+ location = Puppet::Module::FILETYPES['files']
133
+
134
+ !!(source_as_uri.path =~ /^\/modules\// &&
135
+ metadata.full_path =~ /#{environment_path}[^\/]+\/[^\/]+\/#{location}\/.+/)
136
+ end
137
+
138
+ # Helper method to log file resources that could not be inlined because they
139
+ # fall outside of an environment.
140
+ def log_file_outside_environment
141
+ Puppet::Util::Profiler.profile("Not inlining file outside environment", [:compiler, :static_compile_inlining, :skipped_file_metadata, :file_outside_environment]) { true }
142
+ end
143
+
144
+ # Helper method to log file resources that were successfully inlined.
145
+ def log_metadata_inlining
146
+ Puppet::Util::Profiler.profile("Inlining file metadata", [:compiler, :static_compile_inlining, :inlined_file_metadata]) { true }
147
+ end
148
+
149
+ # Inline file metadata for static catalogs
150
+ # Initially restricted to files sourced from codedir via puppet:/// uri.
151
+ def inline_metadata(catalog, checksum_type)
152
+ environment_path = Pathname.new File.join(Puppet[:environmentpath], catalog.environment, "")
153
+ list_of_resources = catalog.resources.find_all { |res| res.type == "File" }
154
+
155
+ # TODO: get property/parameter defaults if entries are nil in the resource
156
+ # For now they're hard-coded to match the File type.
157
+
158
+ file_metadata = {}
159
+ list_of_resources.each do |resource|
160
+ sources = [resource[:source]].flatten.compact
161
+ next unless inlineable?(resource, sources)
162
+
163
+ # both need to handle multiple sources
164
+ if resource[:recurse] == true || resource[:recurse] == 'true' || resource[:recurse] == 'remote'
165
+ # Construct a hash mapping sources to arrays (list of files found recursively) of metadata
166
+ options = {
167
+ :environment => catalog.environment_instance,
168
+ :links => resource[:links] ? resource[:links].to_sym : :manage,
169
+ :checksum_type => resource[:checksum] ? resource[:checksum].to_sym : checksum_type.to_sym,
170
+ :source_permissions => resource[:source_permissions] ? resource[:source_permissions].to_sym : :ignore,
171
+ :recurse => true,
172
+ :recurselimit => resource[:recurselimit],
173
+ :ignore => resource[:ignore],
174
+ }
175
+
176
+ sources_in_environment = true
177
+
178
+ source_to_metadatas = {}
179
+ sources.each do |source|
180
+ source = Puppet::Type.type(:file).attrclass(:source).normalize(source)
181
+
182
+ if list_of_data = Puppet::FileServing::Metadata.indirection.search(source, options)
183
+ basedir_meta = list_of_data.find {|meta| meta.relative_path == '.'}
184
+ devfail "FileServing::Metadata search should always return the root search path" if basedir_meta.nil?
185
+
186
+ if ! inlineable_metadata?(basedir_meta, source, environment_path)
187
+ # If any source is not in the environment path, skip inlining this resource.
188
+ log_file_outside_environment
189
+ sources_in_environment = false
190
+ break
191
+ end
192
+
193
+ base_content_uri = get_content_uri(basedir_meta, source, environment_path)
194
+ list_of_data.each do |metadata|
195
+ if metadata.relative_path == '.'
196
+ metadata.content_uri = base_content_uri
197
+ else
198
+ metadata.content_uri = "#{base_content_uri}/#{metadata.relative_path}"
199
+ end
200
+ end
201
+
202
+ source_to_metadatas[source] = list_of_data
203
+ # Optimize for returning less data if sourceselect is first
204
+ if resource[:sourceselect] == 'first' || resource[:sourceselect].nil?
205
+ break
206
+ end
207
+ end
208
+ end
209
+
210
+ if sources_in_environment && !source_to_metadatas.empty?
211
+ log_metadata_inlining
212
+ catalog.recursive_metadata[resource.title] = source_to_metadatas
213
+ end
214
+ else
215
+ options = {
216
+ :environment => catalog.environment_instance,
217
+ :links => resource[:links] ? resource[:links].to_sym : :manage,
218
+ :checksum_type => resource[:checksum] ? resource[:checksum].to_sym : checksum_type.to_sym,
219
+ :source_permissions => resource[:source_permissions] ? resource[:source_permissions].to_sym : :ignore
220
+ }
221
+
222
+ metadata = nil
223
+ sources.each do |source|
224
+ source = Puppet::Type.type(:file).attrclass(:source).normalize(source)
225
+
226
+ if data = Puppet::FileServing::Metadata.indirection.find(source, options)
227
+ metadata = data
228
+ metadata.source = source
229
+ break
230
+ end
231
+ end
232
+
233
+ raise "Could not get metadata for #{resource[:source]}" unless metadata
234
+
235
+ if inlineable_metadata?(metadata, metadata.source, environment_path)
236
+ metadata.content_uri = get_content_uri(metadata, metadata.source, environment_path)
237
+ log_metadata_inlining
238
+
239
+ # If the file is in the environment directory, we can safely inline
240
+ catalog.metadata[resource.title] = metadata
241
+ else
242
+ # Log a profiler event that we skipped this file because it is not in an environment.
243
+ log_file_outside_environment
244
+ end
245
+ end
246
+ end
247
+ end
248
+
84
249
  # Compile the actual catalog.
85
- def compile(node, code_id)
86
- str = "Compiled catalog for #{node.name}"
250
+ def compile(node, options)
251
+ if node.environment && node.environment.static_catalogs? && options[:static_catalog] && options[:code_id]
252
+ # Check for errors before compiling the catalog
253
+ checksum_type = common_checksum_type(options[:checksum_type])
254
+ raise Puppet::Error, "Unable to find a common checksum type between agent '#{options[:checksum_type]}' and master '#{known_checksum_types}'." unless checksum_type
255
+ end
256
+
257
+ str = "Compiled %s for #{node.name}" % [checksum_type ? 'static catalog' : 'catalog']
87
258
  str += " in environment #{node.environment}" if node.environment
88
259
  config = nil
89
260
 
90
261
  benchmark(:notice, str) do
91
- Puppet::Util::Profiler.profile(str, [:compiler, :compile, node.environment, node.name]) do
262
+ compile_type = checksum_type ? :static_compile : :compile
263
+ Puppet::Util::Profiler.profile(str, [:compiler, compile_type, node.environment, node.name]) do
92
264
  begin
93
- config = Puppet::Parser::Compiler.compile(node, code_id)
265
+ config = Puppet::Parser::Compiler.compile(node, options[:code_id])
94
266
  rescue Puppet::Error => detail
95
267
  Puppet.err(detail.to_s) if networked?
96
268
  raise
97
269
  end
270
+
271
+ if checksum_type && config.is_a?(model)
272
+ str = "Inlined resource metadata into static catalog for #{node.name}"
273
+ str += " in environment #{node.environment}" if node.environment
274
+ benchmark(:notice, str) do
275
+ Puppet::Util::Profiler.profile(str, [:compiler, :static_compile_postprocessing, node.environment, node.name]) do
276
+ inline_metadata(config, checksum_type)
277
+ end
278
+ end
279
+ end
98
280
  end
99
281
  end
100
282
 
283
+
101
284
  config
102
285
  end
103
286