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
@@ -48,7 +48,7 @@ OPTIONS
48
48
  Any configuration setting which is valid in the configuration file is
49
49
  also a valid long argument, e.g. '--server=master.domain.com'. See the
50
50
  configuration file documentation at
51
- http://docs.puppetlabs.com/references/latest/configuration.html for
51
+ https://docs.puppetlabs.com/references/latest/configuration.html for
52
52
  the full list of acceptable settings.
53
53
 
54
54
  * --archive_files:
@@ -12,11 +12,7 @@ class Puppet::Application::Lookup < Puppet::Application
12
12
 
13
13
  # Options for lookup
14
14
  option('--merge TYPE') do |arg|
15
- if %w{unique hash deep}.include?(arg)
16
- options[:merge] = arg
17
- else
18
- raise "The --merge option only accepts 'unique', 'hash', or 'deep'.\n#{RUN_HELP}"
19
- end
15
+ options[:merge] = arg
20
16
  end
21
17
 
22
18
  option('--debug', '-d')
@@ -31,6 +27,8 @@ class Puppet::Application::Lookup < Puppet::Application
31
27
  options[:type] = arg
32
28
  end
33
29
 
30
+ option('--compile', '-c')
31
+
34
32
  option('--knock-out-prefix PREFIX_STRING') do |arg|
35
33
  options[:prefix] = arg
36
34
  end
@@ -45,6 +43,8 @@ class Puppet::Application::Lookup < Puppet::Application
45
43
 
46
44
  option('--explain')
47
45
 
46
+ option('--explain-options')
47
+
48
48
  option('--default VALUE') do |arg|
49
49
  options[:default_value] = arg
50
50
  end
@@ -96,31 +96,6 @@ class Puppet::Application::Lookup < Puppet::Application
96
96
  Puppet::FileBucket::File.indirection.terminus_class = :file
97
97
  end
98
98
 
99
- def setup_ssl
100
- # Configure all of the SSL stuff.
101
- if Puppet::SSL::CertificateAuthority.ca?
102
- Puppet::SSL::Host.ca_location = :local
103
- Puppet.settings.use :ca
104
- Puppet::SSL::CertificateAuthority.instance
105
- else
106
- Puppet::SSL::Host.ca_location = :none
107
- end
108
- # These lines are not on stable (seems like a copy was made from master)
109
- #
110
- # Puppet::SSL::Oids.register_puppet_oids
111
- # Puppet::SSL::Oids.load_custom_oid_file(Puppet[:trusted_oid_mapping_file])
112
- end
113
-
114
- # Sets up a special node cache "write only yaml" that collects and stores node data in yaml
115
- # but never finds or reads anything (this since a real cache causes stale data to be served
116
- # in circumstances when the cache can not be cleared).
117
- # @see puppet issue 16753
118
- # @see Puppet::Node::WriteOnlyYaml
119
- # @return [void]
120
- def setup_node_cache
121
- Puppet::Node.indirection.cache_class = Puppet[:node_cache_terminus]
122
- end
123
-
124
99
  def setup
125
100
  setup_logs
126
101
 
@@ -129,11 +104,6 @@ class Puppet::Application::Lookup < Puppet::Application
129
104
  Puppet.settings.use :main, :master, :ssl, :metrics
130
105
 
131
106
  setup_terminuses
132
-
133
- # TODO: Do we need this in lookup? It sets up a write only cache
134
- setup_node_cache
135
-
136
- setup_ssl
137
107
  end
138
108
 
139
109
  def help
@@ -156,6 +126,7 @@ puppet lookup [--help] [--type <TYPESTRING>] [--merge unique|hash|deep]
156
126
  [--knock-out-prefix <PREFIX-STRING>] [--sort-merged-arrays]
157
127
  [--unpack-arrays <STRING-VALUE>] [--merge-hash-arrays] [--explain]
158
128
  [--default <VALUE>] [--node <NODE-NAME>] [--facts <FILE>]
129
+ [--compile]
159
130
  [--render-as s|json|yaml|binary|msgpack] <keys>
160
131
 
161
132
  DESCRIPTION
@@ -214,6 +185,10 @@ the puppet lookup function linked to above.
214
185
  than the value returned for the key. The explaination will describe how
