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
@@ -31,4 +31,35 @@ describe "Puppet::Util::Windows::Process", :if => Puppet.features.microsoft_wind
31
31
  expect { Puppet::Util::Windows::Process.lookup_privilege_value('foo') }.to raise_error(Puppet::Util::Windows::Error, fail_msg)
32
32
  end
33
33
  end
34
+
35
+ describe "when setting environment variables" do
36
+ it "can properly handle env var values with = in them" do
37
+ begin
38
+ name = SecureRandom.uuid
39
+ value = 'foo=bar'
40
+
41
+ Puppet::Util::Windows::Process.set_environment_variable(name, value)
42
+
43
+ env = Puppet::Util::Windows::Process.get_environment_strings
44
+
45
+ expect(env[name]).to eq(value)
46
+ ensure
47
+ Puppet::Util::Windows::Process.set_environment_variable(name, nil)
48
+ end
49
+ end
50
+
51
+ it "can properly handle empty env var values" do
52
+ begin
53
+ name = SecureRandom.uuid
54
+
55
+ Puppet::Util::Windows::Process.set_environment_variable(name, '')
56
+
57
+ env = Puppet::Util::Windows::Process.get_environment_strings
58
+
59
+ expect(env[name]).to eq('')
60
+ ensure
61
+ Puppet::Util::Windows::Process.set_environment_variable(name, nil)
62
+ end
63
+ end
64
+ end
34
65
  end
@@ -14,13 +14,13 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
14
14
  before :all do
15
15
  @sids = {
16
16
  :current_user => Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_user_name),
17
- :system => Win32::Security::SID::LocalSystem,
18
- :administrators => Win32::Security::SID::BuiltinAdministrators,
17
+ :system => Puppet::Util::Windows::SID::LocalSystem,
18
+ :administrators => Puppet::Util::Windows::SID::BuiltinAdministrators,
19
19
  :guest => Puppet::Util::Windows::SID.name_to_sid("Guest"),
20
- :users => Win32::Security::SID::BuiltinUsers,
21
- :power_users => Win32::Security::SID::PowerUsers,
22
- :none => Win32::Security::SID::Nobody,
23
- :everyone => Win32::Security::SID::Everyone
20
+ :users => Puppet::Util::Windows::SID::BuiltinUsers,
21
+ :power_users => Puppet::Util::Windows::SID::PowerUsers,
22
+ :none => Puppet::Util::Windows::SID::Nobody,
23
+ :everyone => Puppet::Util::Windows::SID::Everyone
24
24
  }
25
25
  # The TCP/IP NetBIOS Helper service (aka 'lmhosts') has ended up
26
26
  # disabled on some VMs for reasons we couldn't track down. This
@@ -67,7 +67,7 @@ describe "Puppet::Util::Windows::User", :if => Puppet.features.microsoft_windows
67
67
  yield
68
68
  }.to raise_error { |error|
69
69
  expect(error).to be_a(Puppet::Util::Windows::Error)
70
- # http://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx
70
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx
71
71
  # ERROR_LOGON_FAILURE 1326
72
72
  expect(error.code).to eq(1326)
73
73
  }
@@ -27,9 +27,10 @@ describe Puppet::Util do
27
27
  expect { Puppet::Util::Execution.execute(command) }.to raise_error(Puppet::ExecutionFailure, /Execution of '#{command}' returned 43: /)
28
28
  expect($CHILD_STATUS.exitstatus).to eq(43)
29
29
  end
30
+ end
30
31
 
31
- it "replace_file should preserve original ACEs from existing replaced file on Windows",
32
- :if => Puppet.features.microsoft_windows? do
32
+ describe "#replace_file on Windows", :if => Puppet.features.microsoft_windows? do
33
+ it "replace_file should preserve original ACEs from existing replaced file on Windows" do
33
34
 
34
35
  file = tmpfile("somefile")
35
36
  FileUtils.touch(file)
@@ -54,8 +55,7 @@ describe Puppet::Util do
54
55
  expect(replaced_sd.dacl).to eq(expected_sd.dacl)
55
56
  end
56
57
 
57
- it "replace_file should use reasonable default ACEs on a new file on Windows",
58
- :if => Puppet.features.microsoft_windows? do
58
+ it "replace_file should use reasonable default ACEs on a new file on Windows" do
59
59
 
60
60
  dir = tmpdir('DACL_playground')
61
61
  protected_sd = Puppet::Util::Windows::Security.get_security_descriptor(dir)
