puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -0,0 +1,286 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+
4
+ describe Puppet::Type.type(:file).attrclass(:checksum_value), :uses_checksums => true do
5
+ include PuppetSpec::Files
6
+ include_context 'with supported checksum types'
7
+
8
+ let(:path) { tmpfile('foo_bar') }
9
+ let(:source_file) { file_containing('temp_foo', 'nothing at all') }
10
+ let(:environment) { Puppet::Node::Environment.create(:testing, []) }
11
+ let(:catalog) { Puppet::Resource::Catalog.new(:test, environment) }
12
+ let(:resource) { Puppet::Type.type(:file).new(:path => path, :catalog => catalog) }
13
+
14
+ it "should be a property" do
15
+ expect(described_class.superclass).to eq(Puppet::Property)
16
+ end
17
+
18
+ describe "when retrieving the current checksum_value" do
19
+ let(:checksum_value) { described_class.new(:resource => resource) }
20
+
21
+ it "should not compute a checksum if source is absent" do
22
+ resource.expects(:stat).never
23
+ expect(checksum_value.retrieve).to be_nil
24
+ end
25
+
26
+ describe "when using a source" do
27
+ before do
28
+ resource[:source] = source_file
29
+ end
30
+
31
+ it "should return :absent if the target does not exist" do
32
+ resource.expects(:stat).returns nil
33
+
34
+ expect(checksum_value.retrieve).to eq(:absent)
35
+ end
36
+
37
+ it "should not manage content on directories" do
38
+ stat = mock 'stat', :ftype => "directory"
39
+ resource.expects(:stat).returns stat
40
+
41
+ expect(checksum_value.retrieve).to be_nil
42
+ end
43
+
44
+ it "should not manage content on links" do
45
+ stat = mock 'stat', :ftype => "link"
46
+ resource.expects(:stat).returns stat
47
+
48
+ expect(checksum_value.retrieve).to be_nil
49
+ end
50
+
51
+ it "should always return the checksum as a string" do
52
+ resource[:checksum] = :mtime
53
+
54
+ stat = mock 'stat', :ftype => "file"
55
+ resource.expects(:stat).returns stat
56
+
57
+ time = Time.now
58
+ resource.parameter(:checksum).expects(:mtime_file).with(resource[:path]).returns time
59
+
60
+ expect(checksum_value.retrieve).to eq(time.to_s)
61
+ end
62
+ end
63
+
64
+ with_digest_algorithms do
65
+ it "should return the checksum of the target if it exists and is a normal file" do
66
+ stat = mock 'stat', :ftype => "file"
67
+ resource.expects(:stat).returns stat
68
+ resource.parameter(:checksum).expects("#{digest_algorithm}_file".intern).with(resource[:path]).returns "mysum"
69
+ resource[:source] = source_file
70
+
71
+ expect(checksum_value.retrieve).to eq("mysum")
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "when testing whether the checksum_value is in sync" do
77
+ let(:checksum_value) { described_class.new(:resource => resource) }
78
+
79
+ before do
80
+ resource[:ensure] = :file
81
+ end
82
+
83
+ it "should return true if source is not specified" do
84
+ checksum_value.should = "foo"
85
+ expect(checksum_value).to be_safe_insync("whatever")
86
+ end
87
+
88
+ describe "when a source is provided" do
89
+ before do
90
+ resource[:source] = source_file
91
+ end
92
+
93
+ with_digest_algorithms do
94
+ before(:each) do
95
+ resource[:checksum] = digest_algorithm
96
+ end
97
+
98
+ it "should return true if the resource shouldn't be a regular file" do
99
+ resource.expects(:should_be_file?).returns false
100
+ checksum_value.should = "foo"
101
+ expect(checksum_value).to be_safe_insync("whatever")
102
+ end
103
+
104
+ it "should return false if the current checksum_value is :absent" do
105
+ checksum_value.should = "foo"
106
+ expect(checksum_value).not_to be_safe_insync(:absent)
107
+ end
108
+
109
+ it "should return false if the file should be a file but is not present" do
110
+ resource.expects(:should_be_file?).returns true
111
+ checksum_value.should = "foo"
112
+
113
+ expect(checksum_value).not_to be_safe_insync(:absent)
114
+ end
115
+
116
+ describe "and the file exists" do
117
+ before do
118
+ resource.stubs(:stat).returns mock("stat")
119
+ checksum_value.should = "somechecksum"
120
+ end
121
+
122
+ it "should return false if the current checksum_value is different from the desired checksum_value" do
123
+ expect(checksum_value).not_to be_safe_insync("otherchecksum")
124
+ end
125
+
126
+ it "should return true if the current checksum_value is the same as the desired checksum_value" do
127
+ expect(checksum_value).to be_safe_insync("somechecksum")
128
+ end
129
+
130
+ it "should include the diff module" do
131
+ expect(checksum_value.respond_to?("diff")).to eq(false)
132
+ end
133
+
134
+ [true, false].product([true, false]).each do |cfg, param|
135
+ describe "and Puppet[:show_diff] is #{cfg} and show_diff => #{param}" do
136
+ before do
137
+ Puppet[:show_diff] = cfg
138
+ resource.stubs(:show_diff?).returns param
139
+ resource[:loglevel] = "debug"
140
+ end
141
+
142
+ if cfg and param
143
+ it "should display a diff" do
144
+ checksum_value.expects(:diff).returns("my diff").once
145
+ checksum_value.expects(:debug).with("\nmy diff").once
146
+ expect(checksum_value).not_to be_safe_insync("otherchecksum")
147
+ end
148
+ else
149
+ it "should not display a diff" do
150
+ checksum_value.expects(:diff).never
151
+ expect(checksum_value).not_to be_safe_insync("otherchecksum")
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+
159
+ let(:saved_time) { Time.now }
160
+ [:ctime, :mtime].each do |time_stat|
161
+ [["older", -1, false], ["same", 0, true], ["newer", 1, true]].each do
162
+ |compare, target_time, success|
163
+ describe "with #{compare} target #{time_stat} compared to source" do
164
+ before do
165
+ resource[:checksum] = time_stat
166
+ checksum_value.should = saved_time.to_s
167
+ end
168
+
169
+ it "should return #{success}" do
170
+ if success
171
+ expect(checksum_value).to be_safe_insync((saved_time+target_time).to_s)
172
+ else
173
+ expect(checksum_value).not_to be_safe_insync((saved_time+target_time).to_s)
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ describe "with #{time_stat}" do
180
+ before do
181
+ resource[:checksum] = time_stat
182
+ end
183
+
184
+ it "should not be insync if trying to create it" do
185
+ checksum_value.should = saved_time.to_s
186
+ expect(checksum_value).not_to be_safe_insync(:absent)
187
+ end
188
+
189
+ it "should raise an error if checksum_value is not a checksum" do
190
+ checksum_value.should = "some content"
191
+ expect {
192
+ checksum_value.safe_insync?(saved_time.to_s)
193
+ }.to raise_error(/Resource with checksum_type #{time_stat} didn't contain a date in/)
194
+ end
195
+
196
+ it "should not be insync even if checksum_value is the absent symbol" do
197
+ checksum_value.should = :absent
198
+ expect(checksum_value).not_to be_safe_insync(:absent)
199
+ end
200
+ end
201
+ end
202
+
203
+ describe "and :replace is false" do
204
+ before do
205
+ resource.stubs(:replace?).returns false
206
+ end
207
+
208
+ it "should be insync if the file exists and the checksum_value is different" do
209
+ resource.stubs(:stat).returns mock('stat')
210
+
211
+ expect(checksum_value).to be_safe_insync("whatever")
212
+ end
213
+
214
+ it "should be insync if the file exists and the checksum_value is right" do
215
+ resource.stubs(:stat).returns mock('stat')
216
+
217
+ expect(checksum_value).to be_safe_insync("something")
218
+ end
219
+
220
+ it "should not be insync if the file does not exist" do
221
+ checksum_value.should = "foo"
222
+ expect(checksum_value).not_to be_safe_insync(:absent)
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ describe "when testing whether the checksum_value is initialized in the resource and in sync" do
229
+ CHECKSUM_TYPES_TO_TRY.each do |checksum_type, checksum|
230
+ describe "sync with checksum type #{checksum_type} and the file exists" do
231
+ before do
232
+ @new_resource = Puppet::Type.type(:file).new :ensure => :file, :path => path, :catalog => catalog,
233
+ :checksum_value => checksum, :checksum => checksum_type, :source => source_file
234
+ @new_resource.stubs(:stat).returns mock('stat')
235
+ end
236
+
237
+ it "should return false if the current checksum_value is different from the desired checksum_value" do
238
+ expect(@new_resource.parameters[:checksum_value]).not_to be_safe_insync("abcdef")
239
+ end
240
+
241
+ it "should return true if the current checksum_value is the same as the desired checksum_value" do
242
+ expect(@new_resource.parameters[:checksum_value]).to be_safe_insync(checksum)
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ describe "when changing the checksum_value" do
249
+ let(:checksum_value) { described_class.new(:resource => resource) }
250
+
251
+ before do
252
+ resource.stubs(:[]).with(:path).returns "/boo"
253
+ resource.stubs(:stat).returns "eh"
254
+ end
255
+
256
+ it "should raise if source is absent" do
257
+ resource.expects(:write).never
258
+
259
+ expect { checksum_value.sync }.to raise_error "checksum_value#sync should not be called without a source parameter"
260
+ end
261
+
262
+ describe "when using a source" do
263
+ before do
264
+ resource[:source] = source_file
265
+ end
266
+
267
+ it "should use the file's :write method to write the checksum_value" do
268
+ resource.expects(:write).with(resource.parameter(:source))
269
+
270
+ checksum_value.sync
271
+ end
272
+
273
+ it "should return :file_changed if the file already existed" do
274
+ resource.expects(:stat).returns "something"
275
+ resource.stubs(:write)
276
+ expect(checksum_value.sync).to eq(:file_changed)
277
+ end
278
+
279
+ it "should return :file_created if the file did not exist" do
280
+ resource.expects(:stat).returns nil
281
+ resource.stubs(:write)
282
+ expect(checksum_value.sync).to eq(:file_created)
283
+ end
284
+ end
285
+ end
286
+ end
@@ -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