puppet 4.3.2 → 4.4.0

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

Potentially problematic release.


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

Files changed (487) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  328. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  333. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -15,7 +15,7 @@ describe Puppet::Resource::CapabilityFinder do
15
15
  around(:each) do |example|
16
16
  mock_pdb = !Puppet::Util.const_defined?('Puppetdb')
17
17
  if mock_pdb
18
- class Puppet::Util::Puppetdb
18
+ module Puppet::Util::Puppetdb
19
19
  class Http; end
20
20
  end
21
21
  end
@@ -27,11 +27,8 @@ describe Puppet::Resource::CapabilityFinder do
27
27
  end
28
28
  end
29
29
 
30
- class MockResponse
31
- def body
32
- '[{"type": "Cap", "title": "cap", "parameters": { "host" : "ahost" }}]'
33
- end
34
- end
30
+ let(:response_body) { [{"type"=>"Cap", "title"=>"cap", "parameters"=>{"host"=>"ahost"}}] }
31
+ let(:response) { stub('response', :body => response_body.to_json) }
35
32
 
36
33
  def make_cap_type
37
34
  Puppet::Type.newtype :cap, :is_capability => true do
@@ -40,17 +37,33 @@ describe Puppet::Resource::CapabilityFinder do
40
37
  end
41
38
  end
42
39
 
43
- it 'should call Puppet::Util::PuppetDB::Http.action' do
44
- Puppet::Util::Puppetdb::Http.expects(:action).returns(MockResponse.new)
45
- result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
46
- expect(result['host']).to eq('ahost')
40
+ describe "when query_puppetdb method is available" do
41
+ it 'should call use the query_puppetdb method if available' do
42
+ Puppet::Util::Puppetdb.expects(:query_puppetdb).returns(response_body)
43
+ Puppet::Util::Puppetdb::Http.expects(:action).never
44
+
45
+ result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
46
+ expect(result['host']).to eq('ahost')
47
+ end
47
48
  end
48
49
 
49
- it 'should use pass code_id in query to Puppet::Util::PuppetDB::Http.action' do
50
- code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
51
- Puppet::Util::Puppetdb::Http.expects(:action).with(regexp_matches(Regexp.new(CGI.escape('"=","code_id","' + code_id + "")))).returns(MockResponse.new)
52
- result = Puppet::Resource::CapabilityFinder.find('production', code_id, Puppet::Resource.new('Cap', 'cap'))
53
- expect(result['host']).to eq('ahost')
50
+ describe "when query_puppetdb method is unavailable" do
51
+ before :each do
52
+ Puppet::Util::Puppetdb.stubs(:respond_to?).with(:query_puppetdb).returns false
53
+ end
54
+
55
+ it 'should call Puppet::Util::PuppetDB::Http.action' do
56
+ Puppet::Util::Puppetdb::Http.expects(:action).returns(response)
57
+ result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
58
+ expect(result['host']).to eq('ahost')
59
+ end
60
+
61
+ it 'should include code_id in query' do
62
+ code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
63
+ Puppet::Util::Puppetdb::Http.expects(:action).with(regexp_matches(Regexp.new(CGI.escape('"=","code_id","' + code_id + "")))).returns(response)
64
+ result = Puppet::Resource::CapabilityFinder.find('production', code_id, Puppet::Resource.new('Cap', 'cap'))
65
+ expect(result['host']).to eq('ahost')
66
+ end
54
67
  end
55
68
  end
56
69
  end
@@ -91,6 +91,17 @@ describe Puppet::Resource::Catalog, "when compiling" do
91
91
  expect(catalog.code_id).to be_nil
92
92
  end
93
93
 
