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
@@ -0,0 +1,57 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet'
4
+ require 'puppet/data_providers/hiera_config'
5
+ require 'puppet/data_providers/hiera_interpolate'
6
+
7
+ describe "Puppet::DataProviders::HieraInterpolate" do
8
+
9
+ let(:interpolator) { Class.new { include Puppet::DataProviders::HieraInterpolate }.new }
10
+ let(:scope) { {} }
11
+ let(:lookup_invocation) { Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, nil) }
12
+
13
+ context 'when interpolating nested data' do
14
+ let(:nested_hash) { { 'a' => { 'aa' => "%{alias('aaa')}" } } }
15
+
16
+ it 'produces a nested hash with arrays from nested aliases with hashes and arrays' do
17
+ Puppet::Pops::Lookup.expects(:lookup).with('aaa', nil, '', true, nil, lookup_invocation).returns({ 'b' => { 'bb' => "%{alias('bbb')}" } })
18
+ Puppet::Pops::Lookup.expects(:lookup).with('bbb', nil, '', true, nil, lookup_invocation).returns([ "%{alias('ccc')}" ])
19
+ Puppet::Pops::Lookup.expects(:lookup).with('ccc', nil, '', true, nil, lookup_invocation).returns('text')
20
+ expect(interpolator.interpolate(nested_hash, lookup_invocation, true)).to eq('a'=>{'aa'=>{'b'=>{'bb'=>['text']}}})
21
+ end
22
+ end
23
+
24
+ context 'when there are empty interpolations %{} in data' do
25
+
26
+ let(:empty_interpolation) {'clown%{}shoe'}
27
+ let(:empty_interpolation_as_escape) {'clown%%{}{shoe}s'}
28
+ let(:only_empty_interpolation) {'%{}'}
29
+ let(:empty_namespace) {'%{::}'}
30
+ let(:whitespace1) {'%{ :: }'}
31
+ let(:whitespace2) {'%{ }'}
32
+
33
+ it 'should produce an empty string for the interpolation' do
34
+ expect(interpolator.interpolate(empty_interpolation, lookup_invocation, true)).to eq('clownshoe')
35
+ end
36
+
37
+ it 'the empty interpolation can be used as an escape mechanism' do
38
+ expect(interpolator.interpolate(empty_interpolation_as_escape, lookup_invocation, true)).to eq('clown%{shoe}s')
39
+ end
40
+
41
+ it 'the value can consist of only an empty escape' do
42
+ expect(interpolator.interpolate(only_empty_interpolation, lookup_invocation, true)).to eq('')
43
+ end
44
+
45
+ it 'the value can consist of an empty namespace %{::}' do
46
+ expect(interpolator.interpolate(empty_namespace, lookup_invocation, true)).to eq('')
47
+ end
48
+
49
+ it 'the value can consist of whitespace %{ :: }' do
50
+ expect(interpolator.interpolate(whitespace1, lookup_invocation, true)).to eq('')
51
+ end
52
+
53
+ it 'the value can consist of whitespace %{ }' do
54
+ expect(interpolator.interpolate(whitespace2, lookup_invocation, true)).to eq('')
55
+ end
56
+ end
57
+ end
@@ -71,4 +71,19 @@ describe "Defaults" do
71
71
  end
72
72
 
73
73
  end
74
+
75
+ describe 'supported_checksum_types' do
76
+ it 'should default to md5,sha256' do
77
+ expect(Puppet.settings[:supported_checksum_types]).to eq(['md5', 'sha256'])
78
+ end
79
+
80
+ it 'should raise an error on an unsupported checksum type' do
81
+ expect { Puppet.settings[:supported_checksum_types] = ['md5', 'foo'] }.to raise_exception ArgumentError, 'Unrecognized checksum types ["foo"] are not supported. Valid values are ["md5", "md5lite", "sha256", "sha256lite", "sha1", "sha1lite", "mtime", "ctime"].'
82
+ end
83
+
84
+ it 'should not raise an error on setting a valid list of checksum types' do
85
+ Puppet.settings[:supported_checksum_types] = ['sha256', 'md5lite', 'mtime']
86
+ expect(Puppet.settings[:supported_checksum_types]).to eq(['sha256', 'md5lite', 'mtime'])
87
+ end
88
+ end
74
89
  end
