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
@@ -151,12 +151,14 @@ describe provider_class do
151
151
 
152
152
  describe "get_latest_version" do
153
153
  it "should rereturn nil when the current package is the latest" do
154
- nmap_latest_version = provider_class.get_latest_version('security/nmap')
154
+ version_list = File.read(my_fixture('pkg.version'))
155
+ nmap_latest_version = provider_class.get_latest_version('security/nmap', version_list)
155
156
  expect(nmap_latest_version).to be_nil
156
157
  end
157
158
 
158
159
  it "should match the package name exactly" do
159
- bash_comp_latest_version = provider_class.get_latest_version('shells/bash-completion')
160
+ version_list = File.read(my_fixture('pkg.version'))
161
+ bash_comp_latest_version = provider_class.get_latest_version('shells/bash-completion', version_list)
160
162
  expect(bash_comp_latest_version).to eq('2.1_3')
161
163
  end
162
164
  end
@@ -505,6 +505,17 @@ describe provider_class do
505
505
  expect(output).to include("yum-plugin-fastestmirror.noarch")
506
506
  end
507
507
  end
508
+ describe "with broken update notices" do
509
+ let(:check_update) { File.read(my_fixture('yum-check-update-broken-notices.txt')) }
510
+ let(:output) { described_class.parse_updates(check_update) }
511
+
512
+ it "ignores all entries including and after 'Update'" do
513
+ expect(output).not_to include("Update")
514
+ end
515
+ it "includes updates before 'Update'" do
516
+ expect(output).to include("yum-plugin-fastestmirror.noarch")
517
+ end
518
+ end
508
519
  end
509
520
 
510
521
  describe "parsing a line from yum check-update" do
@@ -214,4 +214,18 @@ describe provider_class do
214
214
  @provider.install
215
215
  end
216
216
  end
217
+
218
+ describe 'when uninstalling' do
219
+ it 'should use remove to uninstall on zypper version 1.6 and above' do
220
+ @provider.stubs(:zypper_version).returns '1.6.308'
221
+ @provider.expects(:zypper).with(:remove, '--no-confirm', 'mypackage')
222
+ @provider.uninstall
223
+ end
224
+
225
+ it 'should use remove --force-solution to uninstall on zypper versions between 1.0 and 1.6' do
226
+ @provider.stubs(:zypper_version).returns '1.0.2'
227
+ @provider.expects(:zypper).with(:remove, '--no-confirm', '--force-resolution', 'mypackage')
228
+ @provider.uninstall
229
+ end
230
+ end
217
231
  end
@@ -4,6 +4,7 @@
4
4
  require 'spec_helper'
5
5
 
6
6
  describe Puppet::Type.type(:service).provider(:launchd) do
7
+ let (:plistlib) { Puppet::Util::Plist }
7
8
  let (:joblabel) { "com.foo.food" }
8
9
  let (:provider) { subject.class }
9
10
  let(:resource) { Puppet::Type.type(:service).new(:name => joblabel, :provider => :launchd) }
@@ -43,21 +44,21 @@ describe Puppet::Type.type(:service).provider(:launchd) do
43
44
  it "should return true if the job plist says disabled is true and the global overrides says disabled is false" do
44
45
  provider.expects(:get_os_version).returns(kernel).at_least_once
45
46
  subject.expects(:plist_from_label).returns([joblabel, {"Disabled" => true}])
46
- provider.expects(:read_plist).with(launchd_overrides_6_9).returns({joblabel => {"Disabled" => false}})
47
+ plistlib.expects(:read_plist_file).with(launchd_overrides_6_9).returns({joblabel => {"Disabled" => false}})
47
48
  FileTest.expects(:file?).with(launchd_overrides_6_9).returns(true)
48
49
  expect(subject.enabled?).to eq(:true)
49
50
  end
50
51
  it "should return false if the job plist says disabled is false and the global overrides says disabled is true" do
51
52
  provider.expects(:get_os_version).returns(kernel).at_least_once
52
53
  subject.expects(:plist_from_label).returns([joblabel, {"Disabled" => false}])