215
186
  the result was obtained or why lookup failed to obtain the result.
216
187
 
188
+ * --explain-options
189
+ Explain if a lookup_options hash will be used and how it was assembled
190
+ when performing a lookup.
191
+
217
192
  * --default <VALUE>
218
193
  A value produced if no value was found in the lookup.
219
194
 
@@ -227,6 +202,11 @@ the puppet lookup function linked to above.
227
202
  override the facts for the current node. Any facts not specified by the
228
203
  user will maintain their original value.
229
204
 
205
+ * --compile
206
+ Perform a full catalog compilation prior to the lookup. This is meaningful when
207
+ the catalog changes global variables that are referenced in interpolated values.
208
+ No catalog compilation takes place unless this flag is given.
209
+
230
210
  * --render-as s|json|yaml|binary|msgpack
231
211
  Determines how the results will be rendered to the standard output where
232
212
  s means plain text. The default when lookup is producing a value is yaml
@@ -234,7 +214,7 @@ the puppet lookup function linked to above.
234
214
 
235
215
  EXAMPLE
236
216
  -------
237
- If you wanted to lookup 'key_name' within the scope of the master, you would
217
+ If you wanted to lookup 'key_name' within the scope of the master, you would
238
218
  call lookup like this:
239
219
  $ puppet lookup key_name
240
220
 
@@ -266,7 +246,6 @@ Copyright (c) 2015 Puppet Labs, LLC Licensed under the Apache 2.0 License
266
246
 
267
247
  def main
268
248
  keys = command_line.args
269
- raise 'No keys were given to lookup.' if keys.empty?
270
249
 
271
250
  #unless options[:node]
272
251
  # raise "No node was given via the '--node' flag for the scope of the lookup.\n#{RUN_HELP}"
@@ -279,8 +258,15 @@ Copyright (c) 2015 Puppet Labs, LLC Licensed under the Apache 2.0 License
279
258
  use_default_value = !options[:default_value].nil?
280
259
  merge_options = nil
281
260
 
282
- if options[:merge]
283
- if options[:merge] == 'deep'
261
+ merge = options[:merge]
262
+ unless merge.nil?
263
+ strategies = Puppet::Pops::MergeStrategy.strategy_keys
264
+ unless strategies.include?(merge.to_sym)
265
+ strategies = strategies.map {|k| "'#{k}'"}
266
+ raise "The --merge option only accepts #{strategies[0...-1].join(', ')}, or #{strategies.last}\n#{RUN_HELP}"
267
+ end
268
+
269
+ if merge == 'deep'
284
270
  merge_options = {'strategy' => 'deep',
285
271
  'sort_merge_arrays' => !options[:sort_merge_arrays].nil?,
286
272
  'merge_hash_arrays' => !options[:merge_hash_arrays].nil?}
@@ -294,22 +280,33 @@ Copyright (c) 2015 Puppet Labs, LLC Licensed under the Apache 2.0 License
294
280
  end
295
281
 
296
282
  else
297
- merge_options = {'strategy' => options[:merge]}
283
+ merge_options = {'strategy' => merge}
298
284
  end
299
285
  end
300
286
 
301
- explain = !!options[:explain]
287
+ explain_data = !!options[:explain]
288
+ explain_options = !!options[:explain_options]
289
+ only_explain_options = explain_options && !explain_data
290
+ if keys.empty?
291
+ if only_explain_options
292
+ # Explain lookup_options for lookup of an unqualified value.
293
+ keys = Puppet::Pops::Lookup::GLOBAL
294
+ else
295
+ raise 'No keys were given to lookup.'
296
+ end
297
+ end
298
+ explain = explain_data || explain_options
302
299
 
303
300
  # Format defaults to text (:s) when producing an explanation and :yaml when producing the value
304
301
  format = options[:render_as] || (explain ? :s : :yaml)
305
302
  renderer = Puppet::Network::FormatHandler.format(format == :json ? :pson : format)
306
303
  raise "Unknown rendering format '#{format}'" if renderer.nil?
307
304
 
308
- type = options.include?(:type) ? Puppet::Pops::Types::TypeParser.new.parse(options[:type]) : nil
309
305
 
