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
@@ -84,4 +84,12 @@ describe "Parameter passing" do
84
84
  MANIFEST
85
85
  end
86
86
  end
87
+
88
+ it "uses a given undef and do not require a default expression" do
89
+ expect_the_message_to_be(true) do <<-MANIFEST
90
+ define a(Optional[Integer] $x) { notify { 'something': message => $x == undef}}
91
+ a {'a': x => undef }
92
+ MANIFEST
93
+ end
94
+ end
87
95
  end
@@ -87,7 +87,7 @@ describe Puppet::Type.type(:yumrepo).provider(:inifile), '(integration)',
87
87
  properties = {"bandwidth" => "42M",
88
88
  "baseurl" => "http://er0ck",
89
89
  "cost" => "42",
90
- "enabled" => "YeS",
90
+ "enabled" => "Yes",
91
91
  "exclude" => "er0ckSet2.0",
92
92
  "failovermethod" => "roundrobin",
93
93
  "include" => "https://er0ck",
@@ -0,0 +1,28 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+
4
+ describe "Windows UTF8 environment variables", :if => Puppet.features.microsoft_windows? do
5
+ # The Puppet::Util::Windows::Process class is used to manipulate environment variables as it is known to handle UTF8 characters. Where as the implementation of ENV in ruby does not.
6
+ # before and end all are used to inject environment variables before the test helper 'before_each_test' function is called
7
+ # Do not use before and after hooks in these tests as it may have unintended consequences
8
+
9
+ before(:all) {
10
+ @varname = 'test-helper-foo'
11
+ @rune_utf8 = "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7"
12
+
13
+ Puppet::Util::Windows::Process.set_environment_variable(@varname, @rune_utf8)
14
+ }
15
+
16
+ it "#after_each_test should preserve UTF8 environment variables" do
17
+ envhash = Puppet::Util::Windows::Process.get_environment_strings
18
+ expect(envhash[@varname]).to eq(@rune_utf8)
19
+ # Change the value in the test to force test_helper to restore the environment
20
+ ENV[@varname] = 'bad foo'
21
+
22
+ # Prematurely trigger the after_each_test method
23
+ Puppet::Test::TestHelper.after_each_test
24
+
25
+ envhash = Puppet::Util::Windows::Process.get_environment_strings
26
+ expect(envhash[@varname]).to eq(@rune_utf8)
27
+ end
28
+ end
@@ -21,4 +21,20 @@ describe Puppet::Transaction::Report do
21
21
  Puppet::Transaction::Report.indirection.save(report)
22
22
  end
23
23
  end
24
+
25
+ describe "when dumping to YAML" do
26
+ it "should not contain TagSet objects" do
27
+ resource = Puppet::Resource.new(:notify, "Hello")
28
+ ral_resource = resource.to_ral
29
+ status = Puppet::Resource::Status.new(ral_resource)
30
+
31
+ log = Puppet::Util::Log.new(:level => :info, :message => "foo")
32
+
33
+ report = Puppet::Transaction::Report.new("apply")
34
+ report.add_resource_status(status)
35
+ report << log
36
+
37
+ expect(YAML.dump(report)).to_not match('Puppet::Util::TagSet')
38
+ end
39
+ end
24
40
  end
@@ -319,6 +319,17 @@ describe Puppet::Transaction do
319
319
  expect(Puppet::FileSystem.exist?(fname)).to be_falsey
320
320
  end
321
321
 
322
+ it "does not trigger skip-tagged resources" do
323
+ catalog = mk_catalog
324
+
325
+ Puppet[:skip_tags] = "skipme"
326
+ exec.tag("skipme")
327
+
328
+ catalog.add_resource(file, exec)
329
+ catalog.apply
330
+ expect(Puppet::FileSystem.exist?(fname)).to be_falsey
331
+ end
332
+
322
333
  it "does not trigger resources with failed dependencies" do
323
334
  catalog = mk_catalog
324
335
  file[:path] = make_absolute("/foo/bar/baz")
@@ -1226,6 +1226,7 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1226
1226
  :backup => false
1227
1227
  }
1228
1228
  end