53
- provider.expects(:read_plist).with(launchd_overrides_6_9).returns({joblabel => {"Disabled" => true}})
54
+ plistlib.expects(:read_plist_file).with(launchd_overrides_6_9).returns({joblabel => {"Disabled" => true}})
54
55
  FileTest.expects(:file?).with(launchd_overrides_6_9).returns(true)
55
56
  expect(subject.enabled?).to eq(:false)
56
57
  end
57
58
  it "should return true if the job plist and the global overrides have no disabled keys" do
58
59
  provider.expects(:get_os_version).returns(kernel).at_least_once
59
60
  subject.expects(:plist_from_label).returns([joblabel, {}])
60
- provider.expects(:read_plist).with(launchd_overrides_6_9).returns({})
61
+ plistlib.expects(:read_plist_file).with(launchd_overrides_6_9).returns({})
61
62
  FileTest.expects(:file?).with(launchd_overrides_6_9).returns(true)
62
63
  expect(subject.enabled?).to eq(:true)
63
64
  end
@@ -68,21 +69,21 @@ describe Puppet::Type.type(:service).provider(:launchd) do
68
69
  it "should return true if the job plist says disabled is true and the global overrides says disabled is false" do
69
70
  provider.expects(:get_os_version).returns(14).at_least_once
70
71
  subject.expects(:plist_from_label).returns([joblabel, {"Disabled" => true}])
71
- provider.expects(:read_plist).with(launchd_overrides_10_).returns({joblabel => false})
72
+ plistlib.expects(:read_plist_file).with(launchd_overrides_10_).returns({joblabel => false})
72
73
  FileTest.expects(:file?).with(launchd_overrides_10_).returns(true)
73
74
  expect(subject.enabled?).to eq(:true)
74
75
  end
75
76
  it "should return false if the job plist says disabled is false and the global overrides says disabled is true" do
76
77
  provider.expects(:get_os_version).returns(14).at_least_once
77
78
  subject.expects(:plist_from_label).returns([joblabel, {"Disabled" => false}])
78
- provider.expects(:read_plist).with(launchd_overrides_10_).returns({joblabel => true})
79
+ plistlib.expects(:read_plist_file).with(launchd_overrides_10_).returns({joblabel => true})
79
80
  FileTest.expects(:file?).with(launchd_overrides_10_).returns(true)
80
81
  expect(subject.enabled?).to eq(:false)
81
82
  end
82
83
  it "should return true if the job plist and the global overrides have no disabled keys" do
83
84
  provider.expects(:get_os_version).returns(14).at_least_once
84
85
  subject.expects(:plist_from_label).returns([joblabel, {}])
85
- provider.expects(:read_plist).with(launchd_overrides_10_).returns({})
86
+ plistlib.expects(:read_plist_file).with(launchd_overrides_10_).returns({})
86
87
  FileTest.expects(:file?).with(launchd_overrides_10_).returns(true)
87
88
  expect(subject.enabled?).to eq(:true)
88
89
  end
@@ -203,8 +204,8 @@ describe Puppet::Type.type(:service).provider(:launchd) do
203
204
  it "should write to the global launchd overrides file once" do
204
205
  resource[:enable] = true
205
206
  provider.expects(:get_os_version).returns(kernel).at_least_once
206
- provider.expects(:read_plist).with(launchd_overrides_6_9).returns({})
207
- Plist::Emit.expects(:save_plist).with(has_entry(resource[:name], {'Disabled' => false}), launchd_overrides_6_9).once
207
+ plistlib.expects(:read_plist_file).with(launchd_overrides_6_9).returns({})
208
+ plistlib.expects(:write_plist_file).with(has_entry(resource[:name], {'Disabled' => false}), launchd_overrides_6_9).once
208
209
  subject.enable
209
210
  end
210
211
  end
@@ -213,8 +214,8 @@ describe Puppet::Type.type(:service).provider(:launchd) do
213
214
  it "should write to the global launchd overrides file once" do
214
215
  resource[:enable] = false
215
216
  provider.expects(:get_os_version).returns(kernel).at_least_once
216
- provider.expects(:read_plist).with(launchd_overrides_6_9).returns({})
217
- Plist::Emit.expects(:save_plist).with(has_entry(resource[:name], {'Disabled' => true}), launchd_overrides_6_9).once
217
+ plistlib.expects(:read_plist_file).with(launchd_overrides_6_9).returns({})
218
+ plistlib.expects(:write_plist_file).with(has_entry(resource[:name], {'Disabled' => true}), launchd_overrides_6_9).once
218
219
  subject.disable
