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
@@ -1,8 +1,5 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
- require 'puppet/network/http_pool'
4
-
5
- require 'puppet/network/resolver'
6
3
 
7
4
  describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true do
8
5
  include PuppetSpec::Files
@@ -183,6 +180,10 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
183
180
  expect(content).to be_safe_insync("{#{digest_algorithm}}" + digest("some content"))
184
181
  end
185
182
 
183
+ it "should include the diff module" do
184
+ expect(content.respond_to?("diff")).to eq(false)
185
+ end
186
+
186
187
  [true, false].product([true, false]).each do |cfg, param|
187
188
  describe "and Puppet[:show_diff] is #{cfg} and show_diff => #{param}" do
188
189
  before do
@@ -208,21 +209,21 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
208
209
  end
209
210
  end
210
211
 
211
- SAVED_TIME = Time.now
212
+ let(:saved_time) { Time.now }
212
213
  [:ctime, :mtime].each do |time_stat|
213
- [["older", SAVED_TIME-1, false], ["same", SAVED_TIME, true], ["newer", SAVED_TIME+1, true]].each do
214
+ [["older", -1, false], ["same", 0, true], ["newer", 1, true]].each do
214
215
  |compare, target_time, success|
215
216
  describe "with #{compare} target #{time_stat} compared to source" do
216
217
  before do
217
218
  resource[:checksum] = time_stat
218
- content.should = "{#{time_stat}}#{SAVED_TIME}"
219
+ content.should = "{#{time_stat}}#{saved_time}"
219
220
  end
220
221
 
221
222
  it "should return #{success}" do
222
223
  if success
223
- expect(content).to be_safe_insync("{#{time_stat}}#{target_time}")
224
+ expect(content).to be_safe_insync("{#{time_stat}}#{saved_time+target_time}")
224
225
  else
225
- expect(content).not_to be_safe_insync("{#{time_stat}}#{target_time}")
226
+ expect(content).not_to be_safe_insync("{#{time_stat}}#{saved_time+target_time}")
226
227
  end
227
228
  end
228
229
  end
@@ -234,14 +235,14 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
234
235
  end
235
236
 
236
237
  it "should not be insync if trying to create it" do
237
- content.should = "{#{time_stat}}#{SAVED_TIME}"
238
+ content.should = "{#{time_stat}}#{saved_time}"
238
239
  expect(content).not_to be_safe_insync(:absent)
239
240
  end
240
241
 
241
242
  it "should raise an error if content is not a checksum" do
242
243
  content.should = "some content"