1229
+
1229
1230
  describe "on POSIX systems", :if => Puppet.features.posix? do
1230
1231
  it "should apply the source metadata values" do
1231
1232
  @options[:source_permissions] = :use
@@ -1260,6 +1261,102 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1260
1261
  end
1261
1262
 
1262
1263
  let(:source) { tmpfile_with_contents("source_default_values", "yay") }
1264
+
1265
+ describe "from http" do
1266
+ let(:http_source) { "http://my-server/file" }
1267
+ let(:httppath) { "#{path}http" }
1268
+
1269
+ context "using mtime", :vcr => true do
1270
+ let(:resource) do
1271
+ described_class.new(
1272
+ :path => httppath,
1273
+ :ensure => :file,
1274
+ :source => http_source,
1275
+ :backup => false,
1276
+ :checksum => :mtime
1277
+ )
1278
+ end
1279
+
1280
+ it "should fetch if not on the local disk" do
1281
+ catalog.add_resource resource
1282
+ catalog.apply
1283
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1284
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1285
+ end
1286
+
1287
+ # The fixture has neither last-modified nor content-checksum headers.
1288
+ # Such upstream ressources are treated as "really fresh" and get
1289
+ # downloaded during every run.
1290
+ it "should fetch if no header specified" do
1291
+ File.open(httppath, "wb") { |f| f.puts "Content originally on disk\n" }
1292
+ # make sure the mtime is not "right now", lest we get a race
1293
+ FileUtils.touch httppath, :mtime => Time.parse("Sun, 22 Mar 2015 22:57:43 GMT")
1294
+ catalog.add_resource resource
1295
+ catalog.apply
1296
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1297
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1298
+ end
1299
+
1300
+ it "should fetch if mtime is older on disk" do
1301
+ File.open(httppath, "wb") { |f| f.puts "Content originally on disk\n" }
1302
+ # fixture has Last-Modified: Sun, 22 Mar 2015 22:25:34 GMT
1303
+ FileUtils.touch httppath, :mtime => Time.parse("Sun, 22 Mar 2015 22:22:34 GMT")
1304
+ catalog.add_resource resource
1305
+ catalog.apply
1306
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1307
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1308
+ end
1309
+
1310
+ it "should not update if mtime is newer on disk" do
1311
+ File.open(httppath, "wb") { |f| f.puts "Content via HTTP\n" }
1312
+ mtime = File.stat(httppath).mtime
1313
+ catalog.add_resource resource
1314
+ catalog.apply
1315
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1316
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1317
+ expect(File.stat(httppath).mtime).to eq mtime
1318
+ end
1319
+ end
1320
+
1321
+ context "using md5", :vcr => true do
1322
+ let(:resource) do
1323
+ described_class.new(
1324
+ :path => httppath,
1325
+ :ensure => :file,
1326
+ :source => http_source,
1327
+ :backup => false,
1328
+ )
1329
+ end
1330
+
1331
+ it "should fetch if not on the local disk" do
1332
+ catalog.add_resource resource
1333
+ catalog.apply
1334
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1335
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1336
+ end
1337
+
1338
+ it "should update if content differs on disk" do
1339
+ File.open(httppath, "wb") { |f| f.puts "Content originally on disk\n" }
1340
+ catalog.add_resource resource
1341
+ catalog.apply
1342
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1343
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1344
+ end
1345
+
1346
+ it "should not update if content on disk is up-to-date" do
1347
+ File.open(httppath, "wb") { |f| f.puts "Content via HTTP\n" }
1348
+ disk_mtime = Time.parse("Sun, 22 Mar 2015 22:22:34 GMT")
1349
+ FileUtils.touch httppath, :mtime => disk_mtime
1350
+ catalog.add_resource resource
1351
+ catalog.apply
1352
+ expect(Puppet::FileSystem.exist?(httppath)).to be_truthy
1353
+ expect(File.read(httppath)).to eq "Content via HTTP\n"
1354
+ expect(File.stat(httppath).mtime).to eq disk_mtime
1355
+ end
1356
+
1357
+ end
1358
+ end
1359
+
1263
1360
  describe "on Windows systems", :if => Puppet.features.microsoft_windows? do