219
220
  end
220
221
  end
@@ -224,8 +225,8 @@ describe Puppet::Type.type(:service).provider(:launchd) do
224
225
  it "should write to the global launchd overrides file once" do
225
226
  resource[:enable] = true
226
227
  provider.expects(:get_os_version).returns(14).at_least_once
227
- provider.expects(:read_plist).with(launchd_overrides_10_).returns({})
228
- Plist::Emit.expects(:save_plist).with(has_entry(resource[:name], false), launchd_overrides_10_).once
228
+ plistlib.expects(:read_plist_file).with(launchd_overrides_10_).returns({})
229
+ plistlib.expects(:write_plist_file).with(has_entry(resource[:name], false), launchd_overrides_10_).once
229
230
  subject.enable
230
231
  end
231
232
  end
@@ -234,8 +235,8 @@ describe Puppet::Type.type(:service).provider(:launchd) do
234
235
  it "should write to the global launchd overrides file once" do
235
236
  resource[:enable] = false
236
237
  provider.expects(:get_os_version).returns(14).at_least_once
237
- provider.expects(:read_plist).with(launchd_overrides_10_).returns({})
238
- Plist::Emit.expects(:save_plist).with(has_entry(resource[:name], true), launchd_overrides_10_).once
238
+ plistlib.expects(:read_plist_file).with(launchd_overrides_10_).returns({})
239
+ plistlib.expects(:write_plist_file).with(has_entry(resource[:name], true), launchd_overrides_10_).once
239
240
  subject.disable
240
241
  end
241
242
  end
@@ -259,29 +260,10 @@ describe Puppet::Type.type(:service).provider(:launchd) do
259
260
  it "[17624] should warn that the plist in question is being skipped" do
260
261
  provider.expects(:launchd_paths).returns(['/Library/LaunchAgents'])
261
262
  provider.expects(:return_globbed_list_of_file_paths).with('/Library/LaunchAgents').returns([busted_plist_path])
262
- provider.expects(:read_plist).with(busted_plist_path).returns(plist_without_label)
263
+ plistlib.expects(:read_plist_file).with(busted_plist_path).returns(plist_without_label)
263
264
  Puppet.expects(:warning).with("The #{busted_plist_path} plist does not contain a 'label' key; Puppet is skipping it")
264
265
  provider.make_label_to_path_map
265
266
  end
266
-
267
- it "[15929] should skip plists that plutil cannot read" do
268
- Plist.expects(:parse_xml).with(busted_plist_path).raises(ArgumentError, 'boom')
269
- Puppet.expects(:debug).with("Error reading #{busted_plist_path}: boom. Retrying with plutil.")
270
- provider.expects(:plutil).with('-convert', 'xml1', '-o', '/dev/stdout',
271
- busted_plist_path).raises(Puppet::ExecutionFailure, 'boom')
272
- Puppet.expects(:warning).with("Cannot read file #{busted_plist_path}; " +
273
- "Puppet is skipping it. \n" +
274
- "Details: boom")
275
- provider.read_plist(busted_plist_path)
276
- end
277
-
278
- it "should read binary plists with plutil" do
279
- Plist.expects(:parse_xml).with(binary_plist_path).raises(ArgumentError, 'boom')
280
- Puppet.expects(:debug).with("Error reading #{binary_plist_path}: boom. Retrying with plutil.")
281
- provider.expects(:plutil).with('-convert', 'xml1', '-o', '/dev/stdout', binary_plist_path).returns('plist')
282
- Plist.expects(:parse_xml).with('plist').returns('plist_map')
283
- expect(provider.read_plist(binary_plist_path)).to eq('plist_map')
284
- end
285
267
  end
286
268
  it "should return the cached value when available" do
287
269
  provider.instance_variable_set(:@label_to_path_map, {'xx'=>'yy'})
@@ -295,7 +277,7 @@ describe Puppet::Type.type(:service).provider(:launchd) do
295
277
  provider.instance_variable_set(:@label_to_path_map, nil)
296
278
  provider.expects(:launchd_paths).returns([launchd_dir])