310
306
  generate_scope do |scope|
311
- lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, explain)
307
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, explain ? Puppet::Pops::Lookup::Explainer.new(explain_options, only_explain_options) : nil)
312
308
  begin
309
+ type = options.include?(:type) ? Puppet::Pops::Types::TypeParser.new.parse(options[:type], scope) : nil
313
310
  result = Puppet::Pops::Lookup.lookup(keys, type, options[:default_value], use_default_value, merge_options, lookup_invocation)
314
311
  puts renderer.render(result) unless explain
315
312
  rescue Puppet::DataBinding::LookupError
@@ -336,20 +333,21 @@ Copyright (c) 2015 Puppet Labs, LLC Licensed under the Apache 2.0 License
336
333
  fact_file = options[:fact_file]
337
334
 
338
335
  if fact_file
339
- original_facts = node.facts.values
336
+ original_facts = node.parameters
340
337
  if fact_file.end_with?("json")
341
- given_facts = JSON.parse(File.read(fact_file))
338
+ given_facts = JSON.parse(Puppet::FileSystem.read(fact_file, :encoding => 'utf-8'))
342
339
  else
343
- given_facts = YAML.load(File.read(fact_file))
340
+ given_facts = YAML.load(Puppet::FileSystem.read(fact_file, :encoding => 'utf-8'))
344
341
  end
345
342
 
346
343
  unless given_facts.instance_of?(Hash)
347
344
  raise "Incorrect formatted data in #{fact_file} given via the --facts flag"
348
345
  end
349
346
 
350
- node.facts.values = original_facts.merge(given_facts)
347
+ node.parameters = original_facts.merge(given_facts)
351
348
  end
352
349
 
350
+ Puppet[:code] = 'undef' unless options[:compile]
353
351
  compiler = Puppet::Parser::Compiler.new(node)
354
352
  compiler.compile { |catalog| yield(compiler.topscope); catalog }
355
353
  end
@@ -61,7 +61,7 @@ specify '--server <servername>' as an argument. Boolean settings translate into
61
61
  '--setting' and '--no-setting' pairs.
62
62
 
63
63
  See the configuration file documentation at
64
- http://docs.puppetlabs.com/references/stable/configuration.html for the
64
+ https://docs.puppetlabs.com/references/stable/configuration.html for the
65
65
  full list of acceptable settings. A commented list of all settings can also be
66
66
  generated by running puppet master with '--genconfig'.
67
67
 
@@ -92,7 +92,7 @@ generated by running puppet master with '--genconfig'.
92
92
  valid JSON.
93
93
 
94
94
  * --masterport:
95
- The port on which to listen for traffic.
95
+ The port on which to listen for traffic. The default port is 8140.
96
96
  (This is a Puppet setting, and can go in puppet.conf.)
97
97
 
98
98
  * --verbose:
@@ -72,7 +72,7 @@ setting, so you can specify '--ssldir <directory>' as an
72
72
  argument.
73
73
 
74
74
  See the configuration file documentation at
75
- http://docs.puppetlabs.com/references/stable/configuration.html for the
75
+ https://docs.puppetlabs.com/references/stable/configuration.html for the
76
76
  full list of acceptable parameters. A commented list of all
77
77
  configuration options can also be generated by running puppet with
78
78
  '--genconfig'.
@@ -22,6 +22,18 @@ class Puppet::Configurer
22
22
  "Puppet configuration client"
23
23
  end
24
24
 
25
+ def self.should_pluginsync?
26
+ if Puppet.settings.set_by_cli?(:pluginsync) || Puppet.settings.set_by_config?(:pluginsync)
27
+ Puppet[:pluginsync]
28
+ else
29
+ if Puppet[:use_cached_catalog]
30
+ false
31
+ else
32
+ true
33
+ end
34
+ end
35
+ end
36
+
25
37
  def execute_postrun_command
26
38
  execute_from_setting(:postrun_command)
27
39
  end
@@ -47,26 +59,46 @@ class Puppet::Configurer
47
59
  def initialize(factory = Puppet::Configurer::DownloaderFactory.new)
48
60
  @running = false
49
61
  @splayed = false