@@ -76,36 +76,58 @@ describe Puppet::Util do
76
76
 
77
77
  expect(new_sd.dacl).to eq(expected_sd.dacl)
78
78
  end
79
- end
80
79
 
81
- it "replace_file should work with filenames that include - and . (PUP-1389)", :if => Puppet.features.microsoft_windows? do
82
- expected_content = 'some content'
83
- dir = tmpdir('ReplaceFile_playground')
84
- destination_file = File.join(dir, 'some-file.xml')
80
+ it "replace_file should work with filenames that include - and . (PUP-1389)" do
81
+ expected_content = 'some content'
82
+ dir = tmpdir('ReplaceFile_playground')
83
+ destination_file = File.join(dir, 'some-file.xml')
84
+
85
+ Puppet::Util.replace_file(destination_file, nil) do |temp_file|
86
+ temp_file.open
87
+ temp_file.write(expected_content)
88
+ end
85
89
 
86
- Puppet::Util.replace_file(destination_file, nil) do |temp_file|
87
- temp_file.open
88
- temp_file.write(expected_content)
90
+ actual_content = File.read(destination_file)
91
+ expect(actual_content).to eq(expected_content)
89
92
  end
90
93
 
91
- actual_content = File.read(destination_file)
92
- expect(actual_content).to eq(expected_content)
94
+ it "replace_file should work with filenames that include special characters (PUP-1389)" do
95
+ expected_content = 'some content'
96
+ dir = tmpdir('ReplaceFile_playground')
97
+ # http://www.fileformat.info/info/unicode/char/00e8/index.htm
98
+ # dest_name = "somèfile.xml"
99
+ dest_name = "som\u00E8file.xml"
100
+ destination_file = File.join(dir, dest_name)
101
+
102
+ Puppet::Util.replace_file(destination_file, nil) do |temp_file|
103
+ temp_file.open
104
+ temp_file.write(expected_content)
105
+ end
106
+
107
+ actual_content = File.read(destination_file)
108
+ expect(actual_content).to eq(expected_content)
109
+ end
93
110
  end
94
111
 