297
279
  provider.expects(:return_globbed_list_of_file_paths).with(launchd_dir).returns([plist])
298
- provider.expects(:read_plist).with(plist).returns({'Label'=>'foo.bar.service'})
280
+ plistlib.expects(:read_plist_file).with(plist).returns({'Label'=>'foo.bar.service'})
299
281
  end
300
282
  it "should read the plists and return their contents" do
301
283
  expect(provider.make_label_to_path_map).to eq({label=>plist})
@@ -112,6 +112,13 @@ describe Puppet::Type.type(:service).provider(:systemd) do
112
112
  expect(described_class).to be_default
113
113
  end
114
114
 
115
+ it "should be the default provider on ubuntu16.04" do
116
+ Facter.stubs(:value).with(:osfamily).returns(:debian)
117
+ Facter.stubs(:value).with(:operatingsystem).returns(:ubuntu)
118
+ Facter.stubs(:value).with(:operatingsystemmajrelease).returns("16.04")
119
+ expect(described_class).to be_default
120
+ end
121
+
115
122
  [:enabled?, :enable, :disable, :start, :stop, :status, :restart].each do |method|
116
123
  it "should have a #{method} method" do
117
124
  expect(provider).to respond_to(method)
@@ -41,30 +41,31 @@ describe "sshkey parsed provider" do
41
41
  end
42
42
 
43
43
  context "with the sample file" do
44
- let :fixture do my_fixture('sample') end
45
- before :each do subject.stubs(:default_target).returns(fixture) end
44
+ ['sample', 'sample_with_blank_lines'].each do |sample_file|
45
+ let :fixture do my_fixture(sample_file) end
46
+ before :each do subject.stubs(:default_target).returns(fixture) end
46
47
 
47
- it "should parse to records on prefetch" do
48
- expect(subject.target_records(fixture)).to be_empty
49
- subject.prefetch
48
+ it "should parse to records on prefetch" do
49
+ expect(subject.target_records(fixture)).to be_empty
50
+ subject.prefetch
50
51
 
51
- records = subject.target_records(fixture)
52
- expect(records).to be_an Array
53
- expect(records).to be_all {|x| expect(x).to be_an Hash }
54
- end
55
-
56
- it "should reconstitute the file from records" do
57
- subject.prefetch
58
- records = subject.target_records(fixture)
52
+ records = subject.target_records(fixture)
53
+ expect(records).to be_an Array
54
+ expect(records).to be_all {|x| expect(x).to be_an Hash }
55
+ end
59
56
 