62
+ @cached_catalog_status = 'not_used'
50
63
  @environment = Puppet[:environment]
51
64
  @transaction_uuid = SecureRandom.uuid
65
+ @static_catalog = true
66
+ @checksum_type = Puppet[:supported_checksum_types]
52
67
  @handler = Puppet::Configurer::PluginHandler.new(factory)
53
68
  end
54
69
 
55
70
  # Get the remote catalog, yo. Returns nil if no catalog can be found.
56
71
  def retrieve_catalog(query_options)
57
72
  query_options ||= {}
58
- # First try it with no cache, then with the cache.
59
- unless (Puppet[:use_cached_catalog] and result = retrieve_catalog_from_cache(query_options)) or result = retrieve_new_catalog(query_options)
60
- if ! Puppet[:usecacheonfailure]
61
- Puppet.warning "Not using cache on failed catalog"
62
- return nil
73
+ if (Puppet[:use_cached_catalog] && result = retrieve_catalog_from_cache(query_options))
74
+ @cached_catalog_status = 'explicitly_requested'
75
+
76
+ Puppet.info "Using cached catalog from environment '#{result.environment}'"
77
+ else
78
+ result = retrieve_new_catalog(query_options)
79
+
80
+ if !result
81
+ if !Puppet[:usecacheonfailure]
82
+ Puppet.warning "Not using cache on failed catalog"
83
+ return nil
84
+ end
85
+
86
+ result = retrieve_catalog_from_cache(query_options)
87
+
88
+ if result
89
+ # don't use use cached catalog if it doesn't match server specified environment
90
+ if @node_environment && result.environment != @environment
91
+ Puppet.err "Not using cached catalog because its environment '#{result.environment}' does not match '#{@environment}'"
92
+ return nil
93
+ end
94
+
95
+ @cached_catalog_status = 'on_failure'
96
+ Puppet.info "Using cached catalog from environment '#{result.environment}'"
97
+ end
63
98
  end
64
- result = retrieve_catalog_from_cache(query_options)
65
99
  end
66
100
 
67
- return nil unless result
68
-
69
- convert_catalog(result, @duration)
101
+ result
70
102
  end
71
103
 
72
104
  # Convert a plain resource catalog into our full host catalog.
@@ -100,12 +132,32 @@ class Puppet::Configurer
100
132
  def prepare_and_retrieve_catalog(options, query_options)
101
133
  # set report host name now that we have the fact
102
134
  options[:report].host = Puppet[:node_name_value]
135
+ query_options[:transaction_uuid] = @transaction_uuid
136
+ query_options[:static_catalog] = @static_catalog
137
+
138
+ # Query params don't enforce ordered evaluation, so munge this list into a
139
+ # dot-separated string.
140
+ query_options[:checksum_type] = @checksum_type.join('.')
141
+
142
+ # apply passes in ral catalog
143
+ catalog = options.delete(:catalog)
144
+ return catalog if catalog
103
145
 
104
- unless catalog = (options.delete(:catalog) || retrieve_catalog(query_options))
105
- Puppet.err "Could not retrieve catalog; skipping run"
106
- return
146
+ # retrieve_catalog returns json catalog
147
+ catalog = retrieve_catalog(query_options)
148
+ return convert_catalog(catalog, @duration) if catalog
149
+
150
+ Puppet.err "Could not retrieve catalog; skipping run"
151
+ nil
152
+ end
153
+
154
+ def prepare_and_retrieve_catalog_from_cache
155
+ result = retrieve_catalog_from_cache({:transaction_uuid => @transaction_uuid, :static_catalog => @static_catalog})
156
+ if result
157
+ Puppet.info "Using cached catalog from environment '#{result.environment}'"
158
+ return convert_catalog(result, @duration)
107
159
  end
108
- catalog
160
+ nil
109
161
  end
110
162
 
111
163
  # Retrieve (optionally) and apply a catalog. If a catalog is passed in
@@ -149,6 +201,28 @@ class Puppet::Configurer
149
201
 
150
202
  Puppet::Util::Log.newdestination(report)
151
203
 