@@ -121,6 +121,7 @@ describe Puppet::Environments do
121
121
  manifest=#{manifestdir}
122
122
  modulepath=#{modulepath.join(File::PATH_SEPARATOR)}
123
123
  config_version=/some/script
124
+ static_catalogs=false
124
125
  EOF
125
126
  end
126
127
 
@@ -156,6 +157,17 @@ config_version=/some/script
156
157
  end
157
158
  end
158
159
 
160
+ it "reads static_catalogs setting" do
161
+ loader_from(:filesystem => [envdir, manifestdir, modulepath].flatten,
162
+ :directory => envdir) do |loader|
163
+ expect(loader.get("env1")).to environment(:env1).
164
+ with_manifest(manifestdir.path).
165
+ with_modulepath(modulepath.map(&:path)).
166
+ with_config_version(File.expand_path('/some/script')).
167
+ with_static_catalogs(false)
168
+ end
169
+ end
170
+
159
171
  it "accepts an empty environment.conf without warning" do
160
172
  content = nil
161
173
 
@@ -176,7 +188,8 @@ config_version=/some/script
176
188
  expect(loader.get("env1")).to environment(:env1).
177
189
  with_manifest("#{FS.path_string(envdir)}/env1/manifests").
178
190
  with_modulepath(["#{FS.path_string(envdir)}/env1/modules", global_path_location]).
179
- with_config_version(nil)
191
+ with_config_version(nil).
192
+ with_static_catalogs(true)
180
193
  end
181
194
 
182
195
  expect(@logs).to be_empty
@@ -386,6 +399,7 @@ config_version=$vardir/random/scripts
386
399
  expect(conf.modulepath).to eq('')
387
400
  expect(conf.manifest).to eq(:no_manifest)
388
401
  expect(conf.config_version).to be_nil
402
+ expect(conf.static_catalogs).to eq(true)
389
403
  end
390
404
 
391
405
  it "returns nil if you request a configuration from an env that doesn't exist" do
@@ -547,7 +561,8 @@ config_version=$vardir/random/scripts
547
561
  (!@manifest || @manifest == env.manifest) &&
548
562
  (!@modulepath || @modulepath == env.modulepath) &&
549
563
  (!@full_modulepath || @full_modulepath == env.full_modulepath) &&
550
- (!@config_version || @config_version == env.config_version)
564
+ (!@config_version || @config_version == env.config_version) &&
565
+ (!@static_catalogs || @static_catalogs == env.static_catalogs?)
551
566
  end
552
567
 
553
568
  chain :with_manifest do |manifest|
@@ -566,16 +581,21 @@ config_version=$vardir/random/scripts
566
581
  @config_version = config_version
567
582
  end
568
583
 
584
+ chain :with_static_catalogs do |static_catalogs|
585
+ @static_catalogs = static_catalogs
586
+ end
587
+
569
588
  description do
570
589
  "environment #{expected}" +
571
590
  (@manifest ? " with manifest #{@manifest}" : "") +
572
591
  (@modulepath ? " with modulepath [#{@modulepath.join(', ')}]" : "") +
573
592
  (@full_modulepath ? " with full_modulepath [#{@full_modulepath.join(', ')}]" : "") +
574
- (@config_version ? " with config_version #{@config_version}" : "")
593
+ (@config_version ? " with config_version #{@config_version}" : "") +
594
+ (@static_catalogs ? " with static_catalogs #{@static_catalogs}" : "")
575
595
  end
576
596
 
577
597
  failure_message do |env|
578
- "expected <#{env.name}: modulepath = [#{env.full_modulepath.join(', ')}], manifest = #{env.manifest}, config_version = #{env.config_version}> to be #{description}"
598
+ "expected <#{env.name}: modulepath = [#{env.full_modulepath.join(', ')}], manifest = #{env.manifest}, config_version = #{env.config_version}>, static_catalogs = #{env.static_catalogs?} to be #{description}"
579
599
  end
580
600
  end
581
601
 
@@ -150,7 +150,7 @@ describe Puppet::Face[:epp, :current] do
150
150
  dir = dir_containing('templates', { template_name => "<% 1 2 3 %>" })
151
151
  template = File.join(dir, template_name)
