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
@@ -2,12 +2,15 @@ require 'puppet/node'
2
2
  require 'puppet/resource/catalog'
3
3
  require 'puppet/indirector/code'
4
4
  require 'puppet/util/profiler'
5
+ require 'puppet/util/checksums'
5
6
  require 'yaml'
7
+ require 'uri'
6
8
 
7
9
  class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
8
10
  desc "Compiles catalogs on demand using Puppet's compiler."
9
11
 
10
12
  include Puppet::Util
13
+ include Puppet::Util::Checksums
11
14
 
12
15
  attr_accessor :code
13
16
 
@@ -47,7 +50,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
47
50
  node = node_from_request(request)
48
51
  node.trusted_data = Puppet.lookup(:trusted_information) { Puppet::Context::TrustedInformation.local(node) }.to_h
49
52
 
50
- if catalog = compile(node, request.options[:code_id])
53
+ if catalog = compile(node, request.options)
51
54
  return catalog
52
55
  else
53
56
  # This shouldn't actually happen; we should either return
@@ -81,23 +84,203 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
81
84
  node.add_server_facts(@server_facts)
82
85
  end
83
86
 
87
+ # Determine which checksum to use; if agent_checksum_type is not nil,
88
+ # use the first entry in it that is also in known_checksum_types.
89
+ # If no match is found, return nil.
90
+ def common_checksum_type(agent_checksum_type)
91
+ if agent_checksum_type
92
+ agent_checksum_types = agent_checksum_type.split('.').map {|type| type.to_sym}
93
+ checksum_type = agent_checksum_types.drop_while do |type|
94
+ not known_checksum_types.include? type
95
+ end.first
96
+ end
97
+ checksum_type
98
+ end
99
+
100
+ def get_content_uri(metadata, source, environment_path)
101
+ # The static file content server doesn't know how to expand mountpoints, so
102
+ # we need to do that ourselves from the actual system path of the source file.
103
+ # This does that, while preserving any user-specified server or port.
104
+ source_path = Pathname.new(metadata.full_path)
105
+ path = source_path.relative_path_from(environment_path).to_s
106
+ source_as_uri = URI.parse(URI.escape(source))
107
+ server = source_as_uri.host
108
+ port = ":#{source_as_uri.port}" if source_as_uri.port
109
+ return "puppet://#{server}#{port}/#{path}"
110
+ end
111
+
112
+ # Helper method to decide if a file resource's metadata can be inlined.
113
+ # Also used to profile/log reasons for not inlining.
114
+ def inlineable?(resource, sources)
115
+ case
116
+ when resource[:ensure] == 'absent'
117
+ return Puppet::Util::Profiler.profile("Not inlining absent resource", [:compiler, :static_compile_inlining, :skipped_file_metadata, :absent]) { false }
118
+ when sources.empty?
119
+ return Puppet::Util::Profiler.profile("Not inlining resource without sources", [:compiler, :static_compile_inlining, :skipped_file_metadata, :no_sources]) { false }
120
+ when (not (sources.all? {|source| source =~ /^puppet:/}))
121
+ return Puppet::Util::Profiler.profile("Not inlining unsupported source scheme", [:compiler, :static_compile_inlining, :skipped_file_metadata, :unsupported_scheme]) { false }
122
+ else
123
+ return true
124
+ end
125
+ end
126
+
127
+ # Return true if metadata is inlineable, meaning the request's source is
128
+ # for the 'modules' mount and the resolved path is of the form:
129
+ # $codedir/environments/$environment/*/*/files/**
130
+ def inlineable_metadata?(metadata, source, environment_path)
131
+ source_as_uri = URI.parse(URI.escape(source))
132
+ location = Puppet::Module::FILETYPES['files']
133
+
134
+ !!(source_as_uri.path =~ /^\/modules\// &&
135
+ metadata.full_path =~ /#{environment_path}[^\/]+\/[^\/]+\/#{location}\/.+/)
136
+ end
137
+
138
+ # Helper method to log file resources that could not be inlined because they
139
+ # fall outside of an environment.
140
+ def log_file_outside_environment
141
+ Puppet::Util::Profiler.profile("Not inlining file outside environment", [:compiler, :static_compile_inlining, :skipped_file_metadata, :file_outside_environment]) { true }
142
+ end
143
+
144
+ # Helper method to log file resources that were successfully inlined.
145
+ def log_metadata_inlining
146
+ Puppet::Util::Profiler.profile("Inlining file metadata", [:compiler, :static_compile_inlining, :inlined_file_metadata]) { true }
147
+ end
148
+
149
+ # Inline file metadata for static catalogs
150
+ # Initially restricted to files sourced from codedir via puppet:/// uri.
151
+ def inline_metadata(catalog, checksum_type)
152
+ environment_path = Pathname.new File.join(Puppet[:environmentpath], catalog.environment, "")
153
+ list_of_resources = catalog.resources.find_all { |res| res.type == "File" }
154
+
155
+ # TODO: get property/parameter defaults if entries are nil in the resource
156
+ # For now they're hard-coded to match the File type.
157
+
158
+ file_metadata = {}
159
+ list_of_resources.each do |resource|
160
+ sources = [resource[:source]].flatten.compact
161
+ next unless inlineable?(resource, sources)
162
+
163
+ # both need to handle multiple sources
164
+ if resource[:recurse] == true || resource[:recurse] == 'true' || resource[:recurse] == 'remote'
165
+ # Construct a hash mapping sources to arrays (list of files found recursively) of metadata
166
+ options = {
167
+ :environment => catalog.environment_instance,
168
+ :links => resource[:links] ? resource[:links].to_sym : :manage,
169
+ :checksum_type => resource[:checksum] ? resource[:checksum].to_sym : checksum_type.to_sym,
170
+ :source_permissions => resource[:source_permissions] ? resource[:source_permissions].to_sym : :ignore,
171
+ :recurse => true,
172
+ :recurselimit => resource[:recurselimit],
173
+ :ignore => resource[:ignore],
174
+ }
175
+
176
+ sources_in_environment = true
177
+
178
+ source_to_metadatas = {}
179
+ sources.each do |source|
180
+ source = Puppet::Type.type(:file).attrclass(:source).normalize(source)
181
+
182
+ if list_of_data = Puppet::FileServing::Metadata.indirection.search(source, options)
183
+ basedir_meta = list_of_data.find {|meta| meta.relative_path == '.'}
184
+ devfail "FileServing::Metadata search should always return the root search path" if basedir_meta.nil?
185
+
186
+ if ! inlineable_metadata?(basedir_meta, source, environment_path)
187
+ # If any source is not in the environment path, skip inlining this resource.
188
+ log_file_outside_environment
189
+ sources_in_environment = false
190
+ break
191
+ end
192
+
193
+ base_content_uri = get_content_uri(basedir_meta, source, environment_path)
194
+ list_of_data.each do |metadata|
195
+ if metadata.relative_path == '.'
196
+ metadata.content_uri = base_content_uri
197
+ else
198
+ metadata.content_uri = "#{base_content_uri}/#{metadata.relative_path}"
199
+ end
200
+ end
201
+
202
+ source_to_metadatas[source] = list_of_data
203
+ # Optimize for returning less data if sourceselect is first
204
+ if resource[:sourceselect] == 'first' || resource[:sourceselect].nil?
205
+ break
206
+ end
207
+ end
208
+ end
209
+
210
+ if sources_in_environment && !source_to_metadatas.empty?
211
+ log_metadata_inlining
212
+ catalog.recursive_metadata[resource.title] = source_to_metadatas
213
+ end
214
+ else
215
+ options = {
216
+ :environment => catalog.environment_instance,
217
+ :links => resource[:links] ? resource[:links].to_sym : :manage,
218
+ :checksum_type => resource[:checksum] ? resource[:checksum].to_sym : checksum_type.to_sym,
219
+ :source_permissions => resource[:source_permissions] ? resource[:source_permissions].to_sym : :ignore
220
+ }
221
+
222
+ metadata = nil
223
+ sources.each do |source|
224
+ source = Puppet::Type.type(:file).attrclass(:source).normalize(source)
225
+
226
+ if data = Puppet::FileServing::Metadata.indirection.find(source, options)
227
+ metadata = data
228
+ metadata.source = source
229
+ break
230
+ end
231
+ end
232
+
233
+ raise "Could not get metadata for #{resource[:source]}" unless metadata
234
+
235
+ if inlineable_metadata?(metadata, metadata.source, environment_path)
236
+ metadata.content_uri = get_content_uri(metadata, metadata.source, environment_path)
237
+ log_metadata_inlining
238
+
239
+ # If the file is in the environment directory, we can safely inline
240
+ catalog.metadata[resource.title] = metadata
241
+ else
242
+ # Log a profiler event that we skipped this file because it is not in an environment.
243
+ log_file_outside_environment
244
+ end
245
+ end
246
+ end
247
+ end
248
+
84
249
  # Compile the actual catalog.
85
- def compile(node, code_id)
86
- str = "Compiled catalog for #{node.name}"
250
+ def compile(node, options)
251
+ if node.environment && node.environment.static_catalogs? && options[:static_catalog] && options[:code_id]
252
+ # Check for errors before compiling the catalog
253
+ checksum_type = common_checksum_type(options[:checksum_type])
254
+ raise Puppet::Error, "Unable to find a common checksum type between agent '#{options[:checksum_type]}' and master '#{known_checksum_types}'." unless checksum_type
255
+ end
256
+
257
+ str = "Compiled %s for #{node.name}" % [checksum_type ? 'static catalog' : 'catalog']
87
258
  str += " in environment #{node.environment}" if node.environment
88
259
  config = nil
89
260
 
90
261
  benchmark(:notice, str) do
91
- Puppet::Util::Profiler.profile(str, [:compiler, :compile, node.environment, node.name]) do
262
+ compile_type = checksum_type ? :static_compile : :compile
263
+ Puppet::Util::Profiler.profile(str, [:compiler, compile_type, node.environment, node.name]) do
92
264
  begin
93
- config = Puppet::Parser::Compiler.compile(node, code_id)
265
+ config = Puppet::Parser::Compiler.compile(node, options[:code_id])
94
266
  rescue Puppet::Error => detail
95
267
  Puppet.err(detail.to_s) if networked?
96
268
  raise
97
269
  end
270
+
271
+ if checksum_type && config.is_a?(model)
272
+ str = "Inlined resource metadata into static catalog for #{node.name}"
273
+ str += " in environment #{node.environment}" if node.environment
274
+ benchmark(:notice, str) do
275
+ Puppet::Util::Profiler.profile(str, [:compiler, :static_compile_postprocessing, node.environment, node.name]) do
276
+ inline_metadata(config, checksum_type)
277
+ end
278
+ end
279
+ end
98
280
  end
99
281
  end
100
282
 
283
+
101
284
  config
102
285
  end
103
286
 
@@ -29,19 +29,8 @@ class Puppet::Node::Facts::Facter < Puppet::Indirector::Code
29
29
  self.class.setup_external_search_paths(request) if Puppet.features.external_facts?
30
30
  self.class.setup_search_paths(request)
31
31
 
32
- # Add the puppetversion fact; this is done before generating the hash so it is
33
- # accessible to custom facts.
34
- Facter.add(:puppetversion) do
35
- setcode { Puppet.version.to_s }
36
- end
37
-
38
- Facter.add(:agent_specified_environment) do
39
- setcode do
40
- if Puppet.settings.set_by_config?(:environment)
41
- Puppet[:environment]
42
- end
43
- end
44
- end
32
+ # Initialize core Puppet facts, such as puppetversion
33
+ Puppet.initialize_facts
45
34
 
46
35
  result = Puppet::Node::Facts.new(request.key, Facter.to_hash)
47
36
  result.add_local_facts
@@ -0,0 +1,15 @@
1
+ require 'puppet/file_serving/metadata'
2
+ require 'puppet/indirector/generic_http'
3
+
4
+ class Puppet::Indirector::FileContent::Http < Puppet::Indirector::GenericHttp
5
+ desc "Retrieve file contents from a remote HTTP server."
6
+
7
+ include Puppet::FileServing::TerminusHelper
8
+
9
+ @http_method = :get
10
+
11
+ def find(request)
12
+ response = super
13
+ model.from_binary(response.body)
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ require 'puppet/file_serving/http_metadata'
2
+ require 'puppet/indirector/generic_http'
3
+ require 'puppet/indirector/file_metadata'
4
+ require 'net/http'
5
+
6
+ class Puppet::Indirector::FileMetadata::Http < Puppet::Indirector::GenericHttp
7
+ desc "Retrieve file metadata from a remote HTTP server."
8
+
9
+ include Puppet::FileServing::TerminusHelper
10
+
11
+ @http_method = :head
12
+
13
+ def find(request)
14
+ head = super
15
+
16
+ if head.is_a?(Net::HTTPSuccess)
17
+ metadata = Puppet::FileServing::HttpMetadata.new(head)
18
+ metadata.checksum_type = request.options[:checksum_type] if request.options[:checksum_type]
19
+ metadata.collect
20
+ metadata
21
+ end
22
+ end
23
+
24
+ def search(request)
25
+ raise Puppet::Error, "cannot lookup multiple files"
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ require 'puppet/file_serving/terminus_helper'
2
+ require 'puppet/util/http_proxy'
3
+
4
+ class Puppet::Indirector::GenericHttp < Puppet::Indirector::Terminus
5
+ desc "Retrieve data from a remote HTTP server."
6
+
7
+ class <<self
8
+ attr_accessor :http_method
9
+ end
10
+
11
+ def find(request)
12
+ uri = URI(request.uri)
13
+ method = self.class.http_method
14
+ Puppet::Util::HttpProxy.request_with_redirects(uri,method)
15
+ end
16
+ end
@@ -23,7 +23,9 @@ class Puppet::Indirector::Hiera < Puppet::Indirector::Terminus
23
23
  throw :no_such_key if value.equal?(not_found)
24
24
  value
25
25
  rescue *DataBindingExceptions => detail
26
- raise Puppet::DataBinding::LookupError.new(detail.message, detail)
26
+ error = Puppet::DataBinding::LookupError.new("DataBinding 'hiera': #{detail.message}")
27
+ error.set_backtrace(detail.backtrace)
28
+ raise error
27
29
  end
28
30
 
29
31
  private
@@ -207,10 +207,14 @@ class Puppet::Indirector::Indirection
207
207
  filtered = result
208
208
  if terminus.respond_to?(:filter)
209
209
  Puppet::Util::Profiler.profile("Filtered result for #{self.name} #{request.key}", [:indirector, :filter, self.name, request.key]) do
210
- filtered = terminus.filter(result)
210
+ begin
211
+ filtered = terminus.filter(result)
212
+ rescue Puppet::Error => detail
213
+ Puppet.log_exception(detail)
214
+ raise detail
215
+ end
211
216
  end
212
217
  end
213
-
214
218
  filtered
215
219
  end
216
220
  end
@@ -15,7 +15,7 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
15
15
  filename = path(request.key)
16
16
  FileUtils.mkdir_p(File.dirname(filename))
17
17
 
18
- Puppet::Util.replace_file(filename, 0660) {|f| f.print to_json(request.instance) }
18
+ Puppet::Util.replace_file(filename, 0660) {|f| f.print to_json(request.instance).force_encoding(Encoding::ASCII_8BIT) }
19
19
  rescue TypeError => detail
20
20
  Puppet.log_exception(detail, "Could not save #{self.name} #{request.key}: #{detail}")
21
21
  end
@@ -52,7 +52,7 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
52
52
  json = nil
53
53
 
54
54
  begin
55
- json = File.read(file)
55
+ json = Puppet::FileSystem.read(file).force_encoding(Encoding::ASCII_8BIT)
56
56
  rescue Errno::ENOENT
57
57
  return nil
58
58
  rescue => detail
@@ -3,7 +3,7 @@ require 'puppet/indirector/exec'
3
3
 
4
4
  class Puppet::Node::Exec < Puppet::Indirector::Exec
5
5
  desc "Call an external program to get node information. See
6
- the [External Nodes](http://docs.puppetlabs.com/guides/external_nodes.html) page for more information."
6
+ the [External Nodes](https://docs.puppetlabs.com/guides/external_nodes.html) page for more information."
7
7
  include Puppet::Util
8
8
 
9
9
  def command
@@ -3,7 +3,7 @@ require 'puppet/indirector/ldap'
3
3
 
4
4
  class Puppet::Node::Ldap < Puppet::Indirector::Ldap
5
5
  desc "Search in LDAP for node configuration information. See
6
- the [LDAP Nodes](http://docs.puppetlabs.com/guides/ldap_nodes.html) page for more information. This will first
6
+ the [LDAP Nodes](https://docs.puppetlabs.com/guides/ldap_nodes.html) page for more information. This will first
7
7
  search for whatever the certificate name is, then (if that name
8
8
  contains a `.`) for the short name, then `default`."
9
9
 
@@ -96,7 +96,8 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
96
96
  # WEBrick in Ruby 1.9.1 only supports up to 1024 character lines in an HTTP request
97
97
  # http://redmine.ruby-lang.org/issues/show/3991
98
98
  if "GET #{uri_with_query_string} HTTP/1.1\r\n".length > 1024
99
- http_post(req, uri, body, headers)
99
+ uri_with_env = "#{uri}?environment=#{request.environment.name}"
100
+ http_post(req, uri_with_env, body, headers)
100
101
  else
101
102
  http_get(req, uri_with_query_string, headers)
102
103
  end
@@ -1,6 +1,6 @@
1
1
  require 'puppet'
2
2
  require 'puppet/pops'
3
- require 'puppet/pops/evaluator/literal_evaluator'
3
+ require 'puppet/pops/evaluator/json_strict_literal_evaluator'
4
4
 
5
5
  class Puppet::InfoService::ClassInformationService
6
6
 
@@ -41,7 +41,7 @@ class Puppet::InfoService::ClassInformationService
41
41
  end
42
42
 
43
43
  def literal_evaluator
44
- @@literal_evaluator ||= Puppet::Pops::Evaluator::LiteralEvaluator.new
44
+ @@literal_evaluator ||= Puppet::Pops::Evaluator::JsonStrictLiteralEvaluator.new
45
45
  end
46
46
 
47
47
  def result_of(f)
@@ -53,13 +53,17 @@ class Puppet::InfoService::ClassInformationService
53
53
  end
54
54
 
55
55
  def parse_file(f)
56
+ return {:error => "The file #{f} does not exist"} unless Puppet::FileSystem.exist?(f)
57
+
56
58
  begin
57
59
  parse_result = @parser.parse_file(f)
58
- parse_result.definitions.select {|d| d.is_a?(Puppet::Pops::Model::HostClassDefinition)}.map do |d|
59
- {:name => d.name,
60
- :params => params = d.parameters.map {|p| extract_param(p) }
61
- }
62
- end
60
+ {:classes =>
61
+ parse_result.definitions.select {|d| d.is_a?(Puppet::Pops::Model::HostClassDefinition)}.map do |d|
62
+ {:name => d.name,
63
+ :params => params = d.parameters.map {|p| extract_param(p) }
64
+ }
65
+ end
66
+ }
63
67
  rescue StandardError => e
64
68
  {:error => e.message }
65
69
  end
@@ -79,17 +83,14 @@ class Puppet::InfoService::ClassInformationService
79
83
  value_expr = p.value
80
84
  return structure if value_expr.nil?
81
85
  default_value = value_as_literal(value_expr)
82
- if !default_value.nil?
83
- structure[:default_literal] = default_value
84
- return structure
85
- end
86
+ structure[:default_literal] = default_value unless default_value.nil?
86
87
  structure[:default_source] = extract_value_source(value_expr)
87
88
  structure
88
89
  end
89
90
 
90
91
  def typeexpr_to_string(type_expr)
91
92
  begin
92
- type_parser.interpret_any(type_expr).to_s
93
+ type_parser.interpret_any(type_expr, nil).to_s
93
94
  rescue Puppet::ParseError
94
95
  # type is to complex - contains expressions that are not literal
95
96
  nil
@@ -12,6 +12,7 @@ module Puppet
12
12
  require 'puppet/pops/loader/static_loader'
13
13
  require 'puppet/pops/loader/ruby_function_instantiator'
14
14
  require 'puppet/pops/loader/puppet_function_instantiator'
15
+ require 'puppet/pops/loader/type_definition_instantiator'
15
16
  require 'puppet/pops/loader/loader_paths'
16
17
  require 'puppet/pops/loader/simple_environment_loader'
17
18
  end
data/lib/puppet/module.rb CHANGED
@@ -154,7 +154,12 @@ class Puppet::Module
154
154
  end
155
155
 
156
156
  if attr == :dependencies
157
+ unless value.is_a?(Array)
158
+ raise MissingMetadata, "The value for the key dependencies in the file metadata.json of the module #{self.name} must be an array, not: '#{value}'"
159
+ end
157
160
  value.each do |dep|
161
+ name = dep['name']
162
+ dep['name'] = name.tr('-', '/') unless name.nil?
158
163
  dep['version_requirement'] ||= '>= 0.0.0'
159
164
  end
160
165
  end
@@ -269,11 +274,10 @@ class Puppet::Module
269
274
 
270
275
  dependencies.each do |dependency|
271
276
  name = dependency['name']
272
- forge_name = name.tr('-', '/')
273
277
  version_string = dependency['version_requirement'] || '>= 0.0.0'
274
278
 
275
279
  dep_mod = begin
276
- environment.module_by_forge_name(forge_name)
280
+ environment.module_by_forge_name(name)
277
281
  rescue
278
282
  nil
279
283
  end
@@ -1,7 +1,14 @@
1
- source 'https://rubygems.org'
1
+ source ENV['GEM_SOURCE'] || 'https://rubygems.org'
2
2
 
3
3
  puppetversion = ENV.key?('PUPPET_VERSION') ? "#{ENV['PUPPET_VERSION']}" : ['>= 3.3']
4
+ gem 'metadata-json-lint'
4
5
  gem 'puppet', puppetversion
5
- gem 'puppetlabs_spec_helper', '>= 0.8.2'
6
+ gem 'puppetlabs_spec_helper', '>= 1.0.0'
6
7
  gem 'puppet-lint', '>= 1.0.0'
7
8
  gem 'facter', '>= 1.7.0'
9
+ gem 'rspec-puppet'
10
+
11
+ # rspec must be v2 for ruby 1.8.7
12
+ if RUBY_VERSION >= '1.8.7' and RUBY_VERSION < '1.9'
13
+ gem 'rspec', '~> 2.0'
14
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  describe '<%= metadata.name %>' do
3
3
 
4
- context 'with defaults for all parameters' do
4
+ context 'with default values for all parameters' do
5
5
  it { should contain_class('<%= metadata.name %>') }
6
6
  end
7
7
  end
@@ -7,6 +7,6 @@
7
7
  # environment (to compare the resulting system state to the desired state).
8
8
  #
9
9
  # Learn more about module testing here:
10
- # http://docs.puppetlabs.com/guides/tests_smoke.html
10
+ # https://docs.puppetlabs.com/guides/tests_smoke.html
11
11
  #
12
- include <%= metadata.name %>
12
+ include ::<%= metadata.name %>
@@ -25,13 +25,13 @@ class Puppet::ModuleTool::Tar::Mini
25
25
  #
26
26
  # This check was mainly added to ignore 'x' and 'g' flags from the PAX
27
27
  # standard but will also ignore any other non-standard tar flags.
28
- # tar format info: http://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.bpxa500%2Ftaf.htm
29
- # pax format info: http://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.bpxa500%2Fpxarchfm.htm
28
+ # tar format info: https://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.bpxa500%2Ftaf.htm
29
+ # pax format info: https://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.bpxa500%2Fpxarchfm.htm
30
30
  def find_valid_files(tarfile)
31
31
  Archive::Tar::Minitar.open(tarfile).collect do |entry|
32
32
  flag = entry.typeflag
33
33
  if flag.nil? || flag =~ /[[:digit:]]/ && (0..7).include?(flag.to_i)
34
- entry.name
34
+ entry.full_name
35
35
  else
36
36
  Puppet.debug "Invalid tar flag '#{flag}' will not be extracted: #{entry.name}"
37
37
  next
@@ -81,10 +81,19 @@ class Puppet::Network::HTTP::Pool
81
81
 
82
82
  Puppet.debug("Starting connection for #{site}")
83
83
  http.start
84
+ setsockopts(http.instance_variable_get(:@socket))
84
85
  http
85
86
  end
86
87
  end
87
88
 
89
+ # Set useful socket option(s) which lack from default settings in Net:HTTP
90
+ #
91
+ # @api private
92
+ def setsockopts(netio)
93
+ socket = netio.io
94
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
95
+ end
96
+
88
97
  # Release a connection back into the pool.
89
98
  #
90
99
  # @api private
@@ -186,6 +186,15 @@ class Puppet::Node::Environment
186
186
  !original_manifest.nil? && !original_manifest.empty? && original_manifest != Puppet[:default_manifest]
187
187
  end
188
188
 
189
+ # @api private
190
+ def static_catalogs?
191
+ if @static_catalogs.nil?
192
+ environment_conf = Puppet.lookup(:environments).get_conf(name)
193
+ @static_catalogs = (environment_conf.nil? ? Puppet[:static_catalogs] : environment_conf.static_catalogs)
194
+ end
195
+ @static_catalogs
196
+ end
197
+
189
198
  # Return the environment configuration
190
199
  # @return [Puppet::Settings::EnvironmentConf] The configuration
191
200
  #
@@ -449,8 +458,8 @@ class Puppet::Node::Environment
449
458
  private
450
459
 
451
460
  def self.extralibs()
452
- if ENV["PUPPETLIB"]
453
- split_path(ENV["PUPPETLIB"])
461
+ if Puppet::Util.get_env('PUPPETLIB')
462
+ split_path(Puppet::Util.get_env('PUPPETLIB'))
454
463
  else
455
464
  []
456
465
  end
data/lib/puppet/node.rb CHANGED
@@ -21,6 +21,8 @@ class Puppet::Node
21
21
 
22
22
  attr_reader :server_facts
23
23
 
24
+ ENVIRONMENT = 'environment'.freeze
25
+
24
26
  def initialize_from_hash(data)
25
27
  @name = data['name'] || (raise ArgumentError, "No name provided in serialized data")
26
28
  @classes = data['classes'] || []
@@ -48,7 +50,7 @@ class Puppet::Node
48
50
  if @environment
49
51
  @environment
50
52
  else
51
- if env = parameters["environment"]
53
+ if env = parameters[ENVIRONMENT]
52
54
  self.environment = env
53
55
  elsif environment_name
54
56
  self.environment = environment_name
@@ -70,6 +72,13 @@ class Puppet::Node
70
72
  else
71
73
  @environment = env
72
74
  end
75
+
76
+ # Keep environment_name attribute and parameter in sync if they have been set
77
+ unless @environment.nil?
78
+ @parameters[ENVIRONMENT] = @environment.name.to_s if @parameters.include?(ENVIRONMENT)
79
+ self.environment_name = @environment.name if instance_variable_defined?(:@environment_name)
80
+ end
81
+ @environment
73
82
  end
74
83
 
75
84
  def has_environment_instance?
@@ -125,7 +134,7 @@ class Puppet::Node
125
134
  end
126
135
  end
127
136
 
128
- @parameters["environment"] ||= self.environment.name.to_s
137
+ @parameters[ENVIRONMENT] ||= self.environment.name.to_s
129
138
  end
130
139
 
131
140
  def add_server_facts(facts)