243
244
  expect {
244
- content.safe_insync?("{#{time_stat}}#{SAVED_TIME}")
245
+ content.safe_insync?("{#{time_stat}}#{saved_time}")
245
246
  }.to raise_error(/Resource with checksum_type #{time_stat} didn't contain a date in/)
246
247
  end
247
248
 
@@ -316,7 +317,7 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
316
317
  end
317
318
 
318
319
  it "should use the file's :write method to write the content" do
319
- resource.expects(:write).with(:content)
320
+ resource.expects(:write).with(content)
320
321
 
321
322
  content.sync
322
323
  end
@@ -389,187 +390,5 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
389
390
  content.write(fh)
390
391
  end
391
392
  end
392
-
393
- describe "from local source" do
394
- let(:source_content) { "source file content\r\n"*10 }
395
- before(:each) do
396
- sourcename = tmpfile('source')
397
- resource[:backup] = false
398
- resource[:source] = sourcename
399
-
400
- File.open(sourcename, 'wb') {|f| f.write source_content}
401
-
402
- # This needs to be invoked to properly initialize the content property,
403
- # or attempting to write a file will fail.
404
- resource.newattr(:content)
405
- end
406
-
407
- it "should copy content from the source to the file" do
408
- source = resource.parameter(:source)
409
- resource.write(source)
410
-
411
- expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
412
- end
413
-
414
- with_digest_algorithms do
415
- it "should return the checksum computed" do
416
- File.open(filename, 'wb') do |file|
417
- resource[:checksum] = digest_algorithm
418
- expect(content.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
419
- end
420
- end
421
- end
422
- end
423
-
424
- describe 'from remote source' do
425
- let(:source_content) { "source file content\n"*10 }
426
- let(:source) { resource.newattr(:source) }
427
- let(:response) { stub_everything('response') }
428
- let(:conn) { mock('connection') }
429
-
430
- before(:each) do
431
- resource[:backup] = false
432
- # This needs to be invoked to properly initialize the content property,
433
- # or attempting to write a file will fail.
434
- resource.newattr(:content)
435
-
436
- response.stubs(:read_body).multiple_yields(*source_content.lines)
437
- conn.stubs(:request_get).yields(response)
438
- end
439
-
440
- it 'should use an explicit fileserver if source starts with puppet://' do
441
- response.stubs(:code).returns('200')
442
- source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet://somehostname/test/foo', :ftype => 'file')
443
- Puppet::Network::HttpPool.expects(:http_instance).with('somehostname', anything).returns(conn)
444
-
445
- resource.write(source)
446
- end
447
-
448
- it 'should use the default fileserver if source starts with puppet:///' do
449
- response.stubs(:code).returns('200')
450
- source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
451
- Puppet::Network::HttpPool.expects(:http_instance).with(Puppet.settings[:server], anything).returns(conn)
452
-
453
- resource.write(source)
454
- end
455
-
456
- it 'should percent encode reserved characters' do
457
- response.stubs(:code).returns('200')
458
- Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
459
- source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo bar', :ftype => 'file')
460
-
461
- conn.unstub(:request_get)
462
- conn.expects(:request_get).with("#{Puppet::Network::HTTP::MASTER_URL_PREFIX}/v3/file_content/test/foo%20bar?environment=testing&", anything).yields(response)
463
-
464
- resource.write(source)
465
- end
466
-
467
- describe 'when handling file_content responses' do
468
- before(:each) do
469
- Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
470
- source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
471
- end
472
-
473
- it 'should not write anything if source is not found' do
474
- response.stubs(:code).returns('404')
475
-
476
- expect { resource.write(source) }.to raise_error(Net::HTTPError, /404/)
477
- expect(File.read(filename)).to eq('initial file content')
478
- end
479
-
480
- it 'should raise an HTTP error in case of server error' do
481
- response.stubs(:code).returns('500')
482
-
483
- expect { resource.write(source) }.to raise_error(Net::HTTPError, /500/)
484
- end
485
-
486
- context 'and the request was successful' do
487
- before(:each) { response.stubs(:code).returns '200' }
488
-
489
- it 'should write the contents to the file' do
490
- resource.write(source)
491
- expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
492
- end
493
-
494
- with_digest_algorithms do
495
- it 'should return the checksum computed' do
496
- File.open(filename, 'w') do |file|
497
- resource[:checksum] = digest_algorithm
498
- expect(content.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
499
- end
500
- end
501
- end
502
-
503
- end
504
-
505
- end
506
- end
507
-
508
- # These are testing the implementation rather than the desired behaviour; while that bites, there are a whole
509
- # pile of other methods in the File type that depend on intimate details of this implementation and vice-versa.
510
- # If these blow up, you are gonna have to review the callers to make sure they don't explode! --daniel 2011-02-01
511
- describe "each_chunk_from should work" do
512
-
513
- it "when content is a string" do
514
- content.each_chunk_from('i_am_a_string') { |chunk| expect(chunk).to eq('i_am_a_string') }
515
- end
516
-
517
- # The following manifest is a case where source and content.should are both set
518
- # file { "/tmp/mydir" :
519
- # source => '/tmp/sourcedir',
520
- # recurse => true,
521
- # }
522
- it "when content checksum comes from source" do
523
- source_param = Puppet::Type.type(:file).attrclass(:source)
524
- source = source_param.new(:resource => resource)
525
- content.should = "{md5}123abcd"
526
-
527
- content.expects(:chunk_file_from_source).returns('from_source')
528
- content.each_chunk_from(source) { |chunk| expect(chunk).to eq('from_source') }
529
- end
530
-
531
- it "when no content, source, but ensure present" do
532
- resource[:ensure] = :present
533
- content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('') }
534
- end
535
-
536
- # you might do this if you were just auditing
537
- it "when no content, source, but ensure file" do
538
- resource[:ensure] = :file
539
- content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('') }
540
- end
541
-
542
- it "when source_or_content is nil and content not a checksum" do
543
- content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('') }
544
- end
545
-
546
- # the content is munged so that if it's a checksum nil gets passed in
547
- it "when content is a checksum it should try to read from filebucket" do
548
- content.should = "{md5}123abcd"
549
- content.expects(:read_file_from_filebucket).once.returns('im_a_filebucket')
550
- content.each_chunk_from(nil) { |chunk| expect(chunk).to eq('im_a_filebucket') }
551
- end
552
-
553
- it "when running as puppet apply" do
554
- Puppet[:default_file_terminus] = "file_server"
555
- source_or_content = stubs('source_or_content')
556
- source_or_content.expects(:content).once.returns :whoo
557
- content.each_chunk_from(source_or_content) { |chunk| expect(chunk).to eq(:whoo) }
558
- end
559
-
560
- it "when running from source with a local file" do
561
- source_or_content = stubs('source_or_content')
562
- source_or_content.expects(:local?).returns true
563
- content.expects(:chunk_file_from_disk).with(source_or_content).once.yields 'woot'
564
- content.each_chunk_from(source_or_content) { |chunk| expect(chunk).to eq('woot') }
565
- end
566
-
567
- it "when running from source with a remote file" do
568
- source_or_content = stubs('source_or_content')
569
- source_or_content.expects(:local?).returns false
570
- content.expects(:chunk_file_from_source).with(source_or_content).once.yields 'woot'
571
- content.each_chunk_from(source_or_content) { |chunk| expect(chunk).to eq('woot') }
572
- end
573
- end
574
393
  end
