puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -3,7 +3,9 @@
3
3
  #
4
4
  class Puppet::DataProviders::LookupAdapter < Puppet::DataProviders::DataAdapter
5
5
 
6
- LOOKUP_OPTIONS = 'lookup_options'.freeze
6
+ LOOKUP_OPTIONS = Puppet::Pops::Lookup::LOOKUP_OPTIONS
7
+ LOOKUP_OPTIONS_PREFIX = LOOKUP_OPTIONS + '.'
8
+ LOOKUP_OPTIONS_PREFIX.freeze
7
9
  HASH = 'hash'.freeze
8
10
  MERGE = 'merge'.freeze
9
11
 
@@ -29,12 +31,43 @@ class Puppet::DataProviders::LookupAdapter < Puppet::DataProviders::DataAdapter
29
31
  # @throws :no_such_key if the given key is not found
30
32
  #
31
33
  def lookup(key, lookup_invocation, merge)
32
- merge = lookup_merge_options(key, lookup_invocation) if merge.nil?
33
- merge_strategy = Puppet::Pops::MergeStrategy.strategy(merge)
34
- lookup_invocation.with(:merge, merge_strategy) do
35
- result = merge_strategy.merge_lookup([:lookup_global, :lookup_in_environment, :lookup_in_module]) { |m| send(m, key, lookup_invocation, merge_strategy) }
36
- lookup_invocation.report_result(result)
37
- result
34
+ # The 'lookup_options' key is reserved and not found as normal data
35
+ if key == LOOKUP_OPTIONS || key.start_with?(LOOKUP_OPTIONS_PREFIX)
36
+ lookup_invocation.with(:invalid_key, LOOKUP_OPTIONS) do
37
+ throw :no_such_key
38
+ end
39
+ end
40
+
41
+ lookup_invocation.top_key ||= key
42
+ merge_explained = false
43
+ if lookup_invocation.explain_options?
44
+ catch(:no_such_key) do
45
+ module_name = extract_module_name(key) unless key == Puppet::Pops::Lookup::GLOBAL
46
+ lookup_invocation.module_name = module_name
47
+ if lookup_invocation.only_explain_options?
48
+ do_lookup(LOOKUP_OPTIONS, lookup_invocation, HASH)
49
+ return nil
50
+ end
51
+
52
+ # Bypass cache and do a "normal" lookup of the lookup_options
53
+ lookup_invocation.with(:meta, LOOKUP_OPTIONS) do
54
+ key_options = do_lookup(LOOKUP_OPTIONS, lookup_invocation, HASH)[key]
55
+ merge = key_options[MERGE] unless key_options.nil?
56
+ merge_explained = true
57
+ end
58
+ end
59
+ elsif merge.nil?
60
+ # Used cached lookup_options
61
+ merge = lookup_merge_options(key, lookup_invocation)
62
+ lookup_invocation.report_merge_source('lookup_options') unless merge.nil?
63
+ end
64
+
65
+ if merge_explained
66
+ # Merge lookup is explained in detail so we need to explain the data in a section
67
+ # on the same level to avoid confusion
68
+ lookup_invocation.with(:data, key) { do_lookup(key, lookup_invocation, merge) }
69
+ else
70
+ do_lookup(key, lookup_invocation, merge)
38
71
  end
39
72
  end
40
73
 
@@ -44,13 +77,15 @@ class Puppet::DataProviders::LookupAdapter < Puppet::DataProviders::DataAdapter
44
77
  lookup_invocation.with(:global, terminus) do
45
78
  catch(:no_such_key) do
46
79
  return lookup_invocation.report_found(name, Puppet::DataBinding.indirection.find(name,
47
- { :environment => @env.to_s, :variables => lookup_invocation.scope, :merge => merge_strategy }))
80
+ { :environment => @env, :variables => lookup_invocation.scope, :merge => merge_strategy }))
48
81
  end
49
82
  lookup_invocation.report_not_found(name)
50
83
  throw :no_such_key
51
84
  end
52
- rescue Puppet::DataBinding::LookupError => e
53
- raise Puppet::Error.new("Error from DataBinding '#{terminus}' while looking up '#{name}': #{e.message}", e)
85
+ rescue Puppet::DataBinding::LookupError => detail
86
+ error = Puppet::Error.new("Lookup of key '#{lookup_invocation.top_key}' failed: #{detail.message}")
87
+ error.set_backtrace(detail.backtrace)
88
+ raise error
54
89
  end