94
+ it "should include a catalog_uuid" do
95
+ SecureRandom.stubs(:uuid).returns ("827a74c8-cf98-44da-9ff7-18c5e4bee41e")
96
+ catalog = Puppet::Resource::Catalog.new("host")
97
+ expect(catalog.catalog_uuid).to eq("827a74c8-cf98-44da-9ff7-18c5e4bee41e")
98
+ end
99
+
100
+ it "should include the current catalog_format" do
101
+ catalog = Puppet::Resource::Catalog.new("host")
102
+ expect(catalog.catalog_format).to eq(1)
103
+ end
104
+
94
105
  describe "when compiling" do
95
106
  it "should accept tags" do
96
107
  config = Puppet::Resource::Catalog.new("mynode")
@@ -268,6 +279,16 @@ describe Puppet::Resource::Catalog, "when compiling" do
268
279
  @original.code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
269
280
  expect(@original.filter.code_id).to eq(@original.code_id)
270
281
  end
282
+
283
+ it 'copies the catalog_uuid' do
284
+ @original.catalog_uuid = '827a74c8-cf98-44da-9ff7-18c5e4bee41e'
285
+ expect(@original.filter.catalog_uuid).to eq(@original.catalog_uuid)
286
+ end
287
+
288
+ it 'copies the catalog_format' do
289
+ @original.catalog_format = 42
290
+ expect(@original.filter.catalog_format).to eq(@original.catalog_format)
291
+ end
271
292
  end
272
293
 
273
294
  describe "when functioning as a resource container" do
@@ -799,7 +820,9 @@ describe Puppet::Resource::Catalog, "when converting to pson" do
799
820
 
800
821
  { :name => 'myhost',
801
822
  :version => 42,
802
- :code_id => 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
823
+ :code_id => 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe',
824
+ :catalog_uuid => '827a74c8-cf98-44da-9ff7-18c5e4bee41e',
825
+ :catalog_format => 42
803
826
  }.each do |param, value|
804
827
  it "emits a #{param} equal to #{value.inspect}" do
805
828
  @catalog.send(param.to_s + "=", value)
@@ -853,6 +876,8 @@ describe Puppet::Resource::Catalog, "when converting from pson" do
853
876
  it "should create it with the provided name" do
854
877
  @data['version'] = 50
855
878
  @data['code_id'] = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
879
+ @data['catalog_uuid'] = '827a74c8-cf98-44da-9ff7-18c5e4bee41e'
880
+ @data['catalog_format'] = 42
856
881
  @data['tags'] = %w{one two}
857
882
  @data['classes'] = %w{one two}