152
152
  expect(eppface.dump(template, :validate => true)).to eq("")
153
- expect(@logs.join).to match(/This Literal Integer has no effect.* line 1:4/)
153
+ expect(@logs.join).to match(/This Literal Integer has no effect.*\/template1.epp:1:4/)
154
154
  end
155
155
 
156
156
  it "validated content by default" do
@@ -158,7 +158,7 @@ describe Puppet::Face[:epp, :current] do
158
158
  dir = dir_containing('templates', { template_name => "<% 1 2 3 %>" })
159
159
  template = File.join(dir, template_name)
160
160
  expect(eppface.dump(template)).to eq("")
161
- expect(@logs.join).to match(/This Literal Integer has no effect.* line 1:4/)
161
+ expect(@logs.join).to match(/This Literal Integer has no effect.*\/template1.epp:1:4/)
162
162
  end
163
163
 
164
164
  it "informs the user of files that don't exist" do
@@ -30,9 +30,25 @@ describe Puppet::Face[:parser, :current] do
30
30
  end
31
31
 
32
32
  it "runs error free when there are no validation errors" do
33
- manifest = file_containing('site.pp', "notify { valid: }")
33
+ expect {
34
+ manifest = file_containing('site.pp', "notify { valid: }")
35
+ parser.validate(manifest)
36
+ }.to_not raise_error
37
+ end
38
+
39
+ it "runs error free when there is a puppet function in manifest being validated" do
40
+ expect {
41
+ manifest = file_containing('site.pp', "function valid() { 'valid' } notify{ valid(): }")
42
+ parser.validate(manifest)
43
+ }.to_not raise_error
44
+ end
34
45
 
35
- parser.validate(manifest)
46
+ it "runs error free when there is a type alias in a manifest that requires type resolution" do
47
+ expect {
48
+ manifest = file_containing('site.pp',
49
+ "type A = String; type B = Array[A]; function valid(B $x) { $x } notify{ valid([valid]): }")
50
+ parser.validate(manifest)
51
+ }.to_not raise_error
36
52
  end
37
53
 
38
54
  it "reports missing files" do
@@ -98,6 +114,31 @@ describe Puppet::Face[:parser, :current] do
98
114
  expect(@logs[0].message).to eq("Syntax error at end of file")
99
115
  expect(@logs[0].level).to eq(:err)
100
116
  end
117
+
118
+ it "logs an error if the input begins with a UTF-8 BOM (Byte Order Mark)" do
119
+ utf8_bom_manifest = file_containing('utf8_bom.pp', "\uFEFFnotice hi")
120
+
121
+ output = parser.dump(utf8_bom_manifest)
122
+
123
+ expect(output).to eq("")
124
+ expect(@logs[1].message).to eq("Illegal UTF-8 Byte Order mark at beginning of input: [EF BB BF] - remove these from the puppet source")
125
+ expect(@logs[1].level).to eq(:err)
126
+ end
127
+
128
+ it "runs error free when there is a puppet function in manifest being dumped" do
129
+ expect {
130
+ manifest = file_containing('site.pp', "function valid() { 'valid' } notify{ valid(): }")
131
+ parser.dump(manifest)
132
+ }.to_not raise_error
133
+ end
134
+
135
+ it "runs error free when there is a type alias in a manifest that requires type resolution" do
136
+ expect {
137
+ manifest = file_containing('site.pp',
138
+ "type A = String; type B = Array[A]; function valid(B $x) { $x } notify{ valid([valid]): }")
139
+ parser.dump(manifest)
140
+ }.to_not raise_error
141
+ end
101
142
  end
102
143
 
103
144
  def from_an_interactive_terminal
