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
@@ -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
 
@@ -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