858
883
  @data['edges'] = [Puppet::Relationship.new("File[/foo]", "File[/bar]",
@@ -867,6 +892,8 @@ describe Puppet::Resource::Catalog, "when converting from pson" do
867
892
  expect(catalog.name).to eq('myhost')
868
893
  expect(catalog.version).to eq(@data['version'])
869
894
  expect(catalog.code_id).to eq(@data['code_id'])
895
+ expect(catalog.catalog_uuid).to eq(@data['catalog_uuid'])
896
+ expect(catalog.catalog_format).to eq(@data['catalog_format'])
870
897
  expect(catalog).to be_tagged("one")
871
898
  expect(catalog).to be_tagged("two")
872
899
 
@@ -878,6 +905,11 @@ describe Puppet::Resource::Catalog, "when converting from pson" do
878
905
  expect(catalog.edges[0].target).to eq(catalog.resource(:file, "/bar"))
879
906
  end
880
907
 
908
+ it "defaults the catalog_format to 0" do
909
+ catalog = Puppet::Resource::Catalog.from_data_hash PSON.parse @data.to_pson
910
+ expect(catalog.catalog_format).to eq(0)
911
+ end
912
+
881
913
  it "should fail if the source resource cannot be found" do
882
914
  @data['edges'] = [Puppet::Relationship.new("File[/missing]", "File[/bar]").to_data_hash]
883
915
  @data['resources'] = [Puppet::Resource.new(:file, "/bar").to_data_hash]
@@ -240,9 +240,26 @@ describe Puppet::Resource::Type do
240
240
  end
241
241
 
242
242
  describe "when setting its parameters in the scope" do
243
+ let(:parser) { Puppet::Pops::Parser::Parser.new() }
244
+
245
+ def wrap3x(expression)
246
+ Puppet::Parser::AST::PopsBridge::Expression.new(:value => expression.current)
247
+ end
248
+
249
+ def parse_expression(expr_string)
250
+ wrap3x(parser.parse_string(expr_string))
251
+ end
252
+
253
+ def number_expression(number)
254
+ wrap3x(Puppet::Pops::Model::Factory.NUMBER(number))
255
+ end
256
+
243
257
  def variable_expression(name)
244
- varexpr = Puppet::Pops::Model::Factory.QNAME(name).var().current
245
- Puppet::Parser::AST::PopsBridge::Expression.new(:value => varexpr)
258
+ wrap3x(Puppet::Pops::Model::Factory.QNAME(name).var())
259
+ end
260
+
261
+ def matchref_expression(number)
262
+ wrap3x(Puppet::Pops::Model::Factory.NUMBER(number).var())
246
263
  end
247
264
 
248
265
  before do
@@ -272,6 +289,134 @@ describe Puppet::Resource::Type do
272
289
  expect(@scope['foo']).to eq('foobar')
273
290
  end
274
291
 
292
+ context 'referencing a variable to the left of the default expression' do
293
+ it 'is possible when the referenced variable uses a default' do
294
+ @type.set_arguments({
295
+ :first => number_expression(10),
296
+ :second => variable_expression('first'),
297
+ })
298
+ @type.set_resource_parameters(@resource, @scope)
299
+
300
+ expect(@scope['first']).to eq(10)
301
+ expect(@scope['second']).to eq(10)
302
+ end
303
+
304
+ it 'is possible when the referenced variable is given a value' do
305
+ @type.set_arguments({
306
+ :first => number_expression(10),
307
+ :second => variable_expression('first'),
308
+ })
309
+ @resource[:first] = 2
310
+ @type.set_resource_parameters(@resource, @scope)
311
+
312
+ expect(@scope['first']).to eq(2)
313
+ expect(@scope['second']).to eq(2)
314
+ end
315
+
316
+ it 'is possible when the referenced variable is an array produced by match function' do
317
+ @type.set_arguments({
318
+ :first => parse_expression("'hello'.match(/(h)(.*)/)"),
319
+ :second => parse_expression('$first[0]'),
320
+ :third => parse_expression('$first[1]')
321
+ })
322
+ @type.set_resource_parameters(@resource, @scope)
323
+
324
+ expect(@scope['first']).to eq(['hello', 'h', 'ello'])
325
+ expect(@scope['second']).to eq('hello')
326
+ expect(@scope['third']).to eq('h')
327
+ end
328
+
329
+ it 'does not clobber a given value' do
330
+ @type.set_arguments({
331
+ :first => number_expression(10),
332
+ :second => variable_expression('first'),
333
+ })
334
+ @resource[:first] = 2
335
+ @resource[:second] = 5
336
+ @type.set_resource_parameters(@resource, @scope)
337
+
338
+ expect(@scope['first']).to eq(2)
339
+ expect(@scope['second']).to eq(5)
340
+ end
341
+ end
342
+
343
+ context 'referencing a variable to the right of the default expression' do
344
+ before :each do
345
+ @type.set_arguments({
346
+ :first => number_expression(10),
347
+ :second => variable_expression('third'),
348
+ :third => number_expression(20)
349
+ })
350
+ end
351
+
352
+ it 'no error is raised when no defaults are evaluated' do
353
+ @resource[:first] = 1
354
+ @resource[:second] = 2
355
+ @resource[:third] = 3
356
+ @type.set_resource_parameters(@resource, @scope)
357
+
358
+ expect(@scope['first']).to eq(1)
359
+ expect(@scope['second']).to eq(2)
360
+ expect(@scope['third']).to eq(3)
361
+ end
362
+
363
+ it 'no error is raised unless the referencing default expression is evaluated' do
364
+ @resource[:second] = 2
365
+ @type.set_resource_parameters(@resource, @scope)
366
+
367
+ expect(@scope['first']).to eq(10)
368
+ expect(@scope['second']).to eq(2)
369
+ expect(@scope['third']).to eq(20)
370
+ end
371
+
372
+ it 'fails when the default expression is evaluated' do
373
+ @resource[:first] = 1
374
+ expect { @type.set_resource_parameters(@resource, @scope) }.to raise_error(Puppet::Error, 'default expression for $second tries to illegally access not yet evaluated $third')
375
+ end
376
+ end
377
+
378
+ it 'does not allow a variable to be referenced from its own default expression' do
379
+ @type.set_arguments({
380
+ :first => variable_expression('first')
381
+ })
382
+ expect { @type.set_resource_parameters(@resource, @scope) }.to raise_error(Puppet::Error, 'default expression for $first tries to illegally access not yet evaluated $first')
383
+ end
384
+
385
+ context 'when using match scope' do
386
+ it '$n evaluates to undef at the top level' do
387
+ @type.set_arguments({
388
+ :first => matchref_expression('0'),
389
+ :second => matchref_expression('1'),
390
+ })
391
+ @type.set_resource_parameters(@resource, @scope)
392
+
393
+ expect(@scope).not_to include('first')
394
+ expect(@scope).not_to include('second')
395
+ end
396
+
397
+ it 'a match scope to the left of a parameter is not visible to it' do
398
+ @type.set_arguments({
399
+ :first => parse_expression("['hello' =~ /(h)(.*)/, $1, $2]"),
400
+ :second => matchref_expression('1'),
401
+ })
402
+ @type.set_resource_parameters(@resource, @scope)
403
+
404
+ expect(@scope['first']).to eq([true, 'h', 'ello'])
405
+ expect(@scope['second']).to be_nil
406
+ end
407
+
408
+ it 'match scopes nests per parameter' do
409
+ @type.set_arguments({
410
+ :first => parse_expression("['hi' =~ /(h)(.*)/, $1, if 'foo' =~ /f(oo)/ { $1 }, $1, $2]"),
411
+ :second => matchref_expression('0'),
412
+ })
413
+ @type.set_resource_parameters(@resource, @scope)
414
+
415
+ expect(@scope['first']).to eq([true, 'h', 'oo', 'h', 'i'])
416
+ expect(@scope['second']).to be_nil
417
+ end
418
+ end
419
+
275
420
  it "should set each of the resource's parameters as variables in the scope" do
276
421
  @type.set_arguments :foo => nil, :boo => nil
277
422
  @resource[:foo] = "bar"
@@ -432,10 +577,9 @@ describe Puppet::Resource::Type do
432
577
  @scope.expects(:newscope).with(:source => @type, :namespace => '', :resource => @resource).returns subscope
433
578
 
434
579
  elevel = 876
435
- subscope.expects(:ephemeral_level).returns elevel
580
+ subscope.expects(:with_guarded_scope).yields
436
581
  subscope.expects(:ephemeral_from).with(match, nil, nil).returns subscope
437
582
  code.expects(:safeevaluate).with(subscope)
438
- subscope.expects(:unset_ephemeral_var).with(elevel)
439
583
 
440
584
  # Just to keep the stub quiet about intermediate calls
441
585
  @type.expects(:set_resource_parameters).with(@resource, subscope)
@@ -484,9 +628,7 @@ describe Puppet::Resource::Type do
484
628
  it "should evaluate the AST code if any is provided" do
485
629
  code = stub 'code'
486
630
  @type.stubs(:code).returns code
487
- subscope = stub_everything("subscope", :compiler => @compiler)
488
- @scope.stubs(:newscope).returns subscope
489
- code.expects(:safeevaluate).with subscope
631
+ code.expects(:safeevaluate).with kind_of(Puppet::Parser::Scope)
490
632
 
491
633
  @type.evaluate_code(@resource)
492
634
  end
@@ -315,7 +315,10 @@ describe Puppet::Resource do
315
315
  let(:environment_name) { "testing env" }
316
316
  let(:fact_values) { { :a => 1 } }
317
317
  let(:port) { Puppet::Parser::AST::Leaf.new(:value => '80') }
318
- let(:apache) { Puppet::Resource::Type.new(:hostclass, 'apache', :arguments => { 'port' => port }) }
318
+
319
+ def inject_and_set_defaults(resource, scope)
320
+ resource.resource_type.set_resource_parameters(resource, scope)
321
+ end
319
322
 
320
323
  before do
321
324
  environment.known_resource_types.add(apache)
@@ -325,82 +328,118 @@ describe Puppet::Resource do
325
328
  scope.stubs(:facts).returns(Puppet::Node::Facts.new("facts", fact_values))
326
329
  end
327
330
 
328
- context "when no value is provided" do
329
- let(:resource) do
330
- Puppet::Parser::Resource.new("class", "apache", :scope => scope)
331
- end
331
+ context 'with a default value expression' do
332
+ let(:apache) { Puppet::Resource::Type.new(:hostclass, 'apache', :arguments => { 'port' => port }) }
332
333
 
333
- it "should query the data_binding terminus using a namespaced key" do
334
- Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
335
- Puppet::DataBinding.indirection.expects(:find).with(
336
- 'apache::port', all_of(has_key(:environment), has_key(:variables)))
337
- resource.set_default_parameters(scope)
338
- end
334
+ context "when no value is provided" do
335
+ let(:resource) do
336
+ Puppet::Parser::Resource.new("class", "apache", :scope => scope)
337
+ end
339
338
 
340
- it "should use the value from the data_binding terminus" do
341
- Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
342
- Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns('443')
339
+ it "should query the data_binding terminus using a namespaced key" do
340
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
341
+ Puppet::DataBinding.indirection.expects(:find).with(
342
+ 'apache::port', all_of(has_key(:environment), has_key(:variables)))
343
+ inject_and_set_defaults(resource, scope)
344
+ end
343
345
 
344
- resource.set_default_parameters(scope)
346
+ it "should use the value from the data_binding terminus" do
347
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
348
+ Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns('443')
345
349
 
346
- expect(resource[:port]).to eq('443')
347
- end
350
+ inject_and_set_defaults(resource, scope)
348
351
 
349
- it "should use the default value if the data_binding terminus returns nil" do
350
- Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
351
- Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns(nil)
352
+ expect(resource[:port]).to eq('443')
353
+ end
352
354
 
353
- resource.set_default_parameters(scope)
355
+ it 'should use the default value if no value is found using the data_binding terminus' do
356
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
357
+ Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).throws(:no_such_key)
354
358
 
355
- expect(resource[:port]).to eq('80')
356
- end
359
+ inject_and_set_defaults(resource, scope)
357
360
 
358
- it "should fail with error message about data binding on a hiera failure" do
359
- Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
360
- Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).raises(Puppet::DataBinding::LookupError, 'Forgettabotit')
361
- expect {
362
- resource.set_default_parameters(scope)
363
- }.to raise_error(Puppet::Error, /Lookup of key 'apache::port' failed: Forgettabotit/)
364
- end
365
- end
361
+ expect(resource[:port]).to eq('80')
362
+ end
366
363
 