@@ -0,0 +1,85 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/file_serving/http_metadata'
4
+ require 'matchers/json'
5
+ require 'net/http'
6
+ require 'digest'
7
+
8
+ describe Puppet::FileServing::HttpMetadata do
9
+ let(:foobar) { File.expand_path('/foo/bar') }
10
+
11
+ it "should be a subclass of Metadata" do
12
+ expect( described_class.superclass ).to be Puppet::FileServing::Metadata
13
+ end
14
+
15
+ describe "when initializing" do
16
+ let(:http_response) { Net::HTTPOK.new(1.0, '200', 'OK') }
17
+
18
+ it "can be instantiated from a HTTP response object" do
19
+ expect( described_class.new(http_response) ).to_not be_nil
20
+ end
21
+
22
+ it "represents a plain file" do
23
+ expect( described_class.new(http_response).ftype ).to eq 'file'
24
+ end
25
+
26
+ it "carries no information on owner, group and mode" do
27
+ metadata = described_class.new(http_response)
28
+ expect( metadata.owner ).to be_nil
29
+ expect( metadata.group ).to be_nil
30
+ expect( metadata.mode ).to be_nil
31
+ end
32
+
33
+ context "with no Last-Modified or Content-MD5 header from the server" do
34
+ before do
35
+ http_response.stubs(:[]).with('last-modified').returns nil
36
+ http_response.stubs(:[]).with('content-md5').returns nil
37
+ end
38
+
39
+ it "should use :mtime as the checksum type, based on current time" do
40
+ # Stringifying Time.now does some rounding; do so here so we don't end up with a time
41
+ # that's greater than the stringified version returned by collect.
42
+ time = Time.parse(Time.now.to_s)
43
+ metadata = described_class.new(http_response)
44
+ metadata.collect
45
+ expect( metadata.checksum_type ).to eq :mtime
46
+ checksum = metadata.checksum
47
+ expect( checksum[0...7] ).to eq '{mtime}'
48
+ expect( Time.parse(checksum[7..-1]) ).to be >= time
49
+ end
50
+ end
51
+
52
+ context "with a Last-Modified header from the server" do
53
+ let(:time) { Time.now.utc }
54
+ before do
55
+ http_response.stubs(:[]).with('content-md5').returns nil
56
+ end
57
+
58
+ it "should use :mtime as the checksum type, based on Last-Modified" do
59
+ # HTTP uses "GMT" not "UTC"
60
+ http_response.stubs(:[]).with('last-modified').returns(time.strftime("%a, %d %b %Y %T GMT"))
61
+ metadata = described_class.new(http_response)
62
+ metadata.collect
63
+ expect( metadata.checksum_type ).to eq :mtime
64
+ expect( metadata.checksum ).to eq "{mtime}#{time.to_time}"
65
+ end
66
+ end
67
+
68
+ context "with a Content-MD5 header being received" do
69
+ let(:input) { Time.now.to_s }
70
+ let(:base64) { Digest::MD5.new.base64digest input }
71
+ let(:hex) { Digest::MD5.new.hexdigest input }
72
+ before do
73
+ http_response.stubs(:[]).with('last-modified').returns nil
74
+ http_response.stubs(:[]).with('content-md5').returns base64
75
+ end
76
+
77
+ it "should use the md5 checksum" do
78
+ metadata = described_class.new(http_response)
79
+ metadata.collect
80
+ expect( metadata.checksum_type ).to eq :md5
81
+ expect( metadata.checksum ).to eq "{md5}#{hex}"
82
+ end
83
+ end
84
+ end
85
+ end
@@ -76,6 +76,45 @@ describe Puppet::FileServing::Metadata do
76
76
  it "should pass the checksum in the hash verbatim as the checksum's value" do
77
77
  expect(metadata.to_data_hash['checksum']['value']).to eq(metadata.checksum)
78
78
  end
79
+
80
+ describe "when a source and content_uri are set" do
81
+ before do
82
+ metadata.source = '/foo'
83
+ metadata.content_uri = 'puppet:///foo'
84
+ end
85
+
86
+ it "the data should include the path, relative_path, links, owner, group, mode, checksum, type, destination, source, and content_uri" do
87
+ expect(metadata.to_data_hash.keys.sort).to eq(%w{ path relative_path links owner group mode checksum type destination source content_uri }.sort)
88
+ end
89
+
90
+ it "should pass the source in the hash verbatim" do
91
+ expect(metadata.to_data_hash['source']).to eq(metadata.source)
92
+ end
93
+
94
+ it "should pass the content_uri in the hash verbatim" do
95
+ expect(metadata.to_data_hash['content_uri']).to eq(metadata.content_uri)
96
+ end
97
+ end
98
+
99
+ describe "when assigning a content_uri" do
100
+ it "should fail if uri is invalid" do
101
+ expect { metadata.content_uri = '://' }.to raise_error ArgumentError, /Could not understand URI :\/\//
102
+ end
103
+
104
+ it "should accept characters that require percent-encoding" do
105
+ uri = 'puppet:///modules/foo/files/ %:?#[]@!$&\'()*+,;='
106
+ metadata.content_uri = uri
107
+ expect(metadata.content_uri).to eq(uri)
108
+ end
109
+
110
+ it "should fail if uri is opaque" do
111
+ expect { metadata.content_uri = 'scheme:www.example.com' }.to raise_error ArgumentError, "Cannot use opaque URLs 'scheme:www.example.com'"
112
+ end
113
+
114
+ it "should fail if uri is not a puppet scheme" do
115
+ expect { metadata.content_uri = 'http://www.example.com' }.to raise_error ArgumentError, "Must use URLs of type puppet as content URI"
116
+ end
117
+ end
79
118
  end