1264
1361
  def expects_sid_granted_full_access_explicitly(path, sid)
1265
1362
  inherited_ace = Puppet::Util::Windows::AccessControlEntry::INHERITED_ACE
@@ -1297,11 +1394,11 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1297
1394
  before do
1298
1395
  @sids = {
1299
1396
  :current_user => Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_user_name),
1300
- :system => Win32::Security::SID::LocalSystem,
1397
+ :system => Puppet::Util::Windows::SID::LocalSystem,
1301
1398
  :guest => Puppet::Util::Windows::SID.name_to_sid("Guest"),
1302
- :users => Win32::Security::SID::BuiltinUsers,
1303
- :power_users => Win32::Security::SID::PowerUsers,
1304
- :none => Win32::Security::SID::Nobody
1399
+ :users => Puppet::Util::Windows::SID::BuiltinUsers,
1400
+ :power_users => Puppet::Util::Windows::SID::PowerUsers,
1401
+ :none => Puppet::Util::Windows::SID::Nobody
1305
1402
  }
1306
1403
  end
1307
1404
 
@@ -1690,4 +1787,97 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
1690
1787
  end
1691
1788
  end
1692
1789
  end
1790
+
1791
+ [:md5, :sha256, :md5lite, :sha256lite].each do |checksum|
1792
+ describe "setting checksum_value explicitly with checksum #{checksum}" do
1793
+ let(:path) { tmpfile('target') }
1794
+ let(:contents) { 'yay' }
1795
+
1796
+ before :each do
1797
+ @options = {
1798
+ :path => path,
1799
+ :ensure => :file,
1800
+ :checksum => checksum,
1801
+ :checksum_value => Puppet::Util::Checksums.send(checksum, contents)
1802
+ }
1803
+ end
1804
+
1805
+ def verify_file(transaction)
1806
+ status = transaction.report.resource_statuses["File[#{path}]"]
1807
+ expect(status).not_to be_failed
1808
+ expect(Puppet::FileSystem).to be_file(path)
1809
+ expect(File.read(path)).to eq(contents)
1810
+ status
1811
+ end
1812
+
1813
+ [:source, :content].each do |prop|
1814
+ context "from #{prop}" do
1815
+ let(:source) { tmpfile_with_contents("source_default_values", contents) }
1816
+
1817
+ before :each do
1818
+ @options[prop] = {:source => source, :content => contents}[prop]
1819
+ end
1820
+
1821
+ it "should create a new file" do
1822
+ catalog.add_resource described_class.new(@options)
1823
+ status = verify_file catalog.apply
1824
+ expect(status).to be_changed
1825
+ end
1826
+
1827
+ it "should overwrite an existing file" do
1828
+ File.open(path, "w") { |f| f.write('bar') }
1829
+ catalog.add_resource described_class.new(@options)
1830
+ status = verify_file catalog.apply
1831
+ expect(status).to be_changed
1832
+ end
1833
+
1834
+ it "should not overwrite the same file" do
1835
+ File.open(path, "w") { |f| f.write(contents) }
1836
+ catalog.add_resource described_class.new(@options)
1837
+ status = verify_file catalog.apply
1838
+ expect(status).to_not be_changed
1839
+ end
1840
+
1841
+ it "should not create a file when ensuring absent" do
1842
+ @options[:ensure] = :absent
1843
+ catalog.add_resource described_class.new(@options)
1844
+ catalog.apply
1845
+ expect(Puppet::FileSystem).to_not be_file(path)
1846
+ end
1847
+ end
1848
+ end
1849
+ end
1850
+ end
1851
+
1852
+ describe "setting checksum_value explicitly with checksum mtime" do
1853
+ let(:path) { tmpfile('target_dir') }
1854
+ let(:time) { Time.now }
1855
+
1856
+ before :each do
1857
+ @options = {
1858
+ :path => path,
1859
+ :ensure => :directory,
1860
+ :checksum => :mtime,
1861
+ :checksum_value => time
1862
+ }
1863
+ end
1864
+
1865
+ it "should create a new directory" do
1866
+ catalog.add_resource described_class.new(@options)
1867
+ status = catalog.apply.report.resource_statuses["File[#{path}]"]
1868
+ expect(status).not_to be_failed
1869
+ expect(status).to be_changed
1870
+ expect(Puppet::FileSystem).to be_directory(path)
1871
+ end
1872
+
1873
+ it "should not update mtime on an old directory" do
1874
+ disk_mtime = Time.parse("Sun, 22 Mar 2015 22:22:34 GMT")
1875
+ FileUtils.mkdir_p path
1876
+ FileUtils.touch path, :mtime => disk_mtime
1877
+ status = catalog.apply.report.resource_statuses["File[#{path}]"]
1878
+ expect(status).to be_nil
1879
+ expect(Puppet::FileSystem).to be_directory(path)
1880
+ expect(File.stat(path).mtime).to eq(disk_mtime)
1881
+ end
1882
+ end
1693
1883
  end