55
90
 
56
91
  # @api private
@@ -60,7 +95,7 @@ class Puppet::DataProviders::LookupAdapter < Puppet::DataProviders::DataAdapter
60
95
 
61
96
  # @api private
62
97
  def lookup_in_module(name, lookup_invocation, merge_strategy)
63
- module_name = extract_module_name(name)
98
+ module_name = lookup_invocation.module_name || extract_module_name(name)
64
99
 
65
100
  # Do not attempt to do a lookup in a module unless the name is qualified.
66
101
  throw :no_such_key if module_name.nil?
@@ -95,41 +130,52 @@ class Puppet::DataProviders::LookupAdapter < Puppet::DataProviders::DataAdapter
95
130
  module_name = extract_module_name(name)
96
131
 
97
132
  # Retrieve the options for the module. We use nil as a key in case we have none
98
- options = @lookup_options[module_name]
99
- if options.nil? && !@lookup_options.include?(module_name)
133
+ if !@lookup_options.include?(module_name)
100
134
  options = retrieve_lookup_options(module_name, lookup_invocation, Puppet::Pops::MergeStrategy.strategy(HASH))
101
135
  raise Puppet::DataBinding::LookupError.new("value of #{LOOKUP_OPTIONS} must be a hash") unless options.nil? || options.is_a?(Hash)
102
136
  @lookup_options[module_name] = options
137
+ else
138
+ options = @lookup_options[module_name]
103
139
  end
104
140
  options.nil? ? nil : options[name]
105
141
  end
106
142
 
107
143
  private
108
144
 
145
+ def do_lookup(key, lookup_invocation, merge)
146
+ merge_strategy = Puppet::Pops::MergeStrategy.strategy(merge)
147
+ lookup_invocation.with(:merge, merge_strategy) do
148
+ result = merge_strategy.merge_lookup([:lookup_global, :lookup_in_environment, :lookup_in_module]) { |m| send(m, key, lookup_invocation, merge_strategy) }
149
+ lookup_invocation.report_result(result)
150
+ result
151
+ end
152
+ end
153
+
109
154
  # Retrieve lookup options that applies when using a specific module (i.e. a merge of the pre-cached
110
155
  # `env_lookup_options` and the module specific data)
111
156
  def retrieve_lookup_options(module_name, lookup_invocation, merge_strategy)
112
- lookup_invocation.with(:meta, module_name) do
113
- env_opts = env_lookup_options(lookup_invocation, merge_strategy)
114
- options = nil
115
- unless module_name.nil?
116
- catch(:no_such_key) do
117
- options = module_provider(module_name).lookup(LOOKUP_OPTIONS, lookup_invocation, merge_strategy)
118
- options = merge_strategy.merge(env_opts, options) unless env_opts.nil?
119
- end
157
+ meta_invocation = Puppet::Pops::Lookup::Invocation.new(lookup_invocation.scope)
158
+ meta_invocation.top_key = lookup_invocation.top_key
159
+ env_opts = env_lookup_options(meta_invocation, merge_strategy)
160
+ unless module_name.nil? || @env.module(module_name).nil?
161
+ catch(:no_such_key) do
162
+ meta_invocation.module_name = module_name
163
+ options = module_provider(module_name).lookup(LOOKUP_OPTIONS, meta_invocation, merge_strategy)
164
+ options = merge_strategy.merge(env_opts, options) unless env_opts.nil?
165
+ return options
120
166
  end
121
- options.nil? ? env_opts : options
122
167
  end
168
+ env_opts
123
169
  end
124
170
 
125
171
  # Retrieve and cache lookup options specific to the environment that this adapter is attached to (i.e. a merge
126
172
  # of global and environment lookup options).
127
- def env_lookup_options(lookup_invocation, merge_strategy)
128
- unless instance_variable_defined?(:@env_lookup_options)
173
+ def env_lookup_options(meta_invocation, merge_strategy)
174
+ if !instance_variable_defined?(:@env_lookup_options)
129
175
  @env_lookup_options = nil
130
176
  catch(:no_such_key) do
131
177
  @env_lookup_options = merge_strategy.merge_lookup([:lookup_global, :lookup_in_environment]) do |m|