80
119
  end
81
120
 
@@ -135,6 +174,17 @@ describe Puppet::FileServing::Metadata, :uses_checksums => true do
135
174
  it "should validate against the schema" do
136
175
  expect(metadata.to_pson).to validate_against('api/schemas/file_metadata.json')
137
176
  end
177
+
178
+ describe "when a source and content_uri are set" do
179
+ before do
180
+ metadata.source = '/foo'
181
+ metadata.content_uri = 'puppet:///foo'
182
+ end
183
+
184
+ it "should validate against the schema" do
185
+ expect(metadata.to_pson).to validate_against('api/schemas/file_metadata.json')
186
+ end
187
+ end
138
188
  end
139
189
 
140
190
  describe "when managing directories" do
@@ -22,8 +22,18 @@ describe Puppet::FileServing::TerminusSelector do
22
22
  expect(@object.select(@request)).to eq(:file)
23
23
  end
24
24
 
25
- it "should fail when a protocol other than :puppet or :file is used" do
26
- @request.stubs(:protocol).returns "http"
25
+ it "should return :http if the URI protocol is set to 'http'" do
26
+ @request.expects(:protocol).returns "http"
27
+ expect(@object.select(@request)).to eq :http
28
+ end
29
+
30
+ it "should return :http if the URI protocol is set to 'https'" do
31
+ @request.expects(:protocol).returns "https"
32
+ expect(@object.select(@request)).to eq :http
33
+ end
34
+
35
+ it "should fail when a protocol other than :puppet, :http(s) or :file is used" do
36
+ @request.stubs(:protocol).returns "ftp"
27
37
  expect { @object.select(@request) }.to raise_error(ArgumentError)
28
38
  end
29
39
 
@@ -134,6 +134,32 @@ describe "Puppet::FileSystem" do
134
134
  end
135
135
  end
136
136
 
137
+ context "read should allow an encoding to be specified" do
138
+ # First line of Rune version of Rune poem at http://www.columbia.edu/~fdc/utf8/
139
+ # characters chosen since they will not parse on Windows with codepage 437 or 1252
140
+ # Section 3.2.1.3 of Ruby spec guarantees that \u strings are encoded as UTF-8
141
+ let (:rune_utf8) { "\u16A0\u16C7\u16BB" } # 'ᚠᛇᚻ'
142
+
143
+ it "and should read a UTF8 file properly" do
144
+ temp_file = file_containing('utf8.txt', rune_utf8)
145
+
146
+ contents = Puppet::FileSystem.read(temp_file, :encoding => 'utf-8')
147
+
148
+ expect(contents.encoding).to eq(Encoding::UTF_8)
149
+ expect(contents).to eq(rune_utf8)
150
+ end
151
+
152
+ it "does not strip the UTF8 BOM (Byte Order Mark) if present in a file" do
153
+ bom = "\uFEFF"
154
+
155
+ temp_file = file_containing('utf8bom.txt', "#{bom}#{rune_utf8}")
156
+ contents = Puppet::FileSystem.read(temp_file, :encoding => 'utf-8')
157
+
158
+ expect(contents.encoding).to eq(Encoding::UTF_8)
159
+ expect(contents).to eq("#{bom}#{rune_utf8}")
160
+ end
161
+ end
162
+
137
163
  describe "symlink",
138
164
  :if => ! Puppet.features.manages_symlinks? &&
