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
@@ -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
@@ -64,9 +64,9 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet.feature
64
64
 
65
65
  describe "#groups_insync?" do
66
66
 
67
- let(:group1) { stub(:account => 'group1', :domain => '.', :to_s => 'group1sid') }
68
- let(:group2) { stub(:account => 'group2', :domain => '.', :to_s => 'group2sid') }
69
- let(:group3) { stub(:account => 'group3', :domain => '.', :to_s => 'group3sid') }
67
+ let(:group1) { stub(:account => 'group1', :domain => '.', :sid => 'group1sid') }
68
+ let(:group2) { stub(:account => 'group2', :domain => '.', :sid => 'group2sid') }
69
+ let(:group3) { stub(:account => 'group3', :domain => '.', :sid => 'group3sid') }
70
70
 
71
71
  before :each do
72
72
  Puppet::Util::Windows::SID.stubs(:name_to_sid_object).with('group1').returns(group1)
@@ -244,8 +244,8 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet.feature
244
244
  end
245
245
 
246
246
  it 'should be able to test whether a user exists' do
247
- Puppet::Util::Windows::ADSI.stubs(:sid_uri_safe).returns(nil)
248
- Puppet::Util::Windows::ADSI.stubs(:connect).returns stub('connection')
247
+ Puppet::Util::Windows::SID.stubs(:name_to_sid_object).returns(nil)
248
+ Puppet::Util::Windows::ADSI.stubs(:connect).returns stub('connection', :Class => 'User')
249
249
  expect(provider).to be_exists
250
250
 
251
251
  Puppet::Util::Windows::ADSI.stubs(:connect).returns nil
@@ -249,6 +249,22 @@ describe Puppet::Type.type(:yumrepo).provider(:inifile) do
249
249
  expect(described_class.reposdir('/etc/yum.conf')).to include("/etc/yum/extra.repos.d")
250
250
  end
251
251
 
252
+ it "includes the directory if the value is split by whitespace" do
253
+ Puppet::FileSystem.expects(:exist?).with("/etc/yum/extra.repos.d").returns(true)
254
+ Puppet::FileSystem.expects(:exist?).with("/etc/yum/misc.repos.d").returns(true)
255
+
256
+ described_class.expects(:find_conf_value).with('reposdir', '/etc/yum.conf').returns "/etc/yum/extra.repos.d /etc/yum/misc.repos.d"
257
+ expect(described_class.reposdir('/etc/yum.conf')).to include("/etc/yum/extra.repos.d", "/etc/yum/misc.repos.d")
258
+ end
259
+
260
+ it "includes the directory if the value is split by new lines" do
261
+ Puppet::FileSystem.expects(:exist?).with("/etc/yum/extra.repos.d").returns(true)
262
+ Puppet::FileSystem.expects(:exist?).with("/etc/yum/misc.repos.d").returns(true)
263
+
264
+ described_class.expects(:find_conf_value).with('reposdir', '/etc/yum.conf').returns "/etc/yum/extra.repos.d\n/etc/yum/misc.repos.d"
265
+ expect(described_class.reposdir('/etc/yum.conf')).to include("/etc/yum/extra.repos.d", "/etc/yum/misc.repos.d")
266
+ end
267
+
252
268
  it "doesn't include the directory specified by the yum.conf 'reposdir' entry when the directory is absent" do
253
269
  Puppet::FileSystem.expects(:exist?).with("/etc/yum/extra.repos.d").returns(false)
254
270
 
@@ -15,7 +15,7 @@ describe Puppet::Resource::CapabilityFinder do
15
15
  around(:each) do |example|
16
16
  mock_pdb = !Puppet::Util.const_defined?('Puppetdb')
17
17
  if mock_pdb
18
- class Puppet::Util::Puppetdb
18
+ module Puppet::Util::Puppetdb
19
19
  class Http; end
20
20
  end
21
21
  end
@@ -27,11 +27,8 @@ describe Puppet::Resource::CapabilityFinder do
27
27
  end
28
28
  end
29
29
 
30
- class MockResponse
31
- def body
32
- '[{"type": "Cap", "title": "cap", "parameters": { "host" : "ahost" }}]'
33
- end
34
- end
30
+ let(:response_body) { [{"type"=>"Cap", "title"=>"cap", "parameters"=>{"host"=>"ahost"}}] }
31
+ let(:response) { stub('response', :body => response_body.to_json) }
35
32
 
36
33
  def make_cap_type
37
34
  Puppet::Type.newtype :cap, :is_capability => true do
@@ -40,17 +37,33 @@ describe Puppet::Resource::CapabilityFinder do
40
37
  end
41
38
  end
42
39
 
43
- it 'should call Puppet::Util::PuppetDB::Http.action' do
44
- Puppet::Util::Puppetdb::Http.expects(:action).returns(MockResponse.new)
45
- result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
46
- expect(result['host']).to eq('ahost')
40
+ describe "when query_puppetdb method is available" do
41
+ it 'should call use the query_puppetdb method if available' do
42
+ Puppet::Util::Puppetdb.expects(:query_puppetdb).returns(response_body)
43
+ Puppet::Util::Puppetdb::Http.expects(:action).never
44
+
45
+ result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
46
+ expect(result['host']).to eq('ahost')
47
+ end
47
48
  end
48
49
 