@@ -28,7 +28,11 @@ describe Puppet::Type.type(:package), "when choosing a default package provider"
28
28
  :yum
29
29
  end
30
30
  when 'Fedora'
31
- :yum
31
+ if Puppet::Util::Package.versioncmp(Facter.value(:operatingsystemmajrelease), '22') >= 0
32
+ :dnf
33
+ else
34
+ :yum
35
+ end
32
36
  when 'FreeBSD'
33
37
  :ports
34
38
  when 'OpenBSD'
@@ -1,16 +1,32 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
 
4
+ require 'puppet_spec/compiler'
4
5
  require 'puppet_spec/files'
5
6
  require 'puppet/file_bucket/dipper'
6
7
 
7
8
  describe Puppet::Type.type(:tidy) do
8
9
  include PuppetSpec::Files
10
+ include PuppetSpec::Compiler
9
11
 
10
12
  before do
11
13
  Puppet::Util::Storage.stubs(:store)
12
14
  end
13
15
 
16
+ it "should be able to recursively remove directories" do
17
+ dir = tmpfile("tidy_testing")
18
+ FileUtils.mkdir_p(File.join(dir, "foo", "bar"))
19
+
20
+ apply_compiled_manifest(<<-MANIFEST)
21
+ tidy { '#{dir}':
22
+ recurse => true,
23
+ rmdirs => true,
24
+ }
25
+ MANIFEST
26
+
27
+ expect(Puppet::FileSystem.directory?(dir)).to be_falsey
28
+ end
29
+
14
30
  # Testing #355.
15
31
  it "should be able to remove dead links", :if => Puppet.features.manages_symlinks? do
16
32
  dir = tmpfile("tidy_link_testing")
@@ -19,15 +35,11 @@ describe Puppet::Type.type(:tidy) do
19
35
  Dir.mkdir(dir)
20
36
  Puppet::FileSystem.symlink(target, link)
21
37
 
22
- tidy = Puppet::Type.type(:tidy).new :path => dir, :recurse => true
23
-
24
- catalog = Puppet::Resource::Catalog.new
25
- catalog.add_resource(tidy)
26
- # avoid crude failures because of nil resources that result
27
- # from implicit containment and lacking containers
28
- catalog.stubs(:container_of).returns tidy
29
-
30
- catalog.apply
38
+ apply_compiled_manifest(<<-MANIFEST)
39
+ tidy { '#{dir}':
40
+ recurse => true,
41
+ }
42
+ MANIFEST
31
43
 
32
44
  expect(Puppet::FileSystem.symlink?(link)).to be_falsey
33
45
  end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Puppet::Util::Execution do
4
+ include PuppetSpec::Files
5
+
4
6
  describe "#execpipe" do
5
7
  it "should set LANG to C avoid localized output", :if => !Puppet.features.microsoft_windows? do
6
8
  out = ""
@@ -14,4 +16,24 @@ describe Puppet::Util::Execution do
14
16
  expect(out).to eq("C")
15
17
  end
16
18
  end