60
- text = subject.to_file(records).gsub(/^# HEADER.+\n/, '')
57
+ it "should reconstitute the file from records" do
58
+ subject.prefetch
59
+ records = subject.target_records(fixture)
60
+ text = subject.to_file(records).gsub(/^# HEADER.+\n/, '')
61
61
 
62
- oldlines = File.readlines(fixture).map(&:chomp)
63
- newlines = text.chomp.split("\n")
64
- expect(oldlines.length).to eq(newlines.length)
62
+ oldlines = File.readlines(fixture).map(&:chomp)
63
+ newlines = text.chomp.split("\n")
64
+ expect(oldlines.length).to eq(newlines.length)
65
65
 
66
- oldlines.zip(newlines).each do |old, new|
67
- expect(old.gsub(/\s+/, '')).to eq(new.gsub(/\s+/, ''))
66
+ oldlines.zip(newlines).each do |old, new|
67
+ expect(old.gsub(/\s+/, '')).to eq(new.gsub(/\s+/, ''))
68
+ end
68
69
  end
69
70
  end
70
71
  end
@@ -1,7 +1,9 @@
1
1
  #! /usr/bin/env ruby -S rspec
2
2
  # encoding: ASCII-8BIT
3
3
  require 'spec_helper'
4
- require 'plist'
4
+
5
+ module Puppet::Util::Plist
6
+ end
5
7
 
6
8
  describe Puppet::Type.type(:user).provider(:directoryservice) do
7
9
  let(:username) { 'nonexistent_user' }
@@ -14,7 +16,6 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
14
16
  end
15
17
  let(:provider) { resource.provider }
16
18
  let(:users_plist_dir) { '/var/db/dslocal/nodes/Default/users' }
17
- let(:stringio_object) { StringIO.new('new_stringio_object') }
18
19
 
19
20
  # This is the output of doing `dscl -plist . read /Users/<username>` which
20
21
  # will return a hash of keys whose values are all arrays.
@@ -82,9 +83,9 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
82
83
 
83
84
  # The below is the result of converting sha512_embedded_bplist to XML and
84
85
  # parsing it with Plist.parse_xml. It is a Ruby Hash whose value is a
85
- # StringIO object holding a Base64 encoded salted-SHA512 password hash.
86
+ # Base64 encoded salted-SHA512 password hash.
86
87
  let(:sha512_embedded_bplist_hash) do
87
- { 'SALTED-SHA512' => StringIO.new(sha512_pw_string) }
88
+ { 'SALTED-SHA512' => sha512_pw_string }
88
89
  end
89
90
 
90
91
  # The value below is the result of converting sha512_pw_string to Hex.
@@ -106,8 +107,8 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
106
107
  let(:pbkdf2_embedded_bplist_hash) do
107
108
  {
108
109
  'SALTED-SHA512-PBKDF2' => {
109
- 'entropy' => StringIO.new(pbkdf2_pw_string),
110
- 'salt' => StringIO.new(pbkdf2_salt_string),
110
+ 'entropy' => pbkdf2_pw_string,
111
+ 'salt' => pbkdf2_salt_string,
111
112
  'iterations' => pbkdf2_iterations_value
112
113
  }
113
114
  }
@@ -290,7 +291,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
290
291
  end
291
292
  end
292
293
 
293
- describe 'self#get_all_users' do
294
+ describe 'self#get_all_users', :if => Puppet.features.cfpropertylist? do
294
295
  let(:empty_plist) do
295
296
  '<?xml version="1.0" encoding="UTF-8"?>
296
297
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@@ -332,7 +333,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
332
333
  provider.class.stubs(:get_all_users).returns(testuser_hash)
333
334
  provider.class.stubs(:get_attribute_from_dscl).with('Users', username, 'ShadowHashData').returns(sha512_shadowhashdata_hash)
334
335
  provider.class.stubs(:get_list_of_groups).returns(group_plist_hash_guid)
335
- provider.class.stubs(:convert_binary_to_xml).with(sha512_embedded_bplist).returns(sha512_embedded_bplist_hash)
336
+ provider.class.stubs(:convert_binary_to_hash).with(sha512_embedded_bplist).returns(sha512_embedded_bplist_hash)
336
337
  provider.class.prefetch({})
337
338
  end
338
339
 
@@ -488,13 +489,13 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
488
489
 
489
490
  it 'should call the get_salted_sha512 method on 10.7 and return the correct hash' do
490
491
  provider.class.expects(:get_attribute_from_dscl).with('Users', username, 'ShadowHashData').returns(sha512_shadowhashdata_hash)
491
- provider.class.expects(:convert_binary_to_xml).with(sha512_embedded_bplist).returns(sha512_embedded_bplist_hash)
492
+ provider.class.expects(:convert_binary_to_hash).with(sha512_embedded_bplist).returns(sha512_embedded_bplist_hash)
492
493
  expect(provider.class.prefetch({}).first.password).to eq(sha512_password_hash)
493
494
  end
494
495
 
495
496
  it 'should call the get_salted_sha512_pbkdf2 method on 10.8 and return the correct hash' do
496
497
  provider.class.expects(:get_attribute_from_dscl).with('Users', username,'ShadowHashData').returns(pbkdf2_shadowhashdata_hash)
497
- provider.class.expects(:convert_binary_to_xml).with(pbkdf2_embedded_plist).returns(pbkdf2_embedded_bplist_hash)
498
+ provider.class.expects(:convert_binary_to_hash).with(pbkdf2_embedded_plist).returns(pbkdf2_embedded_bplist_hash)
498
499
  expect(provider.class.prefetch({}).first.password).to eq(pbkdf2_password_hash)
499
500
  end
500
501
 
@@ -566,7 +567,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
566
567
  end
567
568
  end
568
569
 
569
- describe '#get_list_of_groups' do
570
+ describe '#get_list_of_groups', :if => Puppet.features.cfpropertylist? do
570
571
  # The below value is the result of running `dscl -plist . readall /Groups`
571
572
  # on an OS X system.
572
573
  let(:groups_xml) do
@@ -633,7 +634,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
633
634
  end
634
635
  end
635
636
 
636
- describe '#get_attribute_from_dscl' do
637
+ describe '#get_attribute_from_dscl', :if => Puppet.features.cfpropertylist? do
637
638
  # The below value is the result of executing
638
639
  # `dscl -plist . read /Users/<username/ GeneratedUID`
639
640
  # on an OS X system.
@@ -662,30 +663,17 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
662
663
  end
663
664
  end
664
665
 
665
- describe '#convert_xml_to_binary' do
666
- # Because this method relies on a binary that only exists on OS X, a stub
667
- # object is needed to expect the calls. This makes testing somewhat...uneventful
668
- let(:stub_io_object) { stub('connection') }
669
-
666
+ describe '#convert_hash_to_binary' do
670
667
  it 'should use plutil to successfully convert an xml plist to a binary plist' do
671
- IO.expects(:popen).with('plutil -convert binary1 -o - -', 'r+').yields stub_io_object
672
- Plist::Emit.expects(:dump).with('ruby_hash').returns('xml_plist_data')
673
- stub_io_object.expects(:write).with('xml_plist_data')
674
- stub_io_object.expects(:close_write)
675
- stub_io_object.expects(:read).returns('binary_plist_data')
676
- expect(provider.class.convert_xml_to_binary('ruby_hash')).to eq('binary_plist_data')
668
+ Puppet::Util::Plist.expects(:dump_plist).with('ruby_hash', :binary).returns('binary_plist_data')
669
+ expect(provider.class.convert_hash_to_binary('ruby_hash')).to eq('binary_plist_data')
677
670
  end
678
671
  end
679
672
 
680
- describe '#convert_binary_to_xml' do
681
- let(:stub_io_object) { stub('connection') }
682
-
673
+ describe '#convert_binary_to_hash' do
683
674
  it 'should accept a binary plist and return a ruby hash containing the plist data' do
684
- IO.expects(:popen).with('plutil -convert xml1 -o - -', 'r+').yields stub_io_object
685
- stub_io_object.expects(:write).with('binary_plist_data')
686
- stub_io_object.expects(:close_write)
687
- stub_io_object.expects(:read).returns(user_plist_xml)
688
- expect(provider.class.convert_binary_to_xml('binary_plist_data')).to eq(user_plist_hash)
675
+ Puppet::Util::Plist.expects(:parse_plist).with('binary_plist_data').returns(user_plist_hash)
676
+ expect(provider.class.convert_binary_to_hash('binary_plist_data')).to eq(user_plist_hash)
689
677
  end
690
678
  end
691
679
 
@@ -697,7 +685,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
697
685
  end
698
686
 
699
687
  describe '#get_salted_sha512' do
700
- it "should accept a hash whose 'SALTED-SHA512' key contains a StringIO object with a base64 encoded salted-SHA512 password hash and return the hex value of that password hash" do
688
+ it "should accept a hash whose 'SALTED-SHA512' key contains a base64 encoded salted-SHA512 password hash and return the hex value of that password hash" do
701
689
  expect(provider.class.get_salted_sha512(sha512_embedded_bplist_hash)).to eq(sha512_password_hash)
702
690
  end
703
691
  end
@@ -764,15 +752,15 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
764
752
 
765
753
  let(:sha512_shadowhashdata) do
766
754
  {
767
- 'SALTED-SHA512' => StringIO.new('blankvalue')
755
+ 'SALTED-SHA512' => 'blankvalue'
768
756
  }
769
757
  end
770
758
 
771
759
  let(:pbkdf2_shadowhashdata) do
772
760
  {
773
761
  'SALTED-SHA512-PBKDF2' => {
774
- 'entropy' => StringIO.new('blank_entropy'),
775
- 'salt' => StringIO.new('blank_salt'),
762
+ 'entropy' => 'blank_entropy',
763
+ 'salt' => 'blank_salt',
776
764
  'iterations' => 100
777
765
  }
778
766
  }
@@ -797,7 +785,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
797
785
  ";Kerberosv5;;puppet@LKDC:S HA1.35580B1D6366D2890A35D430373FF653297F377D;LKDC:SHA1.35580B1D6366D2890A35D430373FF653297F377D"],
798
786
  "_writers_realname" => ["puppet"],
799
787
  "_writers_hint" => ["puppet"],
800
- "ShadowHashData" => [StringIO.new('blank')]
788
+ "ShadowHashData" => ['blank']
801
789
  }