204
+ # If a cached catalog is explicitly requested, attempt to retrieve it. Skip the node request,
205
+ # don't pluginsync and switch to the catalog's environment if we successfully retrieve it.
206
+ if Puppet[:use_cached_catalog]
207
+ if catalog = prepare_and_retrieve_catalog_from_cache
208
+ options[:catalog] = catalog
209
+ @cached_catalog_status = 'explicitly_requested'
210
+
211
+ if @environment != catalog.environment && !Puppet[:strict_environment_mode]
212
+ Puppet.notice "Local environment: '#{@environment}' doesn't match the environment of the cached catalog '#{catalog.environment}', switching agent to '#{catalog.environment}'."
213
+ @environment = catalog.environment
214
+ end
215
+
216
+ report.environment = @environment
217
+ else
218
+ # Don't try to retrieve a catalog from the cache again after we've already
219
+ # failed to do so the first time.
220
+ Puppet[:use_cached_catalog] = false
221
+ Puppet[:usecacheonfailure] = false
222
+ options[:pluginsync] = Puppet::Configurer.should_pluginsync?
223
+ end
224
+ end
225
+
152
226
  begin
153
227
  unless Puppet[:node_name_fact].empty?
154
228
  query_options = get_facts(options)
@@ -157,7 +231,7 @@ class Puppet::Configurer
157
231
  configured_environment = Puppet[:environment] if Puppet.settings.set_by_config?(:environment)
158
232
 
159
233
  # We only need to find out the environment to run in if we don't already have a catalog
160
- unless options[:catalog]
234
+ unless (options[:catalog] || Puppet[:strict_environment_mode])
161
235
  begin
162
236
  if node = Puppet::Node.indirection.find(Puppet[:node_name_value],
163
237
  :environment => Puppet::Node::Environment.remote(@environment),
@@ -172,6 +246,8 @@ class Puppet::Configurer
172
246
  node.environment = Puppet::Node::Environment.remote(node.environment_name)
173
247
  end
174
248
 
249
+ @node_environment = node.environment.to_s
250
+
175
251
  if node.environment.to_s != @environment
176
252
  Puppet.notice "Local environment: '#{@environment}' doesn't match server specified node environment '#{node.environment}', switching agent to '#{node.environment}'."
177
253
  @environment = node.environment.to_s
@@ -200,13 +276,17 @@ class Puppet::Configurer
200
276
  Puppet.push_context({:current_environment => local_node_environment}, "Local node environment for configurer transaction")
201
277
 
202
278
  query_options = get_facts(options) unless query_options
203
- query_options[:transaction_uuid] = @transaction_uuid
204
279
  query_options[:configured_environment] = configured_environment
205
280
 
206
281
  unless catalog = prepare_and_retrieve_catalog(options, query_options)
207
282
  return nil
208
283
  end
209
284
 
285
+ if Puppet[:strict_environment_mode] && catalog.environment != @environment
286
+ Puppet.err "Not using catalog because its environment '#{catalog.environment}' does not match agent specified environment '#{@environment}' and strict_environment_mode is set"
287
+ return nil
288
+ end
289
+
210
290
  # Here we set the local environment based on what we get from the
211
291
  # catalog. Since a change in environment means a change in facts, and
212
292
  # facts may be used to determine which catalog we get, we need to
@@ -221,7 +301,6 @@ class Puppet::Configurer
221
301
  report.environment = @environment
222
302
 
223
303
  query_options = get_facts(options)
224
- query_options[:transaction_uuid] = @transaction_uuid
225
304
  query_options[:configured_environment] = configured_environment
226
305
 
227
306
  return nil unless catalog = prepare_and_retrieve_catalog(options, query_options)
@@ -229,6 +308,10 @@ class Puppet::Configurer
229
308
  end
230
309
 
231
310
  execute_prerun_command or return nil
311
+
312
+ options[:report].code_id = catalog.code_id
313
+ options[:report].catalog_uuid = catalog.catalog_uuid
314
+ options[:report].cached_catalog_status = @cached_catalog_status
232
315
  apply_catalog(catalog, options)
233
316
  report.exit_status
234
317
  rescue => detail
@@ -238,11 +321,7 @@ class Puppet::Configurer
238
321
  execute_postrun_command or return nil
239
322
  end
240
323
  ensure
241
- # Between Puppet runs we need to forget the cached values. This lets us
242
- # pick up on new functions installed by gems or new modules being added
243
- # without the daemon being restarted.
244
- $env_module_directories = nil
245
-
324
+ report.cached_catalog_status ||= @cached_catalog_status
246
325
  Puppet::Util::Log.close(report)
247
326
  send_report(report)
248
327
  Puppet.pop_context
@@ -286,7 +365,6 @@ class Puppet::Configurer
286
365
  result = Puppet::Resource::Catalog.indirection.find(Puppet[:node_name_value],
287
366
  query_options.merge(:ignore_terminus => true, :environment => Puppet::Node::Environment.remote(@environment)))
288
367
  end
289
- Puppet.notice "Using cached catalog"
290
368
  result
291
369
  rescue => detail
292
370
  Puppet.log_exception(detail, "Could not retrieve catalog from cache: #{detail}")
@@ -27,6 +27,8 @@ module Puppet::DataProviders
27
27
  Hash[struct.map { |k,v| [k.to_s, symkeys_to_string(v)] }]
28
28
  when Array
29
29
  struct.map { |v| symkeys_to_string(v) }
30
+ when nil
31
+ {}
30
32
  else
31
33
  struct
32
34
  end
@@ -70,6 +72,18 @@ module Puppet::DataProviders
70
72
  end
71
73
 
72
74
  def create_data_providers(lookup_invocation)
75
+ Puppet.deprecation_warning('Method HieraConfig#create_data_providers is deprecated. Use create_configured_data_providers instead')
76
+ create_configured_data_providers(lookup_invocation, nil)
77
+ end
78
+
79
+ # Creates the data providers for this config
80
+ #
81
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] Invocation data containing scope, overrides, and defaults
82
+ # @param parent_data_provider [Puppet::Plugins::DataProviders::DataProvider] The data provider that loaded this configuration
83
+ # @return [Array[DataProvider]] the created providers
84
+ #
85
+ # @api private
86
+ def create_configured_data_providers(lookup_invocation, parent_data_provider)
73
87
  injector = Puppet.lookup(:injector)