49
- it 'should use pass code_id in query to Puppet::Util::PuppetDB::Http.action' do
50
- code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
51
- Puppet::Util::Puppetdb::Http.expects(:action).with(regexp_matches(Regexp.new(CGI.escape('"=","code_id","' + code_id + "")))).returns(MockResponse.new)
52
- result = Puppet::Resource::CapabilityFinder.find('production', code_id, Puppet::Resource.new('Cap', 'cap'))
53
- expect(result['host']).to eq('ahost')
50
+ describe "when query_puppetdb method is unavailable" do
51
+ before :each do
52
+ Puppet::Util::Puppetdb.stubs(:respond_to?).with(:query_puppetdb).returns false
53
+ end
54
+
55
+ it 'should call Puppet::Util::PuppetDB::Http.action' do
56
+ Puppet::Util::Puppetdb::Http.expects(:action).returns(response)
57
+ result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
58
+ expect(result['host']).to eq('ahost')
59
+ end
60
+
61
+ it 'should include code_id in query' do
62
+ code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
63
+ Puppet::Util::Puppetdb::Http.expects(:action).with(regexp_matches(Regexp.new(CGI.escape('"=","code_id","' + code_id + "")))).returns(response)
64
+ result = Puppet::Resource::CapabilityFinder.find('production', code_id, Puppet::Resource.new('Cap', 'cap'))
65
+ expect(result['host']).to eq('ahost')
66
+ end
54
67
  end
55
68
  end
56
69
  end
@@ -91,6 +91,17 @@ describe Puppet::Resource::Catalog, "when compiling" do
91
91
  expect(catalog.code_id).to be_nil
92
92
  end
93
93
 
94
+ it "should include a catalog_uuid" do
95
+ SecureRandom.stubs(:uuid).returns ("827a74c8-cf98-44da-9ff7-18c5e4bee41e")
96
+ catalog = Puppet::Resource::Catalog.new("host")
97
+ expect(catalog.catalog_uuid).to eq("827a74c8-cf98-44da-9ff7-18c5e4bee41e")
98
+ end
99
+
100
+ it "should include the current catalog_format" do
101
+ catalog = Puppet::Resource::Catalog.new("host")
102
+ expect(catalog.catalog_format).to eq(1)
103
+ end
104
+
94
105
  describe "when compiling" do
95
106
  it "should accept tags" do
96
107
  config = Puppet::Resource::Catalog.new("mynode")
@@ -268,6 +279,16 @@ describe Puppet::Resource::Catalog, "when compiling" do
268
279
  @original.code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
269
280
  expect(@original.filter.code_id).to eq(@original.code_id)
270
281
  end
282
+
283
+ it 'copies the catalog_uuid' do
284
+ @original.catalog_uuid = '827a74c8-cf98-44da-9ff7-18c5e4bee41e'
285
+ expect(@original.filter.catalog_uuid).to eq(@original.catalog_uuid)
286
+ end
287
+
288
+ it 'copies the catalog_format' do
289
+ @original.catalog_format = 42
290
+ expect(@original.filter.catalog_format).to eq(@original.catalog_format)
291
+ end
271
292
  end
272
293
 
273
294
  describe "when functioning as a resource container" do
@@ -799,7 +820,9 @@ describe Puppet::Resource::Catalog, "when converting to pson" do
799
820
 
800
821
  { :name => 'myhost',
801
822
  :version => 42,
802
- :code_id => 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
823
+ :code_id => 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe',
824
+ :catalog_uuid => '827a74c8-cf98-44da-9ff7-18c5e4bee41e',
825
+ :catalog_format => 42
803
826
  }.each do |param, value|
804
827
  it "emits a #{param} equal to #{value.inspect}" do
805
828
  @catalog.send(param.to_s + "=", value)
@@ -853,6 +876,8 @@ describe Puppet::Resource::Catalog, "when converting from pson" do
853
876
  it "should create it with the provided name" do
854
877
  @data['version'] = 50
855
878
  @data['code_id'] = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
879
+ @data['catalog_uuid'] = '827a74c8-cf98-44da-9ff7-18c5e4bee41e'
880
+ @data['catalog_format'] = 42
856
881
  @data['tags'] = %w{one two}
857
882
  @data['classes'] = %w{one two}
858
883
  @data['edges'] = [Puppet::Relationship.new("File[/foo]", "File[/bar]",
@@ -867,6 +892,8 @@ describe Puppet::Resource::Catalog, "when converting from pson" do
867
892
  expect(catalog.name).to eq('myhost')
868
893
  expect(catalog.version).to eq(@data['version'])
869
894
  expect(catalog.code_id).to eq(@data['code_id'])
895
+ expect(catalog.catalog_uuid).to eq(@data['catalog_uuid'])
896
+ expect(catalog.catalog_format).to eq(@data['catalog_format'])
870
897
  expect(catalog).to be_tagged("one")
871
898
  expect(catalog).to be_tagged("two")
872
899
 
@@ -878,6 +905,11 @@ describe Puppet::Resource::Catalog, "when converting from pson" do
878
905
  expect(catalog.edges[0].target).to eq(catalog.resource(:file, "/bar"))
879
906
  end
880
907
 
908
+ it "defaults the catalog_format to 0" do
909
+ catalog = Puppet::Resource::Catalog.from_data_hash PSON.parse @data.to_pson
910
+ expect(catalog.catalog_format).to eq(0)
911
+ end
912
+
881
913
  it "should fail if the source resource cannot be found" do
882
914
  @data['edges'] = [Puppet::Relationship.new("File[/missing]", "File[/bar]").to_data_hash]
883
915
  @data['resources'] = [Puppet::Resource.new(:file, "/bar").to_data_hash]