802
790
  end
803
791
 
@@ -827,34 +815,33 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
827
815
  end
828
816
 
829
817
  describe '#set_salted_sha512' do
830
- let(:users_plist) { {'ShadowHashData' => [StringIO.new('string_data')] } }
818
+ let(:users_plist) { {'ShadowHashData' => ['string_data'] } }
831
819
  let(:sha512_shadow_hash_data) do
832
820
  {
833
- 'SALTED-SHA512' => stringio_object
821
+ 'SALTED-SHA512' => sha512_pw_string
834
822
  }
835
823
  end
836
824
 
837
825
  it 'should set the SALTED-SHA512 password hash for a user in 10.7 and call the set_shadow_hash_data method to write the plist to disk' do
838
- provider.class.expects(:convert_xml_to_binary).with(sha512_embedded_bplist_hash).returns(sha512_embedded_bplist)
826
+ provider.class.expects(:convert_hash_to_binary).with(sha512_embedded_bplist_hash).returns(sha512_embedded_bplist)
839
827
  provider.expects(:set_shadow_hash_data).with(users_plist, sha512_embedded_bplist)
840
828
  provider.set_salted_sha512(users_plist, sha512_embedded_bplist_hash, sha512_password_hash)
841
829
  end
842
830
 
843
831
  it 'should set the salted-SHA512 password, even if a blank shadow_hash_data hash is passed' do