367
- context "when a value is provided" do
368
- let(:port_parameter) do
369
- Puppet::Parser::Resource::Param.new(
370
- { :name => 'port', :value => '8080' }
371
- )
372
- end
364
+ it 'should use the default value if an undef value is found using the data_binding terminus' do
365
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
366
+ Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns(nil)
373
367
 
374
- let(:resource) do
375
- Puppet::Parser::Resource.new("class", "apache", :scope => scope,
376
- :parameters => [port_parameter])
377
- end
368
+ inject_and_set_defaults(resource, scope)
378
369
 
379
- it "should not query the data_binding terminus" do
380
- Puppet::DataBinding.indirection.expects(:find).never
381
- resource.set_default_parameters(scope)
382
- end
370
+ expect(resource[:port]).to eq('80')
371
+ end
383
372
 
384
- it "should not query the injector" do
385
- compiler.injector.expects(:find).never
386
- resource.set_default_parameters(scope)
373
+ it "should fail with error message about data binding on a hiera failure" do
374
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
375
+ Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).raises(Puppet::DataBinding::LookupError, 'Forgettabotit')
376
+ expect {
377
+ inject_and_set_defaults(resource, scope)
378
+ }.to raise_error(Puppet::Error, /Lookup of key 'apache::port' failed: Forgettabotit/)
379
+ end
387
380
  end