139
165
  Puppet.features.microsoft_windows? do
@@ -1,8 +1,11 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/pops'
3
3
  require 'puppet/loaders'
4
+ require 'puppet_spec/compiler'
4
5
 
5
6
  describe 'the assert_type function' do
7
+ include PuppetSpec::Compiler
8
+
6
9
  after(:all) { Puppet::Pops::Loaders.clear }
7
10
 
8
11
  let(:loaders) { Puppet::Pops::Loaders.new(Puppet::Node::Environment.create(:testing, [])) }
@@ -19,13 +22,13 @@ describe 'the assert_type function' do
19
22
  it 'asserts non compliant type by raising an error' do
20
23
  expect do
21
24
  func.call({}, type(Integer), 'hello world')
22
- end.to raise_error(Puppet::Pops::Types::TypeAssertionError, /does not match actual/)
25
+ end.to raise_error(Puppet::Pops::Types::TypeAssertionError, /expected an Integer value, got String/)
23
26
  end
24
27
 
25
28
  it 'checks that first argument is a type' do
26
29
  expect do
27
30
  func.call({}, 10, 10)
28
- end.to raise_error(ArgumentError, "'assert_type' expected one of:
31
+ end.to raise_error(ArgumentError, "'assert_type' expects one of:
29
32
  (Type type, Any value, Callable[Type, Type] block?)
30
33
  rejected: parameter 'type' expects a Type value, got Integer
31
34
  (String type_string, Any value, Callable[Type, Type] block?)
@@ -52,4 +55,35 @@ describe 'the assert_type function' do
52
55
  def type(type_ref)
53
56
  Puppet::Pops::Types::TypeFactory.type_of(type_ref)
54
57
  end
58
+
59
+ it 'can validate a resource type' do
60
+ expect(eval_and_collect_notices("assert_type(Type[Resource], File['/tmp/test']) notice('ok')")).to eq(['ok'])
61
+ end
62
+
63
+ it 'can validate a type alias' do
64
+ code = <<-CODE
65
+ type UnprivilegedPort = Integer[1024,65537]
66
+ assert_type(UnprivilegedPort, 5432)
67
+ notice('ok')
68
+ CODE
69
+ expect(eval_and_collect_notices(code)).to eq(['ok'])
70
+ end
71
+
72
+ it 'can validate a type alias passed as a String' do
73
+ code = <<-CODE
74
+ type UnprivilegedPort = Integer[1024,65537]
75
+ assert_type('UnprivilegedPort', 5432)
76
+ notice('ok')
77
+ CODE
78
+ expect(eval_and_collect_notices(code)).to eq(['ok'])
79
+ end
80
+
81
+ it 'can validate and fail using a type alias' do
82
+ code = <<-CODE
83
+ type UnprivilegedPort = Integer[1024,65537]
84
+ assert_type(UnprivilegedPort, 345)
85
+ notice('ok')
86
+ CODE
87
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error, /expected an UnprivilegedPort = Integer\[1024, 65537\] value, got Integer\[345, 345\]/)
88
+ end
55
89
  end
@@ -268,11 +268,11 @@ describe "the 'defined' function" do
268
268
  end
269
269
 
270
270
  it 'raises error if referencing undef' do
271
- expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\[CatalogEntry\]\], got Undef/)
271
+ expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String or Type, got Undef/)
272
272
  end
273
273
 
274
274
  it 'raises error if referencing a number' do
275
- expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\[CatalogEntry\]\], got Integer/)
275
+ expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String or Type, got Integer/)
276
276
  end
277
277
 
278
278
  it 'is false if referencing empty string' do
@@ -5,7 +5,7 @@ describe "the epp function" do
5
5
 
6
6
  let :node do Puppet::Node.new('localhost') end
7
7
  let :compiler do Puppet::Parser::Compiler.new(node) end
8
- let :scope do Puppet::Parser::Scope.new(compiler) end
8
+ let :scope do compiler.topscope end
9
9
 
10
10
  context "when accessing scope variables as $ variables" do
11
11
  it "looks up the value from the scope" do
@@ -27,11 +27,19 @@ describe "the epp function" do
27
27
  expect(eval_template_with_args("<%= $phantom == dragos %>", 'phantom' => 'dragos')).to eq("true")