844
- provider.expects(:new_stringio_object).returns(stringio_object)
845
- provider.class.expects(:convert_xml_to_binary).with(sha512_shadow_hash_data).returns(sha512_embedded_bplist)
832
+ provider.class.expects(:convert_hash_to_binary).with(sha512_shadow_hash_data).returns(sha512_embedded_bplist)
846
833
  provider.expects(:set_shadow_hash_data).with(users_plist, sha512_embedded_bplist)
847
834
  provider.set_salted_sha512(users_plist, false, sha512_password_hash)
848
835
  end
849
836
  end
850
837
 
851
838
  describe '#set_salted_pbkdf2' do
852
- let(:users_plist) { {'ShadowHashData' => [StringIO.new('string_data')] } }
839
+ let(:users_plist) { {'ShadowHashData' => ['string_data'] } }
853
840
  let(:entropy_shadow_hash_data) do
854
841
  {
855
842
  'SALTED-SHA512-PBKDF2' =>
856
843
  {
857
- 'entropy' => stringio_object
844
+ 'entropy' => 'binary_string'
858
845
  }
859
846
  }
860
847
  end
@@ -862,29 +849,28 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
862
849
  # This will also catch the edge-case where a 10.6-style user exists on
863
850
  # a 10.8 system and Puppet attempts to set a password
864
851
  it 'should not fail if shadow_hash_data is not a Hash' do
865
- provider.expects(:new_stringio_object).returns(stringio_object)
866
852
  provider.expects(:base64_decode_string).with(pbkdf2_password_hash).returns('binary_string')
867
- provider.class.expects(:convert_xml_to_binary).with(entropy_shadow_hash_data).returns('binary_plist')
853
+ provider.class.expects(:convert_hash_to_binary).with(entropy_shadow_hash_data).returns('binary_plist')
868
854
  provider.expects(:set_shadow_hash_data).with({'passwd' => '********'}, 'binary_plist')
869
855
  provider.set_salted_pbkdf2({}, false, 'entropy', pbkdf2_password_hash)
870
856
  end
871
857
 
872
858
  it "should set the PBKDF2 password hash when the 'entropy' field is passed with a valid password hash" do
