puppet 4.3.2 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (487) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  328. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  333. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -41,7 +41,7 @@ class Puppet::Agent
41
41
  result = run_in_fork(should_fork) do
42
42
  with_client do |client|
43
43
  begin
44
- client_args = client_options.merge(:pluginsync => Puppet[:pluginsync])
44
+ client_args = client_options.merge(:pluginsync => Puppet::Configurer.should_pluginsync?)
45
45
  lock { client.run(client_args) }
46
46
  rescue Puppet::LockError
47
47
  Puppet.notice "Run of #{client_class} already in progress; skipping (#{lockfile_path} exists)"
@@ -155,7 +155,7 @@ specify '--server <servername>' as an argument. Boolean settings translate into
155
155
  '--setting' and '--no-setting' pairs.
156
156
 
157
157
  See the configuration file documentation at
158
- http://docs.puppetlabs.com/references/stable/configuration.html for the
158
+ https://docs.puppetlabs.com/references/stable/configuration.html for the
159
159
  full list of acceptable settings. A commented list of all settings can also be
160
160
  generated by running puppet agent with '--genconfig'.
161
161
 
@@ -404,7 +404,9 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
404
404
  # we want the last report to be persisted locally
405
405
  Puppet::Transaction::Report.indirection.cache_class = :yaml
406
406
 
407
- if Puppet[:catalog_cache_terminus]
407
+ if Puppet[:noop]
408
+ Puppet::Resource::Catalog.indirection.cache_class = nil
409
+ elsif Puppet[:catalog_cache_terminus]
408
410
  Puppet::Resource::Catalog.indirection.cache_class = Puppet[:catalog_cache_terminus]
409
411
  end
410
412
 
@@ -74,7 +74,7 @@ valid setting, so you can specify '--tags <class>,<tag>'
74
74
  as an argument.
75
75
 
76
76
  See the configuration file documentation at
77
- http://docs.puppetlabs.com/references/stable/configuration.html for the
77
+ https://docs.puppetlabs.com/references/stable/configuration.html for the
78
78
  full list of acceptable parameters. A commented list of all
79
79
  configuration options can also be generated by running puppet with
80
80
  '--genconfig'.
@@ -175,7 +175,7 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
175
175
  if options[:catalog] == "-"
176
176
  text = $stdin.read
177
177
  else
178
- text = ::File.read(options[:catalog])
178
+ text = Puppet::FileSystem.read(options[:catalog], :encoding => 'utf-8')
179
179
  end
180
180
  catalog = read_catalog(text)
181
181
  apply_catalog(catalog)
@@ -239,7 +239,7 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
239
239
  $stderr.puts "#{file} is not readable"
240
240
  exit(63)
241
241
  end
242
- node.classes = ::File.read(file).split(/[\s\n]+/)
242
+ node.classes = Puppet::FileSystem.read(file, :encoding => 'utf-8').split(/[\s\n]+/)
243
243
  end
244
244
  end
245
245
 
@@ -315,7 +315,10 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
315
315
 
316
316
  Puppet.settings.use :main, :agent, :ssl
317
317
 
318
- if Puppet[:catalog_cache_terminus]
318
+
319
+ if Puppet[:noop]
320
+ Puppet::Resource::Catalog.indirection.cache_class = nil
321
+ elsif Puppet[:catalog_cache_terminus]
319
322
  Puppet::Resource::Catalog.indirection.cache_class = Puppet[:catalog_cache_terminus]
320
323
  end
321
324
 
@@ -164,7 +164,7 @@ setting, so you can specify '--ssldir <directory>' as an
164
164
  argument.
165
165
 
166
166
  See the configuration file documentation at
167
- http://docs.puppetlabs.com/references/stable/configuration.html for the
167
+ https://docs.puppetlabs.com/references/stable/configuration.html for the
168
168
  full list of acceptable parameters. A commented list of all
169
169
  configuration options can also be generated by running puppet cert with
170
170
  '--genconfig'.
@@ -199,7 +199,7 @@ Licensed under the Apache 2.0 License
199
199
 
200
200
  require 'puppet/configurer'
201
201
  configurer = Puppet::Configurer.new
202
- configurer.run(:network_device => true, :pluginsync => Puppet[:pluginsync])
202
+ configurer.run(:network_device => true, :pluginsync => Puppet::Configurer.should_pluginsync?)
203
203
  rescue => detail
204
204
  Puppet.log_exception(detail)
205
205
  # If we rescued an error, then we return 1 as the exit code
@@ -73,7 +73,7 @@ setting, so you can specify '--ssldir <directory>' as an
73
73
  argument.
74
74
 
75
75
  See the configuration file documentation at
76
- http://docs.puppetlabs.com/references/stable/configuration.html for the
76
+ https://docs.puppetlabs.com/references/stable/configuration.html for the
77
77
  full list of acceptable parameters. A commented list of all
78
78
  configuration options can also be generated by running puppet with
79
79
  '--genconfig'.
@@ -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:
@@ -214,7 +214,7 @@ the puppet lookup function linked to above.
214
214
 
215
215
  EXAMPLE
216
216
  -------
217
- 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
218
218
  call lookup like this:
219
219
  $ puppet lookup key_name
220
220
 
@@ -302,11 +302,11 @@ Copyright (c) 2015 Puppet Labs, LLC Licensed under the Apache 2.0 License
302
302
  renderer = Puppet::Network::FormatHandler.format(format == :json ? :pson : format)
303
303
  raise "Unknown rendering format '#{format}'" if renderer.nil?
304
304
 
305
- type = options.include?(:type) ? Puppet::Pops::Types::TypeParser.new.parse(options[:type]) : nil
306
305
 
307
306
  generate_scope do |scope|
308
307
  lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, explain ? Puppet::Pops::Lookup::Explainer.new(explain_options, only_explain_options) : nil)
309
308
  begin
309
+ type = options.include?(:type) ? Puppet::Pops::Types::TypeParser.new.parse(options[:type], scope) : nil
310
310
  result = Puppet::Pops::Lookup.lookup(keys, type, options[:default_value], use_default_value, merge_options, lookup_invocation)
311
311
  puts renderer.render(result) unless explain
312
312
  rescue Puppet::DataBinding::LookupError
@@ -335,9 +335,9 @@ Copyright (c) 2015 Puppet Labs, LLC Licensed under the Apache 2.0 License
335
335
  if fact_file
336
336
  original_facts = node.parameters
337
337
  if fact_file.end_with?("json")
338
- given_facts = JSON.parse(File.read(fact_file))
338
+ given_facts = JSON.parse(Puppet::FileSystem.read(fact_file, :encoding => 'utf-8'))
339
339
  else
340
- given_facts = YAML.load(File.read(fact_file))
340
+ given_facts = YAML.load(Puppet::FileSystem.read(fact_file, :encoding => 'utf-8'))
341
341
  end
342
342
 
343
343
  unless given_facts.instance_of?(Hash)
@@ -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) }