puppet 4.3.0 → 4.4.0

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