873
- provider.class.expects(:convert_xml_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
859
+ provider.class.expects(:convert_hash_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
874
860
  provider.expects(:set_shadow_hash_data).with(users_plist, pbkdf2_embedded_plist)
875
861
  users_plist.expects(:[]=).with('passwd', '********')
876
862
  provider.set_salted_pbkdf2(users_plist, pbkdf2_embedded_bplist_hash, 'entropy', pbkdf2_password_hash)
877
863
  end
878
864
 
879
865
  it "should set the PBKDF2 password hash when the 'salt' field is passed with a valid password hash" do
880
- provider.class.expects(:convert_xml_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
866
+ provider.class.expects(:convert_hash_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
881
867
  provider.expects(:set_shadow_hash_data).with(users_plist, pbkdf2_embedded_plist)
882
868
  users_plist.expects(:[]=).with('passwd', '********')
883
869
  provider.set_salted_pbkdf2(users_plist, pbkdf2_embedded_bplist_hash, 'salt', pbkdf2_salt_value)
884
870
  end
885
871
 
886
872
  it "should set the PBKDF2 password hash when the 'iterations' field is passed with a valid password hash" do
887
- provider.class.expects(:convert_xml_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
873
+ provider.class.expects(:convert_hash_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
888
874
  provider.expects(:set_shadow_hash_data).with(users_plist, pbkdf2_embedded_plist)
889
875
  users_plist.expects(:[]=).with('passwd', '********')
890
876
  provider.set_salted_pbkdf2(users_plist, pbkdf2_embedded_bplist_hash, 'iterations', pbkdf2_iterations_value)
@@ -893,8 +879,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
893
879
 
894
880
  describe '#write_users_plist_to_disk' do
895
881
  it 'should save the passed plist to disk and convert it to a binary plist' do
896
- Plist::Emit.expects(:save_plist).with(user_plist_xml, "#{users_plist_dir}/nonexistent_user.plist")
897
- provider.expects(:plutil).with('-convert', 'binary1', "#{users_plist_dir}/nonexistent_user.plist")
882
+ Puppet::Util::Plist.expects(:write_plist_file).with(user_plist_xml, "#{users_plist_dir}/nonexistent_user.plist", :binary)
898
883
  provider.write_users_plist_to_disk(user_plist_xml)
899
884
  end
900
885
  end
@@ -907,10 +892,6 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
907
892
  end
908
893
 
909
894
  describe '#get_users_plist' do
910
- let(:test_plist) do
911
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>shell</key>\n\t<string>/bin/bash</string>\n\t<key>user</key>\n\t<string>puppet</string>\n</dict>\n</plist>\n"
912
- end
913
-
914
895
  let(:test_hash) do
915
896
  {
916
897
  'user' => 'puppet',
@@ -919,15 +900,15 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
919
900
  end
920
901
 
921
902
  it 'should convert a plist to a valid Ruby hash' do
922
- provider.expects(:plutil).with('-convert', 'xml1', '-o', '/dev/stdout', "#{users_plist_dir}/#{username}.plist").returns(test_plist)
923
- expect(provider.get_users_plist(username)).to eq(test_hash)
903
+ Puppet::Util::Plist.expects(:read_plist_file).with("#{users_plist_dir}/#{username}.plist").returns(test_hash)
904
+ expect(provider.get_users_plist(username)).to eq(test_hash, )
924
905
  end
925
906
  end
926
907
 
927
908
  describe '#get_shadow_hash_data' do
928
909
  let(:shadow_hash) do
929
910
  {
930
- 'ShadowHashData' => [StringIO.new('test')]
911
+ 'ShadowHashData' => ['test']
931
912
  }
932
913
  end
933
914
 
@@ -941,10 +922,10 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
941
922
  expect(provider.get_shadow_hash_data(no_shadow_hash)).to eq(false)
942
923
  end
943
924
 
944
- it 'should call convert_binary_to_xml() with the contents of the StringIO Object ' +
925
+ it 'should call convert_binary_to_hash() with the string ' +
945
926
  'located in the first element of the array of the ShadowHashData key if the ' +
946
927
  'passed users_plist contains a ShadowHashData key' do
947
- provider.class.expects(:convert_binary_to_xml).with('test').returns('returnvalue')
928
+ provider.class.expects(:convert_binary_to_hash).with('test').returns('returnvalue')
948
929
  expect(provider.get_shadow_hash_data(shadow_hash)).to eq('returnvalue')
949
930
  end
950
931
  end