388
381
 
389
- it "should use the value provided" do
390
- Puppet::DataBinding.indirection.expects(:find).never
391
- expect(resource.set_default_parameters(scope)).to eq([])
392
- expect(resource[:port]).to eq('8080')
382
+ context "when a value is provided" do
383
+ let(:port_parameter) do
384
+ Puppet::Parser::Resource::Param.new(
385
+ { :name => 'port', :value => '8080' }
386
+ )
387
+ end
388
+
389
+ let(:resource) do
390
+ Puppet::Parser::Resource.new("class", "apache", :scope => scope,
391
+ :parameters => [port_parameter])
392
+ end
393
+
394
+ it "should not query the data_binding terminus" do
395
+ Puppet::DataBinding.indirection.expects(:find).never
396
+ inject_and_set_defaults(resource, scope)
397
+ end
398
+
399
+ it "should not query the injector" do
400
+ compiler.injector.expects(:find).never
401
+ inject_and_set_defaults(resource, scope)
402
+ end
403
+
404
+ it "should use the value provided" do
405
+ Puppet::DataBinding.indirection.expects(:find).never
406
+ expect(resource.set_default_parameters(scope)).to eq([])
407
+ expect(resource[:port]).to eq('8080')
408
+ end
409
+
410
+ it "should use the value from the data_binding terminus when provided value is undef" do
411
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
412
+ Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns('443')
413
+
414
+ rs = Puppet::Parser::Resource.new("class", "apache", :scope => scope,
415
+ :parameters => [Puppet::Parser::Resource::Param.new({ :name => 'port', :value => nil })])
416
+
417
+ rs.resource_type.set_resource_parameters(rs, scope)
418
+ expect(rs[:port]).to eq('443')
419
+ end
393
420
  end