575
394
  end
@@ -1,10 +1,12 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'uri'
4
+ require 'puppet/network/http_pool'
5
+ #require 'puppet/network/resolver'
4
6
 
5
- source = Puppet::Type.type(:file).attrclass(:source)
6
- describe Puppet::Type.type(:file).attrclass(:source) do
7
+ describe Puppet::Type.type(:file).attrclass(:source), :uses_checksums => true do
7
8
  include PuppetSpec::Files
9
+ include_context 'with supported checksum types'
8
10
 
9
11
  around :each do |example|
10
12
  Puppet.override(:environments => Puppet::Environments::Static.new) do
@@ -12,10 +14,12 @@ describe Puppet::Type.type(:file).attrclass(:source) do
12
14
  end
13
15
  end
14
16
 
17
+ let(:filename) { tmpfile('file_source_validate') }
18
+ let(:environment) { Puppet::Node::Environment.remote("myenv") }
19
+ let(:catalog) { Puppet::Resource::Catalog.new(:test, environment) }
20
+ let(:resource) { Puppet::Type.type(:file).new :path => filename, :catalog => catalog }
21
+
15
22
  before do
16
- # Wow that's a messy interface to the resource.
17
- @environment = Puppet::Node::Environment.remote("myenv")
18
- @resource = stub 'resource', :[]= => nil, :property => nil, :catalog => Puppet::Resource::Catalog.new(nil, @environment), :line => 0, :file => ''
19
23
  @foobar = make_absolute("/foo/bar baz")
20
24
  @feebooz = make_absolute("/fee/booz baz")
21
25
 
@@ -24,13 +28,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
24
28
  end
25
29
 
26
30
  it "should be a subclass of Parameter" do
27
- expect(source.superclass).to eq(Puppet::Parameter)
31
+ expect(described_class.superclass).to eq(Puppet::Parameter)
28
32
  end
29
33
 
30
34
  describe "#validate" do
31
- let(:path) { tmpfile('file_source_validate') }
32
- let(:resource) { Puppet::Type.type(:file).new(:path => path) }
33
-
34
35
  it "should fail if the set values are not URLs" do
35
36
  URI.expects(:parse).with('foo').raises RuntimeError
36
37
 
@@ -38,7 +39,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
38
39
  end
39
40
 
40
41
  it "should fail if the URI is not a local file, file URI, or puppet URI" do