132
- send(m, LOOKUP_OPTIONS, lookup_invocation, merge_strategy)
178
+ send(m, LOOKUP_OPTIONS, meta_invocation, merge_strategy)
133
179
  end
134
180
  end
135
181
  end
@@ -170,7 +216,8 @@ class Puppet::DataProviders::LookupAdapter < Puppet::DataProviders::DataAdapter
170
216
  unless provider
171
217
  raise Puppet::Error.new("Environment '#{@env.name}', cannot find module_data_provider '#{provider_name}'")
172
218
  end
173
- provider
219
+ # Provider is configured per module but cached using environment life cycle so it must be cloned
220
+ provider.clone
174
221
  end
175
222
 
176
223
  def initialize_env_provider
@@ -5,8 +5,8 @@ require_relative 'hiera_interpolate'
5
5
 
6
6
  module Puppet::DataProviders
7
7
  class YamlDataProviderFactory < Puppet::Plugins::DataProviders::FileBasedDataProviderFactory
8
- def create(name, paths)
9
- YamlDataProvider.new(name, paths)
8
+ def create(name, paths, parent_data_provider)
9
+ YamlDataProvider.new(name, paths, parent_data_provider)
10
10
  end
11
11
 
12
12
  def path_extension
@@ -111,10 +111,11 @@ module Puppet
111
111
 
112
112
  Valid values for this setting are:
113
113
 
114
- * `deprecations` --- disables deprecation warnings.",
114
+ * `deprecations` --- disables deprecation warnings.
115
+ * `undefined_variables` --- disables warnings about non existing variables.",
115
116
  :hook => proc do |value|
116
117
  values = munge(value)
117
- valid = %w[deprecations]
118
+ valid = %w[deprecations undefined_variables]
118
119
  invalid = values - (values & valid)
119
120
  if not invalid.empty?
120
121
  raise ArgumentError, "Cannot disable unrecognized warning types #{invalid.inspect}. Valid values are #{valid.inspect}."
@@ -147,6 +148,17 @@ module Puppet
147
148
  :type => :boolean,
148
149
  :desc => "Whether to enable experimental performance profiling",
149
150
  },
151
+ :static_catalogs => {
152
+ :default => true,
153
+ :type => :boolean,
154
+ :desc => "Whether to compile a static catalog."
155
+ },
156
+ :strict_environment_mode => {
157
+ :default => false,
158
+ :type => :boolean,
159
+ :desc => "Whether the agent specified environment should be considered authoritative,
160
+ causing the run to fail if the retrieved catalog does not match it.",
161
+ },
150
162
  :autoflush => {
151
163
  :default => true,
152
164
  :type => :boolean,
@@ -233,11 +245,11 @@ module Puppet
233
245
  be set in `[master]`, `[agent]`, or an environment config section.",
234
246
  :call_hook => :on_define_and_write,
235
247
  :hook => proc do |value|
236
- ENV["PATH"] = "" if ENV["PATH"].nil?
237
- ENV["PATH"] = value unless value == "none"
238
- paths = ENV["PATH"].split(File::PATH_SEPARATOR)
248
+ Puppet::Util.set_env('PATH', '') if Puppet::Util.get_env('PATH').nil?
249
+ Puppet::Util.set_env('PATH', value) unless value == 'none'
250
+ paths = Puppet::Util.get_env('PATH').split(File::PATH_SEPARATOR)
239
251
  Puppet::Util::Platform.default_paths.each do |path|
240
- ENV["PATH"] += File::PATH_SEPARATOR + path unless paths.include?(path)
252
+ Puppet::Util.set_env('PATH', Puppet::Util.get_env('PATH') + File::PATH_SEPARATOR + path) unless paths.include?(path)
241
253
  end
242
254
  value
243
255
  end
@@ -272,7 +284,7 @@ module Puppet
272
284
 
273
285
  This setting must have a value set to enable **directory environments.** The
274
286
  recommended value is `$codedir/environments`. For more details, see
275
- http://docs.puppetlabs.com/puppet/latest/reference/environments.html",
287
+ https://docs.puppetlabs.com/puppet/latest/reference/environments.html",
276
288
  :type => :path,
277
289
  },