421
+ end
394
422
 
395
- it "should use the value from the data_binding terminus when provided value is undef" do
423
+ context 'without a default value expression' do
424
+ let(:apache) { Puppet::Resource::Type.new(:hostclass, 'apache', :arguments => { 'port' => nil }) }
425
+ let(:resource) { Puppet::Parser::Resource.new("class", "apache", :scope => scope) }
426
+
427
+ it "should use the value from the data_binding terminus" do
396
428
  Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
397
429
  Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns('443')
398
430
 
399
- rs = Puppet::Parser::Resource.new("class", "apache", :scope => scope,
400
- :parameters => [Puppet::Parser::Resource::Param.new({ :name => 'port', :value => nil })])
431
+ inject_and_set_defaults(resource, scope)
432
+
433
+ expect(resource[:port]).to eq('443')
434
+ end
435
+
436
+ it "should use an undef value from the data_binding terminus" do
437
+ Puppet::DataBinding.indirection.expects(:find).with('lookup_options', any_parameters).throws(:no_such_key)
438
+ Puppet::DataBinding.indirection.expects(:find).with('apache::port', any_parameters).returns(nil)
439
+
440
+ inject_and_set_defaults(resource, scope)
401
441
 
402
- rs.resource_type.set_resource_parameters(rs, scope)
403
- expect(rs[:port]).to eq('443')
442
+ expect(resource[:port]).to be_nil
404
443
  end
405
444
  end
406
445
  end