19
+
20
+ describe "#execute (Windows)", :if => Puppet.features.microsoft_windows? do
21
+ let(:utf8text) do
22
+ # Japanese Lorem Ipsum snippet
23
+ "utf8testfile" + [227, 131, 171, 227, 131, 147, 227, 131, 179, 227, 131, 132, 227,
24
+ 130, 162, 227, 130, 166, 227, 130, 167, 227, 131, 150, 227, 130,
25
+ 162, 227, 129, 181, 227, 129, 185, 227, 129, 139, 227, 130, 137,
26
+ 227, 129, 154, 227, 130, 187, 227, 130, 183, 227, 131, 147, 227,
27
+ 131, 170, 227, 131, 134].pack('c*').force_encoding(Encoding::UTF_8)
28
+ end
29
+ let(:temputf8filename) do
30
+ script_containing(utf8text, :windows => "@ECHO OFF\nECHO #{utf8text}\nEXIT 100")
31
+ end
32
+
33
+ it "should execute with non-english characters in command line" do
34
+ result = Puppet::Util::Execution.execute("cmd /c \"#{temputf8filename}\"", :failonfail => false)
35
+ expect(temputf8filename.encoding.name).to eq('UTF-8')
36
+ expect(result.exitstatus).to eq(100)
37
+ end
38
+ end
17
39
  end
@@ -15,7 +15,15 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft
15
15
  expect(principal.sid).to eq('S-1-5-18')
16
16
  expect(principal.domain).to eq('NT AUTHORITY')
17
17
  expect(principal.domain_account).to eq('NT AUTHORITY\\SYSTEM')
18
- expect(principal.account_type).to eq(:SidTypeWellKnownGroup)
18
+
19
+ # Windows API LookupAccountSid behaves differently if current user is SYSTEM
20
+ if Puppet::Util::Windows::ADSI::User.current_user_name != 'SYSTEM'
21
+ account_type = :SidTypeWellKnownGroup
22
+ else
23
+ account_type = :SidTypeUser
24
+ end
25
+
26
+ expect(principal.account_type).to eq(account_type)
19
27
  end
20
28
 
21
29
  it "should create an instance from a well-known account prefixed with NT AUTHORITY" do
@@ -25,7 +33,15 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft
25
33
  expect(principal.sid).to eq('S-1-5-18')
26
34
  expect(principal.domain).to eq('NT AUTHORITY')
27
35
  expect(principal.domain_account).to eq('NT AUTHORITY\\SYSTEM')
28
- expect(principal.account_type).to eq(:SidTypeWellKnownGroup)
36
+
37
+ # Windows API LookupAccountSid behaves differently if current user is SYSTEM
38
+ if Puppet::Util::Windows::ADSI::User.current_user_name != 'SYSTEM'
39
+ account_type = :SidTypeWellKnownGroup
40
+ else
41
+ account_type = :SidTypeUser
42
+ end
43
+
44
+ expect(principal.account_type).to eq(account_type)
29
45
  end
30
46
 
31
47
  it "should create an instance from a local account prefixed with hostname" do
@@ -65,6 +81,25 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft
65
81
  principal.lookup_account_name('ConanTheBarbarian')
66
82
  }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountNameW/)
67
83
  end
84
+
85
+ it "should return a BUILTIN domain principal for empty account names" do
86
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('')
87
+ expect(principal.account_type).to eq(:SidTypeDomain)
88
+ expect(principal.sid).to eq('S-1-5-32')
89
+ expect(principal.account).to eq('BUILTIN')
90
+ expect(principal.domain).to eq('BUILTIN')
91
+ expect(principal.domain_account).to eq('BUILTIN')
92
+ end
93
+
94
+ it "should return a BUILTIN domain principal for BUILTIN account names" do
95
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('BUILTIN')
96
+ expect(principal.account_type).to eq(:SidTypeDomain)
97
+ expect(principal.sid).to eq('S-1-5-32')
98
+ expect(principal.account).to eq('BUILTIN')
99
+ expect(principal.domain).to eq('BUILTIN')
100
+ expect(principal.domain_account).to eq('BUILTIN')
101
+ end
102
+
68
103
  end
69
104
 