95
- it "replace_file should work with filenames that include special characters (PUP-1389)", :if => Puppet.features.microsoft_windows? do
96
- expected_content = 'some content'
97
- dir = tmpdir('ReplaceFile_playground')
98
- # http://www.fileformat.info/info/unicode/char/00e8/index.htm
99
- # dest_name = "somèfile.xml"
100
- dest_name = "som\u00E8file.xml"
101
- destination_file = File.join(dir, dest_name)
102
-
103
- Puppet::Util.replace_file(destination_file, nil) do |temp_file|
104
- temp_file.open
105
- temp_file.write(expected_content)
112
+ describe "#which on Windows", :if => Puppet.features.microsoft_windows? do
113
+ let (: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" }
114
+ let (:filename) { 'foo.exe' }
115
+ let (:filepath) { File.expand_path('C:\\' + rune_utf8 + '\\' + filename) }
116
+
117
+ before :each do
118
+ FileTest.stubs(:file?).returns false
119
+ FileTest.stubs(:file?).with(filepath).returns true
120
+
121
+ FileTest.stubs(:executable?).returns false
122
+ FileTest.stubs(:executable?).with(filepath).returns true
106
123
  end
107
124
 
108
- actual_content = File.read(destination_file)
109
- expect(actual_content).to eq(expected_content)
125
+ it "should be able to use UTF8 characters in the path" do
126
+ path = "C:\\" + rune_utf8 + "#{File::PATH_SEPARATOR}c:\\windows\\system32#{File::PATH_SEPARATOR}c:\\windows"
127
+ Puppet::Util.withenv( { "PATH" => path } , :windows) do
128
+ expect(Puppet::Util.which(filename)).to eq(filepath)
129
+ end
130
+ end
110
131
  end
132
+
111
133
  end
@@ -46,4 +46,21 @@ module PuppetSpec::Compiler
46
46
  relationships.traverse { |resource| order_seen << resource.ref }
47
47
  order_seen
48
48
  end
49
+
50
+ def collect_notices(code, node = Puppet::Node.new('foonode'))
51
+ Puppet[:code] = code
52
+ compiler = Puppet::Parser::Compiler.new(node)
53
+ logs = []
54
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
55
+ yield(compiler)
56
+ end
57
+ logs = logs.select { |log| log.level == :notice }.map { |log| log.message }
58
+ logs
59
+ end
60
+
61
+ def eval_and_collect_notices(code, node = Puppet::Node.new('foonode'))
62
+ collect_notices(code, node) do |compiler|
63
+ compiler.compile
64
+ end
65
+ end
49
66
  end
@@ -28,7 +28,7 @@ module PuppetSpec::Files
28
28
  def self.tmpfile(name, dir = nil)
29
29
  # Generate a temporary file, just for the name...
30
30
  source = dir ? Tempfile.new(name, dir) : Tempfile.new(name)
31
- path = source.path
31
+ path = source.path.encode(Encoding::UTF_8)
32
32
  source.close!
33
33
 
34
34
  record_tmp(File.expand_path(path))
@@ -59,7 +59,7 @@ module PuppetSpec::Files
59
59
 
60
60
  def tmpdir(name) PuppetSpec::Files.tmpdir(name) end
61
61
  def self.tmpdir(name)
62
- dir = Dir.mktmpdir(name)
62
+ dir = Dir.mktmpdir(name).encode!(Encoding::UTF_8)
63
63
 
64
64
  record_tmp(dir)
65
65
 
@@ -13,4 +13,17 @@ module PuppetSpec::Pops
13
13
  "expected Acceptor[#{actual.diagnostics.collect { |i| i.issue.issue_code }.join(',')}] to not contain issue #{expected.issue_code}"
14
14
  end
15
15
  end
16
+
17
+ # Checks if an Acceptor has any issues
18
+ matcher :have_any_issues do
19
+ match do |actual|
20
+ !actual.diagnostics.empty?
21
+ end
22
+ failure_message do |actual|
23
+ 'expected Acceptor[] to contain at least one issue'
24
+ end
25
+ failure_message_when_negated do |actual|
26
+ "expected Acceptor[#{actual.diagnostics.collect { |i| i.issue.issue_code }.join(',')}] to not contain any issues"
27
+ end
28
+ end
16
29
  end
@@ -16,7 +16,7 @@ shared_examples_for 'all iterative functions argument checks' do |func|
16
16
  compile_to_catalog(<<-MANIFEST)
17
17
  3.14.#{func} |$k, $v| { }
18
18
  MANIFEST
19
- end.to raise_error(Puppet::Error, /must be something enumerable/)
19
+ end.to raise_error(Puppet::Error, /expects an Iterable value, got Float/)
20
20
  end
21
21
 
22
22
  it 'raises an error when called with any parameters besides a block' do
@@ -0,0 +1,96 @@
1
+ shared_context 'types_setup' do
2
+
3
+ # Do not include the special type Unit in this list
4
+ def all_types
5
+ [ Puppet::Pops::Types::PAnyType,
6
+ Puppet::Pops::Types::PUndefType,
7
+ Puppet::Pops::Types::PNotUndefType,
8
+ Puppet::Pops::Types::PDataType,
9
+ Puppet::Pops::Types::PScalarType,
10
+ Puppet::Pops::Types::PStringType,
11
+ Puppet::Pops::Types::PNumericType,
12
+ Puppet::Pops::Types::PIntegerType,
13
+ Puppet::Pops::Types::PFloatType,
14
+ Puppet::Pops::Types::PRegexpType,
15
+ Puppet::Pops::Types::PBooleanType,
16
+ Puppet::Pops::Types::PCollectionType,
17
+ Puppet::Pops::Types::PArrayType,
18
+ Puppet::Pops::Types::PHashType,
19
+ Puppet::Pops::Types::PIterableType,
20
+ Puppet::Pops::Types::PIteratorType,
21
+ Puppet::Pops::Types::PRuntimeType,
22
+ Puppet::Pops::Types::PHostClassType,
23
+ Puppet::Pops::Types::PResourceType,
24
+ Puppet::Pops::Types::PPatternType,
25
+ Puppet::Pops::Types::PEnumType,
26
+ Puppet::Pops::Types::PVariantType,
27
+ Puppet::Pops::Types::PStructType,
28
+ Puppet::Pops::Types::PTupleType,
29
+ Puppet::Pops::Types::PCallableType,
30
+ Puppet::Pops::Types::PType,
31
+ Puppet::Pops::Types::POptionalType,
32
+ Puppet::Pops::Types::PDefaultType,
33
+ Puppet::Pops::Types::PTypeReferenceType,
34
+ Puppet::Pops::Types::PTypeAliasType,
35
+ ]
36
+ end
37
+
38
+ def scalar_types
39
+ # PVariantType is also scalar, if its types are all Scalar
40
+ [
41
+ Puppet::Pops::Types::PScalarType,
42
+ Puppet::Pops::Types::PStringType,
43
+ Puppet::Pops::Types::PNumericType,
44
+ Puppet::Pops::Types::PIntegerType,
45
+ Puppet::Pops::Types::PFloatType,
46
+ Puppet::Pops::Types::PRegexpType,
47
+ Puppet::Pops::Types::PBooleanType,
48
+ Puppet::Pops::Types::PPatternType,
49
+ Puppet::Pops::Types::PEnumType,
50
+ ]
51
+ end
52
+
53
+ def numeric_types
54
+ # PVariantType is also numeric, if its types are all numeric
55
+ [
56
+ Puppet::Pops::Types::PNumericType,
57
+ Puppet::Pops::Types::PIntegerType,
58
+ Puppet::Pops::Types::PFloatType,
59
+ ]
60
+ end
61
+
62
+ def string_types
63
+ # PVariantType is also string type, if its types are all compatible
64
+ [
65
+ Puppet::Pops::Types::PStringType,
66
+ Puppet::Pops::Types::PPatternType,
67
+ Puppet::Pops::Types::PEnumType,
68
+ ]
69
+ end
70
+
71
+ def collection_types
72
+ # PVariantType is also string type, if its types are all compatible
73
+ [
74
+ Puppet::Pops::Types::PCollectionType,
75
+ Puppet::Pops::Types::PHashType,
76
+ Puppet::Pops::Types::PArrayType,
77
+ Puppet::Pops::Types::PStructType,
78
+ Puppet::Pops::Types::PTupleType,
79
+ ]
80
+ end
81
+
82
+ def data_compatible_types
83
+ result = scalar_types
84
+ result << Puppet::Pops::Types::PDataType
85
+ result << array_t(types::PDataType::DEFAULT)
86
+ result << types::TypeFactory.hash_of_data
87
+ result << Puppet::Pops::Types::PUndefType
88
+ result << not_undef_t(types::PDataType.new)
89
+ result << constrained_tuple_t(range_t(0, nil), types::PDataType::DEFAULT)
90
+ result
91
+ end
92
+
93
+ def type_from_class(c)
94
+ c.is_a?(Class) ? c::DEFAULT : c
95
+ end
96
+ end
@@ -1,6 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet/agent'
4
+ require 'puppet/configurer'
4
5
 
5
6
  class AgentTestClient
6
7
  def run
@@ -343,12 +343,22 @@ describe Puppet::Application::Agent do
343
343
 
344
344
  it "should not set catalog cache class if :catalog_cache_terminus is explicitly nil" do
345
345
  Puppet[:catalog_cache_terminus] = nil
346
+ Puppet::Resource::Catalog.indirection.unstub(:cache_class=)
346
347
  Puppet::Resource::Catalog.indirection.expects(:cache_class=).never
347
348
 
348
349
  @puppetd.initialize_app_defaults
349
350
  @puppetd.setup
350
351
  end
351
352
 
353
+ it "should set catalog cache class to nil during a noop run" do
354
+ Puppet[:catalog_cache_terminus] = "json"
355
+ Puppet[:noop] = true
356
+ Puppet::Resource::Catalog.indirection.expects(:cache_class=).with(nil)
357
+
358
+ @puppetd.initialize_app_defaults
359
+ @puppetd.setup
360
+ end
361
+
352
362
  it "should default facts_terminus setting to 'facter'" do
353
363
  @puppetd.initialize_app_defaults
354
364
  expect(Puppet[:facts_terminus]).to eq(:facter)
@@ -478,4 +478,13 @@ describe Puppet::Application::Apply do
478
478
  @apply.initialize_app_defaults
479
479
  @apply.setup
480
480
  end
481
+
482
+ it "should set catalog cache class to nil during a noop run" do
483
+ Puppet[:catalog_cache_terminus] = "json"
484
+ Puppet[:noop] = true
485
+ Puppet::Resource::Catalog.indirection.expects(:cache_class=).with(nil)
486
+
487
+ @apply.initialize_app_defaults
488
+ @apply.setup
489
+ end
481
490
  end
@@ -82,13 +82,13 @@ describe Puppet::Configurer::Downloader do
82
82
  expect(file[:source_permissions]).to eq(:ignore)
83
83
  end
84
84
 
85
- it "should allow source_permissions to be overridden" do
86
- file = generate_file_resource(:source_permissions => :use)
85
+ describe "on POSIX", :if => Puppet.features.posix? do
86
+ it "should allow source_permissions to be overridden" do
87
+ file = generate_file_resource(:source_permissions => :use)
87
88
 
88
- expect(file[:source_permissions]).to eq(:use)
89
- end
89
+ expect(file[:source_permissions]).to eq(:use)
90
+ end
90
91
 
91
- describe "on POSIX", :if => Puppet.features.posix? do
92
92
  it "should always set the owner to the current UID" do
93
93
  Process.expects(:uid).returns 51
94
94
 
@@ -369,12 +369,34 @@ describe Puppet::Configurer do
369
369
  expect(report.environment).to eq("second_env")
370
370
  end
371
371
 
372
- it "should clear the global caches" do
373
- $env_module_directories = false
372
+ it "sends the transaction uuid in a catalog request" do
373
+ @agent.instance_variable_set(:@transaction_uuid, 'aaa')
374
+ Puppet::Resource::Catalog.indirection.expects(:find).with(anything, has_entries(:transaction_uuid => 'aaa'))
375
+ @agent.run
376
+ end
377
+
378
+ it "sets the static_catalog query param to true in a catalog request" do
379
+ Puppet::Resource::Catalog.indirection.expects(:find).with(anything, has_entries(:static_catalog => true))
380
+ @agent.run
381
+ end
374
382
 
383
+ it "sets the checksum_type query param to the default supported_checksum_types in a catalog request" do
384
+ Puppet::Resource::Catalog.indirection.expects(:find).with(anything,
385
+ has_entries(:checksum_type => 'md5.sha256'))
375
386
  @agent.run
387
+ end
388
+
389
+ it "sets the checksum_type query param to the supported_checksum_types setting in a catalog request" do
390
+ # Regenerate the agent to pick up the new setting
391
+ Puppet[:supported_checksum_types] = ['sha256']
392
+ @agent = Puppet::Configurer.new
393
+ @agent.stubs(:init_storage)
394
+ @agent.stubs(:download_plugins)
395
+ @agent.stubs(:send_report)
396
+ @agent.stubs(:save_last_run_summary)
376
397
 
377
- expect($env_module_directories).to eq(nil)
398
+ Puppet::Resource::Catalog.indirection.expects(:find).with(anything, has_entries(:checksum_type => 'sha256'))
399
+ @agent.run
378
400
  end
379
401
 
380
402
  describe "when not using a REST terminus for catalogs" do
@@ -544,17 +566,42 @@ describe Puppet::Configurer do
544
566
  end
545
567
  end
546
568
 
569
+ def expects_new_catalog_only(catalog)
570
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns catalog
571
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.never
572
+ end
573
+
574
+ def expects_cached_catalog_only(catalog)
575
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns catalog
576
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.never
577
+ end
578
+
579
+ def expects_fallback_to_cached_catalog(catalog)
580
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns nil
581
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns catalog
582
+ end
583
+
584
+ def expects_fallback_to_new_catalog(catalog)
585
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns nil
586
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns catalog
587
+ end
588
+
589
+ def expects_neither_new_or_cached_catalog
590
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns nil
591
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns nil
592
+ end
593
+
547
594
  describe "when retrieving a catalog" do
548
595
  before do
549
596
  Puppet.settings.stubs(:use).returns(true)
550
597
  @agent.stubs(:facts_for_uploading).returns({})
598
+ @agent.stubs(:download_plugins)
551
599
 
552
- @catalog = Puppet::Resource::Catalog.new
600
+ # retrieve a catalog in the current environment, so we don't try to converge unexpectedly
601
+ @catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
553
602
 
554
603
  # this is the default when using a Configurer instance
555
604
  Puppet::Resource::Catalog.indirection.stubs(:terminus_class).returns :rest
556
-
557
- @agent.stubs(:convert_catalog).returns @catalog
558
605
  end
559
606
 
560
607
  describe "and configured to only retrieve a catalog from the cache" do
@@ -563,18 +610,123 @@ describe Puppet::Configurer do
563
610
  end
564
611
 
565
612
  it "should first look in the cache for a catalog" do
566
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns @catalog
567
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.never
613
+ expects_cached_catalog_only(@catalog)
568
614
 
569
615
  expect(@agent.retrieve_catalog({})).to eq(@catalog)
570
616
  end
571
617
 
618
+ it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
619
+ Puppet::Node.indirection.expects(:find).never
620
+ expects_cached_catalog_only(@catalog)
621
+ @agent.expects(:download_plugins).never
622
+
623
+ @agent.run
624
+ end
625
+
626
+ it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
627
+ Puppet::Node.indirection.expects(:find).returns nil
628
+ expects_fallback_to_new_catalog(@catalog)
629
+ @agent.expects(:download_plugins)
630
+
631
+ @agent.run
632
+ end
633
+
634
+ it "should set its cached_catalog_status to 'explicitly_requested'" do
635
+ expects_cached_catalog_only(@catalog)
636
+
637
+ @agent.retrieve_catalog({})
638
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('explicitly_requested')
639
+ end
640
+
641
+ it "should set its cached_catalog_status to 'explicitly requested' if the cached catalog is from a different environment" do
642
+ cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
643
+ expects_cached_catalog_only(cached_catalog)
644
+
645
+ @agent.retrieve_catalog({})
646
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('explicitly_requested')
647
+ end
648
+
572
649
  it "should compile a new catalog if none is found in the cache" do
573
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns nil
574
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns @catalog
650
+ expects_fallback_to_new_catalog(@catalog)
575
651
 
576
652
  expect(@agent.retrieve_catalog({})).to eq(@catalog)
577
653
  end
654
+
655
+ it "should set its cached_catalog_status to 'not_used' if no catalog is found in the cache" do
656
+ expects_fallback_to_new_catalog(@catalog)
657
+
658
+ @agent.retrieve_catalog({})
659
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
660
+ end
661
+
662
+ it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
663
+ Puppet::Node.indirection.expects(:find).returns(nil)
664
+ expects_neither_new_or_cached_catalog
665
+
666
+ @agent.run
667
+ end
668
+
669
+ it "should return the cached catalog when the environment doesn't match" do
670
+ cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
671
+ expects_cached_catalog_only(cached_catalog)
672
+
673
+ Puppet.expects(:info).with("Using cached catalog from environment 'second_env'")
674
+ expect(@agent.retrieve_catalog({})).to eq(cached_catalog)
675
+ end
676
+ end
677
+
678
+ describe "and strict environment mode is set" do
679
+ before do
680
+ @catalog.stubs(:to_ral).returns(@catalog)
681
+ @catalog.stubs(:write_class_file)
682
+ @catalog.stubs(:write_resource_file)
683
+ @agent.stubs(:send_report)
684
+ @agent.stubs(:save_last_run_summary)
685
+ Puppet.settings[:strict_environment_mode] = true
686
+ end
687
+
688
+ it "should not make a node request" do
689
+ Puppet::Node.indirection.expects(:find).never
690
+
691
+ @agent.run
692
+ end
693
+
694
+ it "should return nil when the catalog's environment doesn't match the agent specified environment" do
695
+ @agent.instance_variable_set(:@environment, 'second_env')
696
+ expects_new_catalog_only(@catalog)
697
+
698
+ Puppet.expects(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
699
+ expect(@agent.run).to be_nil
700
+ end
701
+
702
+ it "should not return nil when the catalog's environment matches the agent specified environment" do
703
+ @agent.instance_variable_set(:@environment, 'production')
704
+ expects_new_catalog_only(@catalog)
705
+
706
+ expect(@agent.run).to eq(0)
707
+ end
708
+
709
+ describe "and a cached catalog is explicitly requested" do
710
+ before do
711
+ Puppet.settings[:use_cached_catalog] = true
712
+ end
713
+
714
+ it "should return nil when the cached catalog's environment doesn't match the agent specified environment" do
715
+ @agent.instance_variable_set(:@environment, 'second_env')
716
+ expects_cached_catalog_only(@catalog)
717
+
718
+ Puppet.expects(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
719
+ expect(@agent.run).to be_nil
720
+ end
721
+
722
+ it "should proceed with the cached catalog if its environment matchs the local environment" do
723
+ Puppet.settings[:use_cached_catalog] = true
724
+ @agent.instance_variable_set(:@environment, 'production')
725
+ expects_cached_catalog_only(@catalog)
726
+
727
+ expect(@agent.run).to eq(0)
728
+ end
729
+ end
578
730
  end
579
731
 
580
732
  it "should use the Catalog class to get its catalog" do
@@ -583,6 +735,13 @@ describe Puppet::Configurer do
583
735
  @agent.retrieve_catalog({})
584
736
  end
585
737
 
738
+ it "should set its cached_catalog_status to 'not_used' when downloading a new catalog" do
739
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns @catalog
740
+
741
+ @agent.retrieve_catalog({})
742
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
743
+ end
744
+
586
745
  it "should use its node_name_value to retrieve the catalog" do
587
746
  Facter.stubs(:value).returns "eh"
588
747
  Puppet.settings[:node_name_value] = "myhost.domain.com"
@@ -598,17 +757,21 @@ describe Puppet::Configurer do
598
757
  end
599
758
 
600
759
  it "should log and return the cached catalog when no catalog can be retrieved from the server" do
601
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns nil
602
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns @catalog
603
-
604
- Puppet.expects(:notice)
760
+ expects_fallback_to_cached_catalog(@catalog)
605
761
 
762
+ Puppet.expects(:info).with("Using cached catalog from environment 'production'")
606
763
  expect(@agent.retrieve_catalog({})).to eq(@catalog)
607
764
  end
608
765
 
766
+ it "should set its cached_catalog_status to 'on_failure' when no catalog can be retrieved from the server" do
767
+ expects_fallback_to_cached_catalog(@catalog)
768
+
769
+ @agent.retrieve_catalog({})
770
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
771
+ end
772
+
609
773
  it "should not look in the cache for a catalog if one is returned from the server" do
610
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns @catalog
611
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.never
774
+ expects_new_catalog_only(@catalog)
612
775
 
613
776
  expect(@agent.retrieve_catalog({})).to eq(@catalog)
614
777
  end
@@ -620,72 +783,141 @@ describe Puppet::Configurer do
620
783
  expect(@agent.retrieve_catalog({})).to eq(@catalog)
621
784
  end
622
785
 
786
+ it "should set its cached_catalog_status to 'on_failure' when retrieving the remote catalog throws an exception" do
787
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.raises "eh"
788
+ Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns @catalog
789
+
790
+ @agent.retrieve_catalog({})
791
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
792
+ end
793
+
623
794
  it "should log and return nil if no catalog can be retrieved from the server and :usecacheonfailure is disabled" do
624
795
  Puppet[:usecacheonfailure] = false
625
796
  Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns nil
626
797
 
627
- Puppet.expects(:warning)
798
+ Puppet.expects(:warning).with('Not using cache on failed catalog')
628
799
 
629
800
  expect(@agent.retrieve_catalog({})).to be_nil
630
801
  end
631
802
 
632
- it "should return nil if no cached catalog is available and no catalog can be retrieved from the server" do
803
+ it "should set its cached_catalog_status to 'not_used' if no catalog can be retrieved from the server and :usecacheonfailure is disabled or fails to retrieve a catalog" do
804
+ Puppet[:usecacheonfailure] = false
633
805
  Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_cache] == true }.returns nil
634
- Puppet::Resource::Catalog.indirection.expects(:find).with { |name, options| options[:ignore_terminus] == true }.returns nil
635
806
 
636
- expect(@agent.retrieve_catalog({})).to be_nil
807
+ @agent.retrieve_catalog({})
808
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
637
809
  end
638
810
 
639
- it "should convert the catalog before returning" do
640
- Puppet::Resource::Catalog.indirection.stubs(:find).returns @catalog
811
+ it "should return nil if no cached catalog is available and no catalog can be retrieved from the server" do
812
+ expects_neither_new_or_cached_catalog
641
813
 
642
- @agent.expects(:convert_catalog).with { |cat, dur| cat == @catalog }.returns "converted catalog"
643
- expect(@agent.retrieve_catalog({})).to eq("converted catalog")
814
+ expect(@agent.retrieve_catalog({})).to be_nil
644
815
  end
645
816
 
646
- it "should return nil if there is an error while retrieving the catalog" do
647
- Puppet::Resource::Catalog.indirection.expects(:find).at_least_once.raises "eh"
817
+ it "should return nil if its cached catalog environment doesn't match server-specified environment" do
818
+ cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
819
+ @agent.instance_variable_set(:@node_environment, 'production')
820
+
821
+ expects_fallback_to_cached_catalog(cached_catalog)
648
822
 
823
+ Puppet.expects(:err).with("Not using cached catalog because its environment 'second_env' does not match 'production'")
649
824
  expect(@agent.retrieve_catalog({})).to be_nil
650
825
  end
826
+
827
+ it "should set its cached_catalog_status to 'not_used' if the cached catalog environment doesn't match server-specified environment" do
828
+ cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
829
+ @agent.instance_variable_set(:@node_environment, 'production')
830
+
831
+ expects_fallback_to_cached_catalog(cached_catalog)
832
+
833
+ @agent.retrieve_catalog({})
834
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
835
+ end
836
+
837
+ it "should return its cached catalog if the environment matches the server-specified environment" do
838
+ cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment]))
839
+ @agent.instance_variable_set(:@node_environment, cached_catalog.environment)
840
+
841
+ expects_fallback_to_cached_catalog(cached_catalog)
842
+
843
+ expect(@agent.retrieve_catalog({})).to eq(cached_catalog)
844
+ end
845
+
846
+ it "should set its cached_catalog_status to 'on_failure' if the cached catalog environment matches server-specified environment" do
847
+ cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment]))
848
+ @agent.instance_variable_set(:@node_environment, cached_catalog.environment)
849
+
850
+ expects_fallback_to_cached_catalog(cached_catalog)
851
+
852
+ @agent.retrieve_catalog({})
853
+ expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
854
+ end
651
855
  end