28
28
  end
29
29
 
30
- it "can use values from the enclosing scope for defaults" do
30
+ it "can use values from the global scope for defaults" do
31
31
  scope['phantom'] = 'of the opera'
32
- expect(eval_template("<%- |$phantom = $phantom| -%><%= $phantom %>")).to eq("of the opera")
32
+ expect(eval_template("<%- |$phantom = $::phantom| -%><%= $phantom %>")).to eq("of the opera")
33
33
  end
34
34
 
35
+ it "will not use values from the enclosing scope for defaults" do
36
+ scope['the_phantom'] = 'of the state opera'
37
+ scope.new_ephemeral(true)
38
+ scope['the_phantom'] = 'of the local opera'
39
+ expect(scope['the_phantom']).to eq('of the local opera')
40
+ expect(eval_template("<%- |$phantom = $the_phantom| -%><%= $phantom %>")).to eq("of the state opera")
41
+ end
42
+
35
43
  it "uses the default value if the given value is undef/nil" do
36
44
  expect(eval_template_with_args("<%- |$phantom = 'inside your mind'| -%><%= $phantom %>", 'phantom' => nil)).to eq("inside your mind")
37
45
  end
@@ -44,15 +52,15 @@ describe "the epp function" do
44
52
  it "raises an error if required variable is not given" do
45
53
  scope['x'] = 'wrong one'
46
54
  expect do
47
- eval_template_with_args("<%-| $x |-%><%= $x == correct %>", 'y' => 'correct')
48
- end.to raise_error(/no value given for required parameters x/)
55
+ eval_template("<%-| $x |-%><%= $x == correct %>")
56
+ end.to raise_error(/expects a value for parameter 'x'/)
49
57
  end
50
58
 
51
- it "raises an error if too many arguments are given" do
59
+ it 'raises an error if invalid arguments are given' do
52
60
  scope['x'] = 'wrong one'
53
61
  expect do
54
62
  eval_template_with_args("<%-| $x |-%><%= $x == correct %>", 'x' => 'correct', 'y' => 'surplus')
55
- end.to raise_error(/Too many arguments: 2 for 1/)
63
+ end.to raise_error(/has no parameter named 'y'/)
56
64
  end
57
65
  end
58
66
 
@@ -80,13 +88,13 @@ describe "the epp function" do
80
88
  it "raises an error when the passed value does not match the parameter's type" do
81
89
  expect do
82
90
  eval_template_with_args("<%-|Integer $x|-%><%= $x %>", 'x' => 'incorrect')
83
- end.to raise_error(/block parameter 'x' expects an Integer value, got String/)
91
+ end.to raise_error(/parameter 'x' expects an Integer value, got String/)
84
92
  end
85
93
 
86
94
  it "raises an error when the default value does not match the parameter's type" do
87
95
  expect do
88
96
  eval_template("<%-|Integer $x = 'nope'|-%><%= $x %>")
89
- end.to raise_error(/block parameter 'x' expects an Integer value, got String/)
97
+ end.to raise_error(/parameter 'x' expects an Integer value, got String/)
90
98
  end
91
99
 
92
100
  it "allows an parameter to default to undef" do
@@ -36,15 +36,15 @@ describe "the inline_epp function" do
36
36
  it "raises an error if required variable is not given" do
37
37
  scope['x'] = 'wrong one'
38
38
  expect {
39
- eval_template_with_args("<%-| $x |-%><%= $x == correct %>", 'y' => 'correct')
40
- }.to raise_error(/no value given for required parameters x/)
39
+ eval_template_with_args("<%-| $x |-%><%= $x == correct %>", {})
40
+ }.to raise_error(/expects a value for parameter 'x'/)
41
41
  end
42
42
 
43
- it "raises an error if too many arguments are given" do
43
+ it 'raises an error if unexpected arguments are given' do
44
44
  scope['x'] = 'wrong one'
45
45
  expect {
46
46
  eval_template_with_args("<%-| $x |-%><%= $x == correct %>", 'x' => 'correct', 'y' => 'surplus')
47
- }.to raise_error(/Too many arguments: 2 for 1/)
47
+ }.to raise_error(/has no parameter named 'y'/)
48
48
  end
49
49
  end
50
50