70
105
  describe ".lookup_account_sid" do
@@ -77,7 +112,6 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft
77
112
  expect(principal.domain_account).to eq('NT AUTHORITY\\SYSTEM')
78
113
 
79
114
  # Windows API LookupAccountSid behaves differently if current user is SYSTEM
80
- # even though LookupAccountName does not demonstrate same behavior
81
115
  if Puppet::Util::Windows::ADSI::User.current_user_name != 'SYSTEM'
82
116
  account_type = :SidTypeWellKnownGroup
83
117
  else
@@ -97,10 +131,34 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft
97
131
  expect(principal.account_type).to eq(:SidTypeAlias)
98
132
  end
99
133
 
100
- it "should raise an error when trying to lookup completely invalid SID bytes" do
134
+ it "should raise an error when trying to lookup nil" do
135
+ principal = Puppet::Util::Windows::SID::Principal
136
+ expect {
137
+ principal.lookup_account_sid(nil)
138
+ }.to raise_error(Puppet::Util::Windows::Error, /must not be nil/)
139
+ end
140
+
141
+ it "should raise an error when trying to lookup non-byte array" do
142
+ principal = Puppet::Util::Windows::SID::Principal
143
+ expect {
144
+ principal.lookup_account_sid('ConanTheBarbarian')
145
+ }.to raise_error(Puppet::Util::Windows::Error, /array/)
146
+ end
147
+
148
+ it "should raise an error when trying to lookup an empty array" do
101
149
  principal = Puppet::Util::Windows::SID::Principal
102
150
  expect {
103
151
  principal.lookup_account_sid([])
152
+ }.to raise_error(Puppet::Util::Windows::Error, /at least 1 byte long/)
153
+ end
154
+
155
+ # https://technet.microsoft.com/en-us/library/cc962011.aspx
156
+ # "... The structure used in all SIDs created by Windows NT and Windows 2000 is revision level 1. ..."
157
+ # Therefore a value of zero for the revision, is not a valid SID
158
+ it "should raise an error when trying to lookup completely invalid SID bytes" do
159
+ principal = Puppet::Util::Windows::SID::Principal
160
+ expect {
161
+ principal.lookup_account_sid([0])
104
162
  }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountSidW: The parameter is incorrect/)
105
163
  end
106
164
 
@@ -111,5 +169,33 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet.features.microsoft
111
169
  principal.lookup_account_sid([1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0])
112
170
  }.to raise_error(Puppet::Util::Windows::Error, /Failed to call LookupAccountSidW: No mapping between account names and security IDs was done/)
113
171
  end
172
+
173
+ it "should return a domain principal for BUILTIN SID S-1-5-32" do
174
+ principal = Puppet::Util::Windows::SID::Principal.lookup_account_sid([1, 1, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0])
175
+ expect(principal.account_type).to eq(:SidTypeDomain)
176
+ expect(principal.sid).to eq('S-1-5-32')
177
+ expect(principal.account).to eq('BUILTIN')
178
+ expect(principal.domain).to eq('BUILTIN')
179
+ expect(principal.domain_account).to eq('BUILTIN')
180
+ end
181
+ end
182
+
183
+ describe "it should create matching Principal objects" do
184
+ let(:builtin_sid) { [1, 1, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0] }
185
+ let(:sid_principal) { Puppet::Util::Windows::SID::Principal.lookup_account_sid(builtin_sid) }
186
+
187
+ ['.', 'builtin', ''].each do |name|
188
+ it "when comparing the one looked up via SID S-1-5-32 to one looked up via non-canonical name #{name} for the BUILTIN domain" do
189
+ name_principal = Puppet::Util::Windows::SID::Principal.lookup_account_name(name)
190
+
191
+ # compares canonical sid
192
+ expect(sid_principal).to eq(name_principal)
193
+
194
+ # compare all properties that have public accessors
195
+ sid_principal.public_methods(false).reject { |m| m == :== }.each do |method|
196
+ expect(sid_principal.send(method)).to eq(name_principal.send(method))
197
+ end
198
+ end
199
+ end
114
200
  end
115
201
  end