74
88
  service_type = Registry.hash_of_path_based_data_provider_factories
75
89
  default_datadir = @config['datadir']
@@ -92,14 +106,25 @@ module Puppet::DataProviders
92
106
  raise Puppet::DataBinding::LookupError, "#{@config_path}: No data provider is registered for backend '#{provider_name}' " unless provider_factory
93
107
 
94
108
  datadir = @config_root + (he['datadir'] || default_datadir)
95
- resolved_paths = provider_factory.resolve_paths(datadir, original_paths, paths, lookup_invocation)
96
- data_providers[name] = provider_factory.create(name, resolved_paths)
109
+ data_providers[name] = create_data_provider(parent_data_provider, provider_factory, name,
110
+ provider_factory.resolve_paths(datadir, original_paths, paths, lookup_invocation))
97
111
  end
98
112
  data_providers.values
99
113
  end
100
114
 
115
+ def create_data_provider(parent_data_provider, provider_factory, name, resolved_paths)
116
+ provider_factory_version = provider_factory.respond_to?(:version) ? provider_factory.version : 1
117
+ if provider_factory_version == 1
118
+ # Version 1 is not aware of the parent provider
119
+ provider_factory.create(name, resolved_paths)
120
+ else
121
+ provider_factory.create(name, resolved_paths, parent_data_provider)
122
+ end
123
+ end
124
+ private :create_data_provider
125
+
101
126
  def validate_config(hiera_config)
102
- Puppet::Pops::Types::TypeAsserter.assert_instance_of(@config_path, self.class.config_type, hiera_config)
127
+ Puppet::Pops::Types::TypeAsserter.assert_instance_of(["The Hiera Configuration at '%s'", @config_path], self.class.config_type, hiera_config)
103
128
  end
104
129
  private :validate_config
105
130
  end
@@ -5,31 +5,46 @@ require_relative 'hiera_config'
5
5
  #
6
6
  module Puppet::DataProviders::HieraInterpolate
7
7
  def interpolate(subject, lookup_invocation, allow_methods)