41
- expect(lambda { resource[:source] = %w{http://foo/bar} }).to raise_error(Puppet::Error, /Cannot use URLs of type 'http' as source for fileserving/)
42
+ expect(lambda { resource[:source] = %w{ftp://foo/bar} }).to raise_error(Puppet::Error, /Cannot use URLs of type 'ftp' as source for fileserving/)
42
43
  end
43
44
 
44
45
  it "should strip trailing forward slashes", :unless => Puppet.features.microsoft_windows? do
@@ -80,12 +81,9 @@ describe Puppet::Type.type(:file).attrclass(:source) do
80
81
  end
81
82
 
82
83
  describe "#munge" do
83
- let(:path) { tmpfile('file_source_munge') }
84
- let(:resource) { Puppet::Type.type(:file).new(:path => path) }
85
-
86
84
  it "should prefix file scheme to absolute paths" do
87
- resource[:source] = path
88
- expect(resource[:source]).to eq([URI.unescape(Puppet::Util.path_to_uri(path).to_s)])
85
+ resource[:source] = filename
86
+ expect(resource[:source]).to eq([URI.unescape(Puppet::Util.path_to_uri(filename).to_s)])
89
87
  end
90
88
 
91
89
  %w[file puppet].each do |scheme|
@@ -99,27 +97,27 @@ describe Puppet::Type.type(:file).attrclass(:source) do
99
97
  describe "when returning the metadata" do
100
98
  before do
101
99
  @metadata = stub 'metadata', :source= => nil
102
- @resource.stubs(:[]).with(:links).returns :manage
103
- @resource.stubs(:[]).with(:source_permissions).returns :use
104
- @resource.stubs(:[]).with(:checksum).returns :checksum
100
+ resource.stubs(:[]).with(:links).returns :manage
101
+ resource.stubs(:[]).with(:source_permissions).returns :use
102
+ resource.stubs(:[]).with(:checksum).returns :checksum
105
103
  end
106
104
 
107
105
  it "should return already-available metadata" do
108
- @source = source.new(:resource => @resource)
106
+ @source = described_class.new(:resource => resource)
109
107
  @source.metadata = "foo"
110
108
  expect(@source.metadata).to eq("foo")
111
109
  end
112
110
 
113
111
  it "should return nil if no @should value is set and no metadata is available" do
114
- @source = source.new(:resource => @resource)
112
+ @source = described_class.new(:resource => resource)
115
113
  expect(@source.metadata).to be_nil
116
114
  end
117
115
 
118
116
  it "should collect its metadata using the Metadata class if it is not already set" do
119
- @source = source.new(:resource => @resource, :value => @foobar)
117
+ @source = described_class.new(:resource => resource, :value => @foobar)
120
118
  Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
121
119
  expect(uri).to eq @foobar_uri
122
- expect(options[:environment]).to eq @environment
120
+ expect(options[:environment]).to eq environment
123
121
  expect(options[:links]).to eq :manage
124
122
  expect(options[:checksum_type]).to eq :checksum
125
123
  end.returns @metadata
@@ -129,9 +127,9 @@ describe Puppet::Type.type(:file).attrclass(:source) do
129
127
 
130
128
  it "should use the metadata from the first found source" do
131
129
  metadata = stub 'metadata', :source= => nil
132
- @source = source.new(:resource => @resource, :value => [@foobar, @feebooz])
130
+ @source = described_class.new(:resource => resource, :value => [@foobar, @feebooz])
133
131
  options = {
134
- :environment => @environment,
132
+ :environment => environment,
135
133
  :links => :manage,
136
134
  :source_permissions => :use,
137
135
  :checksum_type => :checksum
@@ -143,10 +141,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
143
141
 
144
142
  it "should store the found source as the metadata's source" do
145
143
  metadata = mock 'metadata'
146
- @source = source.new(:resource => @resource, :value => @foobar)
144
+ @source = described_class.new(:resource => resource, :value => @foobar)
147
145
  Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
148
146
  expect(uri).to eq @foobar_uri
149
- expect(options[:environment]).to eq @environment
147
+ expect(options[:environment]).to eq environment
150
148
  expect(options[:links]).to eq :manage
151
149
  expect(options[:checksum_type]).to eq :checksum
152
150
  end.returns metadata
@@ -156,10 +154,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
156
154
  end
157
155
 
158
156
  it "should fail intelligently if an exception is encountered while querying for metadata" do
159
- @source = source.new(:resource => @resource, :value => @foobar)
157
+ @source = described_class.new(:resource => resource, :value => @foobar)
160
158
  Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
161
159
  expect(uri).to eq @foobar_uri
162
- expect(options[:environment]).to eq @environment
160
+ expect(options[:environment]).to eq environment
163
161
  expect(options[:links]).to eq :manage
164
162
  expect(options[:checksum_type]).to eq :checksum
165
163
  end.raises RuntimeError
@@ -169,10 +167,10 @@ describe Puppet::Type.type(:file).attrclass(:source) do
169
167
  end
170
168
 
171
169
  it "should fail if no specified sources can be found" do
172
- @source = source.new(:resource => @resource, :value => @foobar)
170
+ @source = described_class.new(:resource => resource, :value => @foobar)
173
171
  Puppet::FileServing::Metadata.indirection.expects(:find).with do |uri, options|
174
172
  expect(uri).to eq @foobar_uri
175
- expect(options[:environment]).to eq @environment
173
+ expect(options[:environment]).to eq environment
176
174
  expect(options[:links]).to eq :manage
177
175
  expect(options[:checksum_type]).to eq :checksum
178
176
  end.returns nil
@@ -184,15 +182,15 @@ describe Puppet::Type.type(:file).attrclass(:source) do
184
182
  end
185
183
 
186
184
  it "should have a method for setting the desired values on the resource" do
187
- expect(source.new(:resource => @resource)).to respond_to(:copy_source_values)
185
+ expect(described_class.new(:resource => resource)).to respond_to(:copy_source_values)
188
186
  end
189
187
 
190
188
  describe "when copying the source values" do
191
189
  before :each do
192
190
  @resource = Puppet::Type.type(:file).new :path => @foobar
193
191
 
194
- @source = source.new(:resource => @resource)
195
- @metadata = stub 'metadata', :owner => 100, :group => 200, :mode => "173", :checksum => "{md5}asdfasdf", :ftype => "file", :source => @foobar
192
+ @source = described_class.new(:resource => @resource)
193
+ @metadata = stub 'metadata', :owner => 100, :group => 200, :mode => "173", :checksum => "{md5}asdfasdf", :checksum_type => "md5", :ftype => "file", :source => @foobar
196
194
  @source.stubs(:metadata).returns @metadata
197
195
 
198
196
  Puppet.features.stubs(:root?).returns true
@@ -202,7 +200,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
202
200
  @metadata.stubs(:mode).returns 0173
203
201
  @resource[:source_permissions] = :use
204
202
  if Puppet::Util::Platform.windows?
205
- expect { @source.copy_source_values }.to raise_error("Copying owner/mode/group from the source file on Windows is not supported; use source_permissions => ignore.")
203
+ expect { @source.copy_source_values }.to raise_error("Should not have tried to use source owner/mode/group on Windows")
206
204
  else
207
205
  expect { @source.copy_source_values }.not_to raise_error
208
206
  end
@@ -212,7 +210,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
212
210
  @metadata.stubs(:mode).returns "173"
213
211
  @resource[:source_permissions] = :use
214
212
  if Puppet::Util::Platform.windows?
215
- expect { @source.copy_source_values }.to raise_error("Copying owner/mode/group from the source file on Windows is not supported; use source_permissions => ignore.")
213
+ expect { @source.copy_source_values }.to raise_error("Should not have tried to use source owner/mode/group on Windows")
216
214
  else
217
215
  expect { @source.copy_source_values }.not_to raise_error
218
216
  end
@@ -248,20 +246,22 @@ describe Puppet::Type.type(:file).attrclass(:source) do
248
246
  context "when source_permissions is `use`" do
249
247
  before :each do
250
248
  @resource[:source_permissions] = "use"
249
+ @resource[:checksum] = :sha256
251
250
  end
252
251
 
253
- it "should copy the metadata's owner, group, checksum, and mode to the resource if they are not set on the resource" do
252
+ it "should copy the metadata's owner, group, checksum, checksum_type, and mode to the resource if they are not set on the resource" do
254
253
  @source.copy_source_values
255
254
 
256
255
  expect(@resource[:owner]).to eq(100)
257
256
  expect(@resource[:group]).to eq(200)
258
257
  expect(@resource[:mode]).to eq("173")
259
258
 
260
- # Metadata calls it checksum, we call it content.
259
+ # Metadata calls it checksum and checksum_type, we call it content and checksum.
261
260
  expect(@resource[:content]).to eq(@metadata.checksum)
261
+ expect(@resource[:checksum]).to eq(@metadata.checksum_type.to_sym)
262
262
  end
263
263
 
264
- it "should not copy the metadata's owner, group, checksum and mode to the resource if they are already set" do
264
+ it "should not copy the metadata's owner, group, checksum, checksum_type, and mode to the resource if they are already set" do
265
265
  @resource[:owner] = 1
266
266
  @resource[:group] = 2
267
267
  @resource[:mode] = '173'
@@ -273,6 +273,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
273
273
  expect(@resource[:group]).to eq(2)
274
274
  expect(@resource[:mode]).to eq('173')
275
275
  expect(@resource[:content]).not_to eq(@metadata.checksum)
276
+ expect(@resource[:checksum]).not_to eq(@metadata.checksum_type.to_sym)
276
277
  end
277
278
 
278
279
  describe "and puppet is not running as root" do
@@ -398,67 +399,17 @@ describe Puppet::Type.type(:file).attrclass(:source) do
398
399
  expect(@resource[:mode]).to be_nil
399
400
  end
400
401
  end
401
-
402
- describe "on Windows when source_permissions is `use`" do
403
- before :each do
404
- Puppet.features.stubs(:microsoft_windows?).returns true
405
- @resource[:source_permissions] = "use"
406
- end
407
- let(:err_message) { "Copying owner/mode/group from the" <<
408
- " source file on Windows is not supported;" <<
409
- " use source_permissions => ignore." }
410
-
411
- it "should issue error when copying from remote sources" do
412
- @source.stubs(:local?).returns false
413
-
414
- expect { @source.copy_source_values }.to raise_error(err_message)
415
- end
416
-
417
- it "should issue error when copying from local sources" do
418
- @source.stubs(:local?).returns true
419
-
420
- expect { @source.copy_source_values }.to raise_error(err_message)
421
- end
422
-
423
- it "should issue error when copying metadata from remote sources if only user is unspecified" do
424
- @source.stubs(:local?).returns false
425
- @resource[:group] = 2
426
- @resource[:mode] = "0003"
427
-
428
- expect { @source.copy_source_values }.to raise_error(err_message)
429
- end
430
-
431
- it "should issue error when copying metadata from remote sources if only group is unspecified" do
432
- @source.stubs(:local?).returns false
433
- @resource[:owner] = 1
434
- @resource[:mode] = "0003"
435
-
436
- expect { @source.copy_source_values }.to raise_error(err_message)
437
- end
438
-
439
- it "should issue error when copying metadata from remote sources if only mode is unspecified" do
440
- @source.stubs(:local?).returns false
441
- @resource[:owner] = 1
442
- @resource[:group] = 2
443
-
444
- expect { @source.copy_source_values }.to raise_error(err_message)
445
- end
446
-
447
- it "should not issue error when copying metadata from remote sources if group, owner, and mode are all specified" do
448
- @source.stubs(:local?).returns false
449
- @resource[:owner] = 1
450
- @resource[:group] = 2
451
- @resource[:mode] = "0003"
452
-
453
- expect { @source.copy_source_values }.not_to raise_error
454
- end
455
- end
456
402
  end
457
403
 
458
404
  describe "and the source is a link" do
405
+ before do
406
+ Puppet.features.stubs(:microsoft_windows?).returns false
407
+ end
408
+
459
409
  it "should set the target to the link destination" do
460
410
  @metadata.stubs(:ftype).returns "link"
461
411
  @metadata.stubs(:links).returns "manage"
412
+ @metadata.stubs(:checksum_type).returns nil
462
413
  @resource.stubs(:[])
463
414
  @resource.stubs(:[]=)
464
415
 
@@ -471,7 +422,7 @@ describe Puppet::Type.type(:file).attrclass(:source) do
471
422
  end
472
423
 
473
424
  it "should have a local? method" do
474
- expect(source.new(:resource => @resource)).to be_respond_to(:local?)
425
+ expect(described_class.new(:resource => resource)).to be_respond_to(:local?)
475
426
  end
476
427
 
477
428
  context "when accessing source properties" do
@@ -520,45 +471,186 @@ describe Puppet::Type.type(:file).attrclass(:source) do
520
471
  end
521
472
  end
522
473
 
523
- describe "for remote sources" do
524
- let(:sourcepath) { "/path/to/source" }
525
- let(:uri) { URI::Generic.build(:scheme => 'puppet', :host => 'server', :port => 8192, :path => sourcepath).to_s }
474
+ %w{puppet http}.each do |scheme|
475
+ describe "for remote (#{scheme}) sources" do
476
+ let(:sourcepath) { "/path/to/source" }
477
+ let(:uri) { URI::Generic.build(:scheme => scheme, :host => 'server', :port => 8192, :path => sourcepath).to_s }
478
+
479
+ before(:each) do
480
+ metadata = Puppet::FileServing::Metadata.new(path, :source => uri, 'type' => 'file')
481
+ #metadata = stub('remote', :ftype => "file", :source => uri)
482
+ Puppet::FileServing::Metadata.indirection.stubs(:find).
483
+ with(uri,all_of(has_key(:environment), has_key(:links))).returns metadata
484
+ Puppet::FileServing::Metadata.indirection.stubs(:find).
485
+ with(uri,all_of(has_key(:environment), has_key(:links))).returns metadata
486
+ resource[:source] = uri
487
+ end
488
+
489
+ it "should not be local" do
490
+ expect(resource.parameter(:source)).not_to be_local
491
+ end
492
+
493
+ it "should be able to return the metadata source full path" do
494
+ expect(resource.parameter(:source).full_path).to eq("/path/to/source")
495
+ end
496
+
497
+ it "should be able to return the source server" do
498
+ expect(resource.parameter(:source).server).to eq("server")
499
+ end
500
+
501
+ it "should be able to return the source port" do
502
+ expect(resource.parameter(:source).port).to eq(8192)
503
+ end
504
+
505
+ if scheme == 'puppet'
506
+ describe "which don't specify server or port" do
507
+ let(:uri) { "puppet:///path/to/source" }
508
+
509
+ it "should return the default source server" do
510
+ Puppet[:server] = "myserver"
511
+ expect(resource.parameter(:source).server).to eq("myserver")
512
+ end
513
+
514
+ it "should return the default source port" do
515
+ Puppet[:masterport] = 1234
516
+ expect(resource.parameter(:source).port).to eq(1234)
517
+ end
518
+ end
519
+ end
520
+ end
521
+ end
522
+ end
523
+
524
+ describe "when writing" do
525
+ describe "as puppet apply" do
526
+ let(:source_content) { "source file content\r\n"*10 }
527
+ before do
528
+ Puppet[:default_file_terminus] = "file_server"
529
+ resource[:source] = file_containing('apply', source_content)
530
+ end
531
+
532
+ it "should copy content from the source to the file" do
533
+ source = resource.parameter(:source)
534
+ resource.write(source)
535
+
536
+ expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
537
+ end
538
+
539
+ with_digest_algorithms do
540
+ it "should return the checksum computed" do
541
+ File.open(filename, 'wb') do |file|
542
+ source = resource.parameter(:source)
543
+ resource[:checksum] = digest_algorithm
544
+ expect(source.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
545
+ end
546
+ end
547
+ end
548
+ end
549
+
550
+ describe "from local source" do
551
+ let(:source_content) { "source file content\r\n"*10 }
552
+ before do
553
+ resource[:backup] = false
554
+ resource[:source] = file_containing('source', source_content)
555
+ end
556
+
557
+ it "should copy content from the source to the file" do
558
+ source = resource.parameter(:source)
559
+ resource.write(source)
526
560
 
527
- before(:each) do
528
- metadata = Puppet::FileServing::Metadata.new(path, :source => uri, 'type' => 'file')
529
- #metadata = stub('remote', :ftype => "file", :source => uri)
530
- Puppet::FileServing::Metadata.indirection.stubs(:find).
531
- with(uri,all_of(has_key(:environment), has_key(:links))).returns metadata
532
- resource[:source] = uri
561
+ expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
533
562
  end
534
563
 
535
- it "should not be local" do
536
- expect(resource.parameter(:source)).not_to be_local
564
+ with_digest_algorithms do
565
+ it "should return the checksum computed" do
566
+ File.open(filename, 'wb') do |file|
567
+ source = resource.parameter(:source)
568
+ resource[:checksum] = digest_algorithm
569
+ expect(source.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
570
+ end
571
+ end
537
572
  end
573
+ end
574
+
575
+ describe 'from remote source' do
576
+ let(:source_content) { "source file content\n"*10 }
577
+ let(:source) { resource.newattr(:source) }
578
+ let(:response) { stub_everything('response') }
579
+ let(:conn) { mock('connection') }
580
+
581
+ before do
582
+ resource[:backup] = false
538
583
 
539
- it "should be able to return the metadata source full path" do
540
- expect(resource.parameter(:source).full_path).to eq("/path/to/source")
584
+ response.stubs(:read_body).multiple_yields(*source_content.lines)
585
+ conn.stubs(:request_get).yields(response)
541
586
  end
542
587
 
543
- it "should be able to return the source server" do
544
- expect(resource.parameter(:source).server).to eq("server")
588
+ it 'should use an explicit fileserver if source starts with puppet://' do
589
+ response.stubs(:code).returns('200')
590
+ source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet://somehostname/test/foo', :ftype => 'file')
591
+ Puppet::Network::HttpPool.expects(:http_instance).with('somehostname', anything).returns(conn)
592
+
593
+ resource.write(source)
545
594
  end
546
595
 
547
- it "should be able to return the source port" do
548
- expect(resource.parameter(:source).port).to eq(8192)
596
+ it 'should use the default fileserver if source starts with puppet:///' do
597
+ response.stubs(:code).returns('200')
598
+ source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
599
+ Puppet::Network::HttpPool.expects(:http_instance).with(Puppet.settings[:server], anything).returns(conn)
600
+
601
+ resource.write(source)
549
602
  end
550
603
 
551
- describe "which don't specify server or port" do
552
- let(:uri) { "puppet:///path/to/source" }
604
+ it 'should percent encode reserved characters' do
605
+ response.stubs(:code).returns('200')
606
+ Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
607
+ source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo bar', :ftype => 'file')
608
+
609
+ conn.unstub(:request_get)
610
+ conn.expects(:request_get).with("#{Puppet::Network::HTTP::MASTER_URL_PREFIX}/v3/file_content/test/foo%20bar?environment=myenv&", anything).yields(response)
553
611
 
554
- it "should return the default source server" do
555
- Puppet[:server] = "myserver"
556
- expect(resource.parameter(:source).server).to eq("myserver")
612
+ resource.write(source)
613
+ end
614
+
615
+ describe 'when handling file_content responses' do
616
+ before do
617
+ File.open(filename, 'w') {|f| f.write "initial file content"}
557
618
  end
558
619
 
559
- it "should return the default source port" do
560
- Puppet[:masterport] = 1234
561
- expect(resource.parameter(:source).port).to eq(1234)
620
+ before(:each) do
621
+ Puppet::Network::HttpPool.stubs(:http_instance).returns(conn)
622
+ source.stubs(:metadata).returns stub_everything('metadata', :source => 'puppet:///test/foo', :ftype => 'file')
623
+ end
624
+
625
+ it 'should not write anything if source is not found' do
626
+ response.stubs(:code).returns('404')
627
+
628
+ expect { resource.write(source) }.to raise_error(Net::HTTPError, /404/)
629
+ expect(File.read(filename)).to eq('initial file content')
630
+ end
631
+
632
+ it 'should raise an HTTP error in case of server error' do
633
+ response.stubs(:code).returns('500')
634
+
635
+ expect { resource.write(source) }.to raise_error(Net::HTTPError, /500/)
636
+ end
637
+
638
+ context 'and the request was successful' do
639
+ before(:each) { response.stubs(:code).returns '200' }
640
+
641
+ it 'should write the contents to the file' do
642
+ resource.write(source)
643
+ expect(Puppet::FileSystem.binread(filename)).to eq(source_content)
644
+ end
645
+
646
+ with_digest_algorithms do
647
+ it 'should return the checksum computed' do
648
+ File.open(filename, 'w') do |file|
649
+ resource[:checksum] = digest_algorithm
650
+ expect(source.write(file)).to eq("{#{digest_algorithm}}#{digest(source_content)}")
651
+ end
652
+ end
653
+ end
562
654
  end
563
655
  end
564
656
  end