652
856
 
653
857
  describe "when converting the catalog" do
654
858
  before do
655
859
  Puppet.settings.stubs(:use).returns(true)
656
860
 
657
- @catalog = Puppet::Resource::Catalog.new
658
- @oldcatalog = stub 'old_catalog', :to_ral => @catalog
861
+ catalog.stubs(:to_ral).returns ral_catalog
659
862
  end
660
863
 
661
- it "should convert the catalog to a RAL-formed catalog" do
662
- @oldcatalog.expects(:to_ral).returns @catalog
864
+ let (:catalog) { Puppet::Resource::Catalog.new('tester', Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
865
+ let (:ral_catalog) { Puppet::Resource::Catalog.new('tester', Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
663
866
 
664
- expect(@agent.convert_catalog(@oldcatalog, 10)).to equal(@catalog)
867
+ it "should convert the catalog to a RAL-formed catalog" do
868
+ expect(@agent.convert_catalog(catalog, 10)).to equal(ral_catalog)
665
869
  end
666
870
 
667
871
  it "should finalize the catalog" do
668
- @catalog.expects(:finalize)
872
+ ral_catalog.expects(:finalize)
669
873
 
670
- @agent.convert_catalog(@oldcatalog, 10)
874
+ @agent.convert_catalog(catalog, 10)
671
875
  end
672
876
 
673
877
  it "should record the passed retrieval time with the RAL catalog" do
674
- @catalog.expects(:retrieval_duration=).with 10
878
+ ral_catalog.expects(:retrieval_duration=).with 10
675
879
 
676
- @agent.convert_catalog(@oldcatalog, 10)
880
+ @agent.convert_catalog(catalog, 10)
677
881
  end
678
882
 
679
883
  it "should write the RAL catalog's class file" do
680
- @catalog.expects(:write_class_file)
884
+ ral_catalog.expects(:write_class_file)
681
885
 
682
- @agent.convert_catalog(@oldcatalog, 10)
886
+ @agent.convert_catalog(catalog, 10)
683
887
  end
684
888
 
685
889
  it "should write the RAL catalog's resource file" do
686
- @catalog.expects(:write_resource_file)
890
+ ral_catalog.expects(:write_resource_file)
891
+
892
+ @agent.convert_catalog(catalog, 10)
893
+ end
894
+ end
895
+
896
+ describe "when determining whether to pluginsync" do
897
+ it "should default to Puppet[:pluginsync] when explicitly set by the commandline" do
898
+ Puppet.settings[:pluginsync] = false
899
+ Puppet.settings.expects(:set_by_cli?).returns(true)
900
+
901
+ expect(described_class).not_to be_should_pluginsync
902
+ end
903
+
904
+ it "should default to Puppet[:pluginsync] when explicitly set by config" do
905
+ Puppet.settings[:pluginsync] = false
906
+ Puppet.settings.expects(:set_by_config?).returns(true)
907
+
908
+ expect(described_class).not_to be_should_pluginsync
909
+ end
910
+
911
+ it "should be true if use_cached_catalog is false" do
912
+ Puppet.settings[:use_cached_catalog] = false
913
+
914
+ expect(described_class).to be_should_pluginsync
915
+ end
916
+
917
+ it "should be false if use_cached_catalog is true" do
918
+ Puppet.settings[:use_cached_catalog] = true
687
919
 
688
- @agent.convert_catalog(@oldcatalog, 10)
920
+ expect(described_class).not_to be_should_pluginsync
689
921
  end
690
922
  end
691
923
  end