8
- return subject unless subject.is_a?(String) && !subject.index('%{').nil?
8
+ case subject
9
+ when String
10
+ subject.index('%{').nil? ? subject : interpolate_string(subject, lookup_invocation, allow_methods)
11
+ when Array
12
+ subject.map { |element| interpolate(element, lookup_invocation, allow_methods) }
13
+ when Hash
14
+ Hash[subject.map { |k, v| [k, interpolate(v, lookup_invocation, allow_methods)] }]
15
+ else
16
+ subject
17
+ end
18
+ end
9
19
 
10
- lookup_invocation.with(:interpolate, subject) do
11
- subject.gsub(/%\{([^\}]+)\}/) do |match|
12
- method_key, key = get_method_and_data($1, allow_methods)
13
- is_alias = method_key == 'alias'
20
+ private
14
21
 
15
- # Alias is only permitted if the entire string is equal to the interpolate expression
16
- raise Puppet::DataBinding::LookupError, "'alias' interpolation is only permitted if the expression is equal to the entire string" if is_alias && subject != match
22
+ def interpolate_string(subject, lookup_invocation, allow_methods)
23
+ lookup_invocation.with(:interpolate, subject) do
24
+ subject.gsub(/%\{([^\}]*)\}/) do |match|
25
+ expr = $1
26
+ # Leading and trailing spaces inside an interpolation expression are insignificant
27
+ expr.strip!
28
+ unless expr.empty? || expr == '::'
29
+ method_key, key = get_method_and_data(expr, allow_methods)
30
+ is_alias = method_key == 'alias'
17
31
 
18
- segments = key.split('.')
19
- value = interpolate_method(method_key).call(segments[0], lookup_invocation)
20
- value = qualified_lookup(segments.drop(1), value) if segments.size > 1
21
- value = lookup_invocation.check(key) { interpolate(value, lookup_invocation, allow_methods) } if value.is_a?(String)
32
+ # Alias is only permitted if the entire string is equal to the interpolate expression
33
+ raise Puppet::DataBinding::LookupError, "'alias' interpolation is only permitted if the expression is equal to the entire string" if is_alias && subject != match
22
34
 
23
- # break gsub and return value immediately if this was an alias substitution. The value might be something other than a String
24
- return value if is_alias
35
+ segments = key.split('.')
36
+ value = interpolate_method(method_key).call(segments[0], lookup_invocation)
37
+ value = qualified_lookup(segments.drop(1), value) if segments.size > 1
38
+ value = lookup_invocation.check(key) { interpolate(value, lookup_invocation, allow_methods) }
25
39
 
40
+ # break gsub and return value immediately if this was an alias substitution. The value might be something other than a String
41
+ return value if is_alias
42
+ end
26
43
  value || ''
27
44
  end
28
45
  end
29
46
  end
30
47
 
31
- private
32
-
33
48
  def interpolate_method(method_key)
34
49
  @@interpolate_methods ||= begin
35
50
  global_lookup = lambda { |key, lookup_invocation| Puppet::Pops::Lookup.lookup(key, nil, '', true, nil, lookup_invocation) }
@@ -31,7 +31,7 @@ module Puppet::DataProviders::HieraSupport
31
31
 
32
32
  def data_providers(data_key, lookup_invocation)
33
33
  @hiera_config ||= Puppet::DataProviders::HieraConfig.new(provider_root(data_key, lookup_invocation.scope))
34
- @data_providers ||= @hiera_config.create_data_providers(lookup_invocation)
34
+ @data_providers ||= @hiera_config.create_configured_data_providers(lookup_invocation, self)
35
35
  end
36
36
  private :data_providers
37
37
  end
@@ -5,8 +5,8 @@ require_relative 'hiera_interpolate'
5
5
 
6
6
  module Puppet::DataProviders
7
7
  class JsonDataProviderFactory < Puppet::Plugins::DataProviders::FileBasedDataProviderFactory
8
- def create(name, paths)
9
- JsonDataProvider.new(name, paths)
8
+ def create(name, paths, parent_data_provider)
9
+ JsonDataProvider.new(name, paths, parent_data_provider)
10
10
  end
11
11
 
12
12
  def path_extension