278
290
  :always_cache_features => {
@@ -484,9 +496,10 @@ module Puppet
484
496
  },
485
497
  :environment_data_provider => {
486
498
  :default => "none",
487
- :desc => "The name of a registered environment data provider. The two built in
488
- and registered providers are 'none' (no environment specific data), and 'function'
489
- (environment specific data obtained by calling the function 'environment::data()').
499
+ :desc => "The name of a registered environment data provider used when obtaining environment
500
+ specific data. The three built in and registered providers are 'none' (no data), 'function' (data
501
+ obtained by calling the function 'environment::data()') and 'hiera' (data obtained using a data
502
+ provider configured using a hiera.yaml file in root of the environment).
490
503
  Other environment data providers may be registered in modules on the module path. For such
491
504
  custom data providers see the respective module documentation."
492
505
  },
@@ -571,15 +584,15 @@ module Puppet
571
584
  `certname` setting as its requested Subject CN.
572
585
 
573
586
  This is the name used when managing a node's permissions in
574
- [auth.conf](http://docs.puppetlabs.com/puppet/latest/reference/config_file_auth.html).
587
+ [auth.conf](https://docs.puppetlabs.com/puppet/latest/reference/config_file_auth.html).
575
588
  In most cases, it is also used as the node's name when matching
576
- [node definitions](http://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html)
589
+ [node definitions](https://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html)
577
590
  and requesting data from an ENC. (This can be changed with the `node_name_value`
578
591
  and `node_name_fact` settings, although you should only do so if you have
579
592
  a compelling reason.)
580
593
 
581
594
  A node's certname is available in Puppet manifests as `$trusted['certname']`. (See
582
- [Facts and Built-In Variables](http://docs.puppetlabs.com/puppet/latest/reference/lang_facts_and_builtin_vars.html)
595
+ [Facts and Built-In Variables](https://docs.puppetlabs.com/puppet/latest/reference/lang_facts_and_builtin_vars.html)
583
596
  for more details.)
584
597
 
585
598
  * For best compatibility, you should limit the value of `certname` to
@@ -780,6 +793,21 @@ EOT
780
793
  :values => ["md5", "sha256"],
781
794
  :desc => 'Which digest algorithm to use for file resources and the filebucket.
782
795
  Valid values are md5, sha256. Default is md5.',
796
+ },
797
+ :supported_checksum_types => {
798
+ :default => ['md5', 'sha256'],
799
+ :type => :array,
800
+ :desc => 'Checksum types supported by this agent for use in file resources of a
801
+ static catalog. Values must be comma-separated. Valid types are md5,
802
+ md5lite, sha256, sha256lite, sha1, sha1lite, mtime, ctime.',
803
+ :hook => proc do |value|
804
+ values = munge(value)
805
+ valid = ['md5', 'md5lite', 'sha256', 'sha256lite', 'sha1', 'sha1lite', 'mtime', 'ctime']
806
+ invalid = values.reject {|alg| valid.include?(alg)}
807
+ if not invalid.empty?
808
+ raise ArgumentError, "Unrecognized checksum types #{invalid} are not supported. Valid values are #{valid}."
809
+ end
810
+ end
783
811
  }
784
812
  )
785
813
 
@@ -895,7 +923,7 @@ EOT
895
923
  the request.
896
924
 
897
925
  For info on autosign configuration files, see
898
- [the guide to Puppet's config files](http://docs.puppetlabs.com/guides/configuring.html).",
926
+ [the guide to Puppet's config files](http://docs.puppetlabs.com/puppet/latest/reference/config_about_settings.html).",
899
927
  },
900
928
  :allow_duplicate_certs => {
901
929
  :default => false,
@@ -968,7 +996,7 @@ EOT
968
996
  directory environments instead. If you need to use something other than the
969
997
  environment's `manifests` directory as the main manifest, you can set
970
998
  `manifest` in environment.conf. For more info, see
971
- http://docs.puppetlabs.com/puppet/latest/reference/environments.html",
999
+ https://docs.puppetlabs.com/puppet/latest/reference/environments.html",
972
1000
  },
973
1001
  :modulepath => {
974
1002
  :default => "",
@@ -982,7 +1010,7 @@ EOT
982
1010
  directory environments instead. If you need to use something other than the
983
1011
  default modulepath of `<ACTIVE ENVIRONMENT'S MODULES DIR>:$basemodulepath`,
984
1012
  you can set `modulepath` in environment.conf. For more info, see
985
- http://docs.puppetlabs.com/puppet/latest/reference/environments.html",
1013
+ https://docs.puppetlabs.com/puppet/latest/reference/environments.html",
986
1014
  },
987
1015
  :config_version => {
988
1016
  :default => "",
@@ -994,7 +1022,7 @@ EOT
994
1022
  Setting a global value for config_version in puppet.conf is not allowed
995
1023
  (but it can be overridden from the commandline). Please set a
996
1024
  per-environment value in environment.conf instead. For more info, see
997
- http://docs.puppetlabs.com/puppet/latest/reference/environments.html",
1025
+ https://docs.puppetlabs.com/puppet/latest/reference/environments.html",
998
1026
  }
999
1027
  )
1000
1028
 
@@ -1106,7 +1134,7 @@ EOT
1106
1134
  These are the modules that will be used by _all_ environments. Note that
1107
1135
  the `modules` directory of the active environment will have priority over
1108
1136
  any global directories. For more info, see
1109
- http://docs.puppetlabs.com/puppet/latest/reference/environments.html",
1137
+ https://docs.puppetlabs.com/puppet/latest/reference/environments.html",
1110
1138
  },
1111
1139
  :ssl_client_header => {
1112
1140
  :default => "HTTP_X_CLIENT_DN",
@@ -1282,7 +1310,7 @@ EOT
1282
1310
  For control over logging destinations, see the `--logdest` command line
1283
1311
  option in the manual pages for puppet master, puppet agent, and puppet
1284
1312
  apply. You can see man pages by running `puppet <SUBCOMMAND> --help`,
1285
- or read them online at http://docs.puppetlabs.com/references/latest/man/."
1313
+ or read them online at https://docs.puppetlabs.com/references/latest/man/."
1286
1314
  },
1287
1315
  :server => {
1288
1316
  :default => "puppet",
@@ -1327,7 +1355,7 @@ EOT
1327
1355
  event _would_ have been sent.
1328
1356
 
1329
1357
  **Important note:**
1330
- [The `noop` metaparameter](http://docs.puppetlabs.com/references/latest/metaparameter.html#noop)
1358
+ [The `noop` metaparameter](https://docs.puppetlabs.com/references/latest/metaparameter.html#noop)
1331
1359
  allows you to apply individual resources in noop mode, and will override
1332
1360
  the global value of the `noop` setting. This means a resource with
1333
1361
  `noop => false` _will_ be changed if necessary, even when running puppet
@@ -1412,7 +1440,16 @@ EOT
1412
1440
  :default => false,
1413
1441
  :type => :boolean,
1414
1442
  :desc => "Whether to sleep for a pseudo-random (but consistent) amount of time before
1415
- a run.",
1443
+ a run.
1444
+
1445
+ For example, without `splay` enabled, your agent checks in every 30
1446
+ minutes at :01 and :31 past the hour. After enabling `splay`, the agent
1447
+ will wait the pseudorandom sleep time, say eight minutes, and then check
1448
+ in every 30 minutes, at :09 and :39 after the hour. If you restart the
1449
+ same agent at 12:45 PM, it will wait its eight minutes, and check in at
1450
+ 12:52 PM, and every 30 minutes after that, at 1:22 PM, 1:52 PM, and so
1451
+ on. Other agents will have different sleep times, and so will check in
1452
+ at different times even if they are all restarted at the same time.",
1416
1453
  },
1417
1454
  :clientbucketdir => {
1418
1455
  :default => "$vardir/clientbucket",
@@ -1564,7 +1601,11 @@ EOT
1564
1601
  :pluginsync => {
1565
1602
  :default => true,
1566
1603
  :type => :boolean,
1567
- :desc => "Whether plugins should be synced with the central server.",
1604
+ :desc => "Whether plugins should be synced with the central server. This setting is
1605
+ deprecated.",
1606
+ :hook => proc { |value|
1607
+ Puppet.deprecation_warning "Setting 'pluginsync' is deprecated."
1608
+ }
1568
1609
  },
1569
1610
 
1570
1611
  :pluginsignore => {
@@ -1600,6 +1641,12 @@ EOT
1600
1641
  only resources tagged with the specified tags will be applied.
1601
1642
  Values must be comma-separated.",
1602
1643
  },
1644
+ :skip_tags => {
1645
+ :default => "",
1646
+ :desc => "Tags to use to filter resources. If this is set, then
1647
+ only resources not tagged with the specified tags will be applied.
1648
+ Values must be comma-separated.",
1649
+ },
1603
1650
  :evaltrace => {
1604
1651
  :default => false,
1605
1652
  :type => :boolean,
@@ -40,6 +40,8 @@ module Puppet::Environments
40
40
  end
41
41
 
42
42
  def clear_all
43
+ root = Puppet.lookup(:root_environment) { nil }
44
+ root.instance_variable_set(:@static_catalogs, nil) unless root.nil?
43
45
  end
44
46
  end
45
47
 
@@ -110,7 +112,7 @@ module Puppet::Environments
110
112
  def get_conf(name)
111
113
  env = get(name)
112
114
  if env
113
- Puppet::Settings::EnvironmentConf.static_for(env)
115
+ Puppet::Settings::EnvironmentConf.static_for(env, 0, Puppet[:static_catalogs])
114
116
  else
115
117
  nil
116
118
  end
@@ -9,7 +9,7 @@ Puppet::Face.define(:config, '0.0.1') do
9
9
 
10
10
  description "This subcommand can inspect and modify settings from Puppet's
11
11
  'puppet.conf' configuration file. For documentation about individual settings,
12
- see http://docs.puppetlabs.com/references/latest/configuration.html."
12
+ see https://docs.puppetlabs.com/references/latest/configuration.html."
13
13
 
14
14
  option "--section SECTION_NAME" do
15
15
  default_to { "main" }
@@ -172,7 +172,7 @@ Puppet::Face.define(:epp, '0.0.1') do
172
172
 
173
173
  show_filename = templates.count > 1
174
174
  dumps = templates.each do |file|
175
- buffer.print dump_parse(File.read(file), file, options, show_filename)
175
+ buffer.print dump_parse(Puppet::FileSystem.read(file, :encoding => 'utf-8'), file, options, show_filename)
176
176
  end
177
177
 
178
178
  if !missing_files.empty?
@@ -23,7 +23,7 @@ settings, so you can specify `--server <servername>`, or
23
23
  `--run_mode <runmode>` as an argument.
24
24
 
25
25
  See the configuration file documentation at
26
- <http://docs.puppetlabs.com/references/stable/configuration.html> for the
26
+ <https://docs.puppetlabs.com/references/stable/configuration.html> for the
27
27
  full list of acceptable parameters. A commented list of all
28
28
  configuration options can also be generated by running puppet with
29
29
  `--genconfig`.
@@ -21,7 +21,7 @@ Puppet::Face.define(:module, '1.0.0') do
21
21
 
22
22
  $ puppet module install puppetlabs-vcsrepo
23
23
  Preparing to install into /etc/puppetlabs/code/modules ...
24
- Downloading from http://forgeapi.puppetlabs.com ...
24
+ Downloading from https://forgeapi.puppetlabs.com ...
25
25
  Installing -- do not interrupt ...
26
26
  /etc/puppetlabs/code/modules
27
27
  └── puppetlabs-vcsrepo (v0.0.4)
@@ -30,7 +30,7 @@ Puppet::Face.define(:module, '1.0.0') do
30
30
 
31
31
  $ puppet module install puppetlabs-vcsrepo --environment development
32
32
  Preparing to install into /etc/puppetlabs/code/environments/development/modules ...
33
- Downloading from http://forgeapi.puppetlabs.com ...
33
+ Downloading from https://forgeapi.puppetlabs.com ...
34
34
  Installing -- do not interrupt ...
35
35
  /etc/puppetlabs/code/environments/development/modules
36
36
  └── puppetlabs-vcsrepo (v0.0.4)
@@ -39,7 +39,7 @@ Puppet::Face.define(:module, '1.0.0') do
39
39
 
40
40
  $ puppet module install puppetlabs-vcsrepo -v 0.0.4
41
41
  Preparing to install into /etc/puppetlabs/modules ...
42
- Downloading from http://forgeapi.puppetlabs.com ...
42
+ Downloading from https://forgeapi.puppetlabs.com ...
43
43
  Installing -- do not interrupt ...
44
44
  /etc/puppetlabs/code/modules
45
45
  └── puppetlabs-vcsrepo (v0.0.4)
@@ -48,7 +48,7 @@ Puppet::Face.define(:module, '1.0.0') do
48
48
 
49
49
  $ puppet module install puppetlabs-vcsrepo --target-dir=/opt/puppetlabs/puppet/modules
50
50
  Preparing to install into /opt/puppetlabs/puppet/modules ...
51
- Downloading from http://forgeapi.puppetlabs.com ...
51
+ Downloading from https://forgeapi.puppetlabs.com ...
52
52
  Installing -- do not interrupt ...
53
53
  /opt/puppetlabs/puppet/modules
54
54
  └── puppetlabs-vcsrepo (v0.0.4)
@@ -57,7 +57,7 @@ Puppet::Face.define(:module, '1.0.0') do
57
57
 
58
58
  $ puppet module install puppetlabs-vcsrepo --target-dir=/opt/puppetlabs/puppet/modules --modulepath /etc/puppetlabs/code/modules
59
59
  Preparing to install into /opt/puppetlabs/puppet/modules ...
60
- Downloading from http://forgeapi.puppetlabs.com ...
60
+ Downloading from https://forgeapi.puppetlabs.com ...
61
61
  Installing -- do not interrupt ...
62
62
  /opt/puppetlabs/puppet/modules
63
63
  └── puppetlabs-vcsrepo (v0.0.4)
@@ -66,7 +66,7 @@ Puppet::Face.define(:module, '1.0.0') do
66
66
 
67
67
  $ puppet module install puppetlabs-vcsrepo-0.0.4.tar.gz
68
68
  Preparing to install into /etc/puppetlabs/code/modules ...
69
- Downloading from http://forgeapi.puppetlabs.com ...
69
+ Downloading from https://forgeapi.puppetlabs.com ...
70
70
  Installing -- do not interrupt ...
71
71
  /etc/puppetlabs/code/modules
72
72
  └── puppetlabs-vcsrepo (v0.0.4)
@@ -107,7 +107,7 @@ Puppet::Face.define(:parser, '0.0.1') do
107
107
  missing_files = files - available_files
108
108
 
109
109
  dumps = available_files.collect do |file|
110
- dump_parse(File.read(file), file, options)
110
+ dump_parse(Puppet::FileSystem.read(file, :encoding => 'utf-8'), file, options)
111
111
  end.join("")
112
112
 
113
113
  if missing_files.empty?
@@ -146,13 +146,16 @@ Puppet::Face.define(:parser, '0.0.1') do
146
146
  # @api private
147
147
  def validate_manifest(manifest = nil)
148
148
  env = Puppet.lookup(:current_environment)
149
- validation_environment = manifest ? env.override_with(:manifest => manifest) : env
150
-
151
- validation_environment.check_for_reparse
152
- validation_environment.known_resource_types.clear
153
-
154
- rescue => detail
155
- Puppet.log_exception(detail)
156
- exit(1)
149
+ loaders = Puppet::Pops::Loaders.new(env)
150
+ Puppet.override( {:loaders => loaders } , 'For puppet parser validate') do
151
+ begin
152
+ validation_environment = manifest ? env.override_with(:manifest => manifest) : env
153
+ validation_environment.check_for_reparse
154
+ validation_environment.known_resource_types.clear
155
+ rescue => detail
156
+ Puppet.log_exception(detail)
157
+ exit(1)
158
+ end
159
+ end
157
160
  end
158
161
  end
@@ -37,7 +37,8 @@ Puppet::Indirector::Face.define(:status, '0.0.1') do
37
37
  This action requires that the server's `auth.conf` file allow find
38
38
  access to the `status` REST terminus. Puppet agent does not use this
39
39
  facility, and it is turned off by default. See
40
- <http://docs.puppetlabs.com/guides/rest_auth_conf.html> for more details.
40
+ <https://docs.puppetlabs.com/puppet/latest/reference/config_file_auth.html>
41
+ for more details.
41
42
  EOT
42
43
  find.examples <<-'EOT'
43
44
  Check the status of the configured puppet master:
@@ -0,0 +1,3 @@
1
+ require 'puppet/util/feature'
2
+
3
+ Puppet.features.add(:cfpropertylist, :libs => ['cfpropertylist'])
@@ -0,0 +1,9 @@
1
+ require 'puppet/util/feature'
2
+
3
+ Puppet.features.add :telnet do
4
+ begin
5
+ require 'net/telnet'
6
+ rescue LoadError
7
+ false
8
+ end
9
+ end
@@ -0,0 +1,46 @@
1
+ require 'puppet/file_serving/metadata'
2
+
3
+ # Simplified metadata representation, suitable for the information
4
+ # that is available from HTTP headers.
5
+ class Puppet::FileServing::HttpMetadata < Puppet::FileServing::Metadata
6
+
7
+ def initialize(http_response, path = '/dev/null')
8
+ super(path)
9
+
10
+ # ignore options that do not apply to HTTP metadata
11
+ @owner = @group = @mode = nil
12
+
13
+ # hash available checksums for eventual collection
14
+ @checksums = {}
15
+ # use a default mtime in case there is no usable HTTP header
16
+ @checksums[:mtime] = "{mtime}#{Time.now}"
17
+
18
+ if checksum = http_response['content-md5']
19
+ # convert base64 digest to hex
20
+ checksum = checksum.unpack("m0").first.unpack("H*").first
21
+ @checksums[:md5] = "{md5}#{checksum}"
22
+ end
23
+
24
+ if last_modified = http_response['last-modified']
25
+ mtime = DateTime.httpdate(last_modified).to_time
26
+ @checksums[:mtime] = "{mtime}#{mtime}"
27
+ end
28
+
29
+ @ftype = 'file'
30
+
31
+ self
32
+ end
33
+
34
+ # Override of the parent class method. Does not call super!
35
+ # We can only return metadata that was extracted from the
36
+ # HTTP headers during #initialize.
37
+ def collect
38
+ # Prefer the checksum_type from the indirector request options
39
+ # but fall back to the alternative otherwise
40
+ [ @checksum_type, :md5, :mtime ].each do |type|
41
+ @checksum_type = type
42
+ @checksum = @checksums[type]
43
+ return if @checksum
44
+ end
45
+ end
46
+ end
@@ -3,6 +3,7 @@ require 'puppet/indirector'
3
3
  require 'puppet/file_serving'
4
4
  require 'puppet/file_serving/base'
5
5
  require 'puppet/util/checksums'
6
+ require 'uri'
6
7
 
7
8
  # A class that handles retrieving file metadata.
8
9
  class Puppet::FileServing::Metadata < Puppet::FileServing::Base
@@ -12,7 +13,7 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
12
13
  extend Puppet::Indirector
13
14
  indirects :file_metadata, :terminus_class => :selector
14
15
 
15
- attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination, :source_permissions
16
+ attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination, :source_permissions, :content_uri
16
17
 
17
18
  PARAM_ORDER = [:mode, :ftype, :owner, :group]
18
19
 
@@ -28,6 +29,18 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
28
29
  @source_permissions = source_permissions.intern
29
30
  end
30
31
 
32
+ def content_uri=(path)
33
+ begin
34
+ uri = URI.parse(URI.escape(path))
35
+ rescue URI::InvalidURIError => detail
36
+ raise(ArgumentError, "Could not understand URI #{path}: #{detail}")
37
+ end
38
+ raise(ArgumentError, "Cannot use opaque URLs '#{path}'") unless uri.hierarchical?
39
+ raise(ArgumentError, "Must use URLs of type puppet as content URI") if uri.scheme != "puppet"
40
+
41
+ @content_uri = path
42
+ end
43
+
31
44
  class MetaStat
32
45
  extend Forwardable
33
46
 
@@ -121,6 +134,8 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
121
134
  @checksum_type ||= Puppet[:digest_algorithm]
122
135
  @ftype = data.delete('type')
123
136
  @destination = data.delete('destination')
137
+ @source = data.delete('source')
138
+ @content_uri = data.delete('content_uri')
124
139
  super(path,data)
125
140
  end
126
141
 
@@ -136,7 +151,8 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
136
151
  },
137
152
  'type' => ftype,
138
153
  'destination' => destination,
139
- }
154
+ }.merge(content_uri ? {'content_uri' => content_uri} : {})
155
+ .merge(source ? {'source' => source} : {})
140
156
  )
141
157
  end
142
158