puppet 4.2.3 → 4.3.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 (337) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +1 -1
  3. data/ext/debian/puppet.init +0 -1
  4. data/ext/debian/puppet.logrotate +14 -5
  5. data/ext/osx/puppet.plist +0 -2
  6. data/ext/redhat/client.init +13 -5
  7. data/ext/redhat/logrotate +15 -3
  8. data/ext/redhat/puppet.spec.erb +5 -1
  9. data/ext/redhat/server.init +1 -1
  10. data/ext/systemd/puppet.service +1 -0
  11. data/lib/puppet.rb +12 -0
  12. data/lib/puppet/agent.rb +4 -4
  13. data/lib/puppet/agent/locker.rb +11 -2
  14. data/lib/puppet/application/agent.rb +5 -1
  15. data/lib/puppet/application/apply.rb +4 -0
  16. data/lib/puppet/application/filebucket.rb +78 -4
  17. data/lib/puppet/application/lookup.rb +356 -0
  18. data/lib/puppet/application/master.rb +3 -0
  19. data/lib/puppet/configurer.rb +9 -5
  20. data/lib/puppet/context.rb +16 -1
  21. data/lib/puppet/context/trusted_information.rb +21 -1
  22. data/lib/puppet/daemon.rb +17 -13
  23. data/lib/puppet/data_binding.rb +4 -2
  24. data/lib/puppet/data_providers.rb +12 -13
  25. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  26. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  27. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  28. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  29. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  30. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  31. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  32. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  33. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  34. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  35. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  36. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  37. data/lib/puppet/defaults.rb +12 -2
  38. data/lib/puppet/error.rb +4 -0
  39. data/lib/puppet/face/module/changes.rb +2 -1
  40. data/lib/puppet/feature/cfacter.rb +1 -0
  41. data/lib/puppet/file_bucket/dipper.rb +58 -2
  42. data/lib/puppet/functions.rb +2 -4
  43. data/lib/puppet/functions/assert_type.rb +48 -12
  44. data/lib/puppet/functions/defined.rb +79 -48
  45. data/lib/puppet/functions/each.rb +85 -27
  46. data/lib/puppet/functions/filter.rb +58 -23
  47. data/lib/puppet/functions/hiera.rb +76 -3
  48. data/lib/puppet/functions/hiera_array.rb +65 -3
  49. data/lib/puppet/functions/hiera_hash.rb +74 -2
  50. data/lib/puppet/functions/hiera_include.rb +75 -2
  51. data/lib/puppet/functions/lookup.rb +19 -17
  52. data/lib/puppet/functions/map.rb +56 -21
  53. data/lib/puppet/functions/match.rb +29 -12
  54. data/lib/puppet/functions/reduce.rb +95 -58
  55. data/lib/puppet/functions/versioncmp.rb +36 -0
  56. data/lib/puppet/functions/with.rb +15 -7
  57. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  58. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  59. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  61. data/lib/puppet/indirector/hiera.rb +4 -0
  62. data/lib/puppet/indirector/json.rb +1 -1
  63. data/lib/puppet/indirector/msgpack.rb +1 -1
  64. data/lib/puppet/indirector/request.rb +7 -8
  65. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  66. data/lib/puppet/info_service.rb +7 -0
  67. data/lib/puppet/info_service/class_information_service.rb +111 -0
  68. data/lib/puppet/module_tool/metadata.rb +32 -9
  69. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  70. data/lib/puppet/network/authconfig.rb +21 -1
  71. data/lib/puppet/network/authorization.rb +8 -1
  72. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  73. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  74. data/lib/puppet/node/environment.rb +9 -2
  75. data/lib/puppet/parser.rb +3 -0
  76. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  77. data/lib/puppet/parser/compiler.rb +302 -12
  78. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  79. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  80. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  81. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  82. data/lib/puppet/parser/environment_compiler.rb +165 -0
  83. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  84. data/lib/puppet/parser/functions/defined.rb +105 -68
  85. data/lib/puppet/parser/functions/each.rb +85 -27
  86. data/lib/puppet/parser/functions/filter.rb +59 -23
  87. data/lib/puppet/parser/functions/hiera.rb +83 -27
  88. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  89. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  90. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  91. data/lib/puppet/parser/functions/map.rb +55 -20
  92. data/lib/puppet/parser/functions/match.rb +27 -12
  93. data/lib/puppet/parser/functions/reduce.rb +97 -60
  94. data/lib/puppet/parser/functions/with.rb +16 -8
  95. data/lib/puppet/parser/resource.rb +98 -19
  96. data/lib/puppet/plugins/configuration.rb +3 -2
  97. data/lib/puppet/plugins/data_providers.rb +12 -60
  98. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  99. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  100. data/lib/puppet/pops.rb +19 -17
  101. data/lib/puppet/pops/adapters.rb +12 -0
  102. data/lib/puppet/pops/binder/binder.rb +2 -2
  103. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  104. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  105. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  106. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  107. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  108. data/lib/puppet/pops/binder/injector.rb +4 -4
  109. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  110. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  111. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  112. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  113. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  114. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  115. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  116. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  117. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  118. data/lib/puppet/pops/issues.rb +1 -1
  119. data/lib/puppet/pops/label_provider.rb +1 -1
  120. data/lib/puppet/pops/lookup.rb +25 -47
  121. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  122. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  123. data/lib/puppet/pops/merge_strategy.rb +73 -5
  124. data/lib/puppet/pops/model/factory.rb +34 -0
  125. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  126. data/lib/puppet/pops/model/model_meta.rb +15 -0
  127. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  128. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  129. data/lib/puppet/pops/parser/egrammar.ra +56 -3
  130. data/lib/puppet/pops/parser/eparser.rb +1549 -1352
  131. data/lib/puppet/pops/parser/lexer2.rb +31 -6
  132. data/lib/puppet/pops/parser/locator.rb +1 -1
  133. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  134. data/lib/puppet/pops/types/enumeration.rb +1 -2
  135. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  136. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  137. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  138. data/lib/puppet/pops/types/type_factory.rb +87 -148
  139. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  140. data/lib/puppet/pops/types/type_parser.rb +116 -127
  141. data/lib/puppet/pops/types/types.rb +1394 -255
  142. data/lib/puppet/pops/types/types_meta.rb +0 -234
  143. data/lib/puppet/pops/validation.rb +7 -2
  144. data/lib/puppet/pops/validation/checker4_0.rb +28 -0
  145. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  146. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  147. data/lib/puppet/provider/package/dnf.rb +41 -0
  148. data/lib/puppet/provider/package/gem.rb +7 -2
  149. data/lib/puppet/provider/package/rpm.rb +1 -0
  150. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  151. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  152. data/lib/puppet/provider/package/windows/package.rb +9 -1
  153. data/lib/puppet/provider/package/yum.rb +14 -9
  154. data/lib/puppet/provider/service/bsd.rb +1 -1
  155. data/lib/puppet/provider/service/debian.rb +21 -0
  156. data/lib/puppet/provider/service/init.rb +6 -0
  157. data/lib/puppet/provider/service/rcng.rb +51 -0
  158. data/lib/puppet/provider/service/redhat.rb +2 -1
  159. data/lib/puppet/provider/service/smf.rb +43 -2
  160. data/lib/puppet/provider/service/src.rb +27 -0
  161. data/lib/puppet/provider/service/systemd.rb +15 -3
  162. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  163. data/lib/puppet/reference/report.rb +9 -12
  164. data/lib/puppet/reports.rb +5 -1
  165. data/lib/puppet/resource.rb +50 -73
  166. data/lib/puppet/resource/capability_finder.rb +95 -0
  167. data/lib/puppet/resource/catalog.rb +47 -7
  168. data/lib/puppet/resource/status.rb +0 -2
  169. data/lib/puppet/resource/type.rb +238 -44
  170. data/lib/puppet/resource/type_collection.rb +60 -2
  171. data/lib/puppet/settings.rb +2 -2
  172. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  173. data/lib/puppet/ssl/oids.rb +9 -1
  174. data/lib/puppet/transaction.rb +4 -1
  175. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  176. data/lib/puppet/transaction/resource_harness.rb +9 -4
  177. data/lib/puppet/type.rb +74 -3
  178. data/lib/puppet/type/augeas.rb +8 -0
  179. data/lib/puppet/type/file/source.rb +14 -12
  180. data/lib/puppet/type/user.rb +4 -2
  181. data/lib/puppet/util/windows/security.rb +4 -1
  182. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  183. data/lib/puppet/version.rb +1 -1
  184. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  185. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  186. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  187. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  188. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  189. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  190. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  191. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  192. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  193. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  194. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  195. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  198. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  201. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  202. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  203. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  204. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  205. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  206. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  207. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  208. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  209. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  210. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  211. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  212. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  213. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  214. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  215. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  216. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  217. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  218. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  219. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  220. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  224. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  225. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  226. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  227. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  228. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  229. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  230. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  231. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  232. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  233. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  234. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  235. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  236. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  238. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  239. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  241. data/spec/integration/data_binding_spec.rb +229 -0
  242. data/spec/integration/file_bucket/file_spec.rb +2 -2
  243. data/spec/integration/parser/compiler_spec.rb +23 -19
  244. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  245. data/spec/integration/parser/undef_param_spec.rb +1 -1
  246. data/spec/integration/resource/catalog_spec.rb +1 -1
  247. data/spec/integration/type/package_spec.rb +2 -0
  248. data/spec/integration/util/windows/security_spec.rb +18 -0
  249. data/spec/lib/matchers/include_in_order.rb +2 -2
  250. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  251. data/spec/spec_helper.rb +7 -0
  252. data/spec/unit/agent/locker_spec.rb +4 -4
  253. data/spec/unit/agent_spec.rb +0 -8
  254. data/spec/unit/application/agent_spec.rb +5 -0
  255. data/spec/unit/application/apply_spec.rb +8 -0
  256. data/spec/unit/application/filebucket_spec.rb +87 -1
  257. data/spec/unit/application/lookup_spec.rb +195 -0
  258. data/spec/unit/appmgmt_spec.rb +657 -0
  259. data/spec/unit/capability_spec.rb +414 -0
  260. data/spec/unit/configurer_spec.rb +7 -1
  261. data/spec/unit/context/trusted_information_spec.rb +24 -1
  262. data/spec/unit/daemon_spec.rb +18 -8
  263. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  264. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  265. data/spec/unit/functions/assert_type_spec.rb +5 -7
  266. data/spec/unit/functions/defined_spec.rb +2 -2
  267. data/spec/unit/functions/epp_spec.rb +2 -2
  268. data/spec/unit/functions/lookup_spec.rb +200 -9
  269. data/spec/unit/functions/regsubst_spec.rb +17 -8
  270. data/spec/unit/functions/scanf_spec.rb +1 -1
  271. data/spec/unit/functions/split_spec.rb +2 -2
  272. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  273. data/spec/unit/functions4_spec.rb +58 -72
  274. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  275. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  276. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  277. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  278. data/spec/unit/indirector/request_spec.rb +8 -8
  279. data/spec/unit/info_service_spec.rb +236 -0
  280. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  281. data/spec/unit/network/authconfig_spec.rb +62 -32
  282. data/spec/unit/network/authorization_spec.rb +30 -2
  283. data/spec/unit/network/http/connection_spec.rb +14 -19
  284. data/spec/unit/parser/compiler_spec.rb +86 -2
  285. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  286. data/spec/unit/parser/resource_spec.rb +2 -20
  287. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  288. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  289. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  290. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  291. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
  292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  293. data/spec/unit/pops/label_provider_spec.rb +5 -1
  294. data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
  295. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  296. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  297. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  298. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  299. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  300. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  301. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  302. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  303. data/spec/unit/pops/types/type_parser_spec.rb +7 -12
  304. data/spec/unit/pops/validator/validator_spec.rb +25 -0
  305. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  306. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  307. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  308. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  309. data/spec/unit/provider/package/gem_spec.rb +7 -0
  310. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  311. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  312. data/spec/unit/provider/package/yum_spec.rb +21 -13
  313. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  314. data/spec/unit/provider/service/debian_spec.rb +27 -0
  315. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  316. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  317. data/spec/unit/provider/service/smf_spec.rb +30 -5
  318. data/spec/unit/provider/service/src_spec.rb +19 -4
  319. data/spec/unit/provider/service/systemd_spec.rb +78 -29
  320. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  321. data/spec/unit/reports_spec.rb +10 -0
  322. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  323. data/spec/unit/resource/catalog_spec.rb +31 -8
  324. data/spec/unit/resource/type_collection_spec.rb +23 -2
  325. data/spec/unit/resource/type_spec.rb +1 -1
  326. data/spec/unit/resource_spec.rb +22 -4
  327. data/spec/unit/settings_spec.rb +90 -1
  328. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  329. data/spec/unit/ssl/oids_spec.rb +8 -0
  330. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  331. data/spec/unit/transaction/report_spec.rb +24 -1
  332. data/spec/unit/type/package_spec.rb +1 -0
  333. data/spec/unit/type/user_spec.rb +14 -7
  334. data/spec/unit/type_spec.rb +1 -1
  335. metadata +169 -5
  336. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  337. data/spec/integration/data_binding.rb +0 -104
@@ -0,0 +1,402 @@
1
+ module Puppet::Pops::Lookup
2
+
3
+ # The ExplainNode contains information of a specific node in a tree traversed during
4
+ # lookup. The tree can be traversed using the `parent` and `branches` attributes of
5
+ # each node.
6
+ #
7
+ # Each leaf node contains information about what happened when the leaf of the branch
8
+ # was traversed.
9
+ class ExplainNode
10
+ def branches
11
+ @branches ||= []
12
+ end
13
+
14
+ def to_hash
15
+ hash = {}
16
+ hash[:branches] = @branches.map {|b| b.to_hash} unless @branches.nil? || @branches.empty?
17
+ hash
18
+ end
19
+
20
+ def to_s
21
+ io = StringIO.new
22
+ dump_on(io, '', '')
23
+ io.string
24
+ end
25
+
26
+ def dump_on(io, indent, first_indent)
27
+ end
28
+ end
29
+
30
+ class ExplainTreeNode < ExplainNode
31
+ attr_reader :parent, :event, :key, :value
32
+
33
+ def initialize(parent)
34
+ @parent = parent
35
+ @event = nil
36
+ end
37
+
38
+ def found_in_overrides(key, value)
39
+ @key = key
40
+ @value = value
41
+ @event = :found_in_overrides
42
+ end
43
+
44
+ def found_in_defaults(key, value)
45
+ @key = key
46
+ @value = value
47
+ @event = :found_in_defaults
48
+ end
49
+
50
+ def found(key, value)
51
+ @key = key
52
+ @value = value
53
+ @event = :found
54
+ end
55
+
56
+ def result(value)
57
+ @value = value
58
+ @event = :result
59
+ end
60
+
61
+ def not_found(key)
62
+ @key = key
63
+ @event = :not_found
64
+ end
65
+
66
+ def path_not_found
67
+ @event = :path_not_found
68
+ end
69
+
70
+ def module_not_found
71
+ @event = :module_not_found
72
+ end
73
+
74
+ def increase_indent(indent)
75
+ indent + ' '
76
+ end
77
+
78
+ def to_hash
79
+ hash = super
80
+ hash[:key] = @key unless @key.nil?
81
+ hash[:value] = @value if [:found, :found_in_defaults, :found_in_overrides, :result].include?(@event)
82
+ hash[:event] = @event unless @event.nil?
83
+ hash[:type] = type
84
+ hash
85
+ end
86
+
87
+ def type
88
+ :root
89
+ end
90
+
91
+ def dump_outcome(io, indent)
92
+ io << indent << 'No such key: "' << @key << "\"\n" if @event == :not_found
93
+ if [:found, :found_in_overrides, :found_in_defaults].include?(@event)
94
+ io << indent << 'Found key: "' << @key << '" value: '
95
+ dump_value(io, indent, @value)
96
+ io << ' in overrides' if @event == :found_in_overrides
97
+ io << ' in defaults' if @event == :found_in_defaults
98
+ io << "\n"
99
+ end
100
+ end
101
+
102
+ def dump_value(io, indent, value)
103
+ case value
104
+ when Hash
105
+ io << '{'
106
+ unless value.empty?
107
+ inner_indent = increase_indent(indent)
108
+ value.reduce("\n") do |sep, (k, v)|
109
+ io << sep << inner_indent
110
+ dump_value(io, inner_indent, k)
111
+ io << ' => '
112
+ dump_value(io, inner_indent, v)
113
+ ",\n"
114
+ end
115
+ io << "\n" << indent
116
+ end
117
+ io << '}'
118
+ when Array
119
+ io << '['
120
+ unless value.empty?
121
+ inner_indent = increase_indent(indent)
122
+ value.reduce("\n") do |sep, v|
123
+ io << sep << inner_indent
124
+ dump_value(io, inner_indent, v)
125
+ ",\n"
126
+ end
127
+ io << "\n" << indent
128
+ end
129
+ io << ']'
130
+ else
131
+ io << value.inspect
132
+ end
133
+ end
134
+ end
135
+
136
+ class ExplainInterpolate < ExplainTreeNode
137
+ def initialize(parent, expression)
138
+ super(parent)
139
+ @expression = expression
140
+ end
141
+
142
+ def dump_on(io, indent, first_indent)
143
+ io << first_indent << 'Interpolation on "' << @expression << "\"\n"
144
+ indent = increase_indent(indent)
145
+ branches.each {|b| b.dump_on(io, indent, indent)}
146
+ end
147
+
148
+ def to_hash
149
+ hash = super
150
+ hash[:expression] = @expression
151
+ hash
152
+ end
153
+
154
+ def type
155
+ :interpolate
156
+ end
157
+ end
158
+
159
+ class ExplainMerge < ExplainTreeNode
160
+ def initialize(parent, merge)
161
+ super(parent)
162
+ @merge = merge
163
+ end
164
+
165
+ def dump_on(io, indent, first_indent)
166
+ # It's pointless to report a merge where there's only one branch
167
+ return branches[0].dump_on(io, indent, first_indent) if branches.size == 1
168
+
169
+ io << first_indent << 'Merge strategy ' << @merge.class.key << "\n"
170
+ indent = increase_indent(indent)
171
+ options = options_wo_strategy
172
+ unless options.nil?
173
+ io << indent << 'Options: '
174
+ dump_value(io, indent, options)
175
+ io << "\n"
176
+ end
177
+ branches.each {|b| b.dump_on(io, indent, indent)}
178
+ if @event == :result
179
+ io << indent << 'Merged result: '
180
+ dump_value(io, indent, @value)
181
+ io << "\n"
182
+ end
183
+ end
184
+
185
+ def to_hash
186
+ return branches[0].to_hash if branches.size == 1
187
+ hash = super
188
+ hash[:merge] = @merge.class.key
189
+ options = options_wo_strategy
190
+ hash[:options] = options unless options.nil?
191
+ hash
192
+ end
193
+
194
+ def type
195
+ :merge
196
+ end
197
+
198
+ def options_wo_strategy
199
+ options = @merge.options
200
+ if !options.nil? && options.include?('strategy')
201
+ options = options.dup
202
+ options.delete('strategy')
203
+ end
204
+ options.empty? ? nil : options
205
+ end
206
+ end
207
+
208
+ class ExplainModule < ExplainTreeNode
209
+ def initialize(parent, mod)
210
+ super(parent)
211
+ @module = mod
212
+ end
213
+
214
+ def dump_on(io, indent, first_indent)
215
+ io << indent << 'Module "' << @module << '"'
216
+ if branches.size == 1
217
+ branches[0].dump_on(io, indent, ' using ')
218
+ else
219
+ io << "\n"
220
+ indent = increase_indent(indent)
221
+ branches.each {|b| b.dump_on(io, indent, indent)}
222
+ end
223
+ io << indent << "Module not found\n" if @event == :module_not_found
224
+ end
225
+
226
+ def to_hash
227
+ if branches.size == 1
228
+ branches[0].to_hash.merge(:module => @module)
229
+ else
230
+ hash = super
231
+ hash[:module] = @module
232
+ hash
233
+ end
234
+ end
235
+
236
+ def type
237
+ :module
238
+ end
239
+ end
240
+
241
+ class ExplainGlobal < ExplainTreeNode
242
+ def initialize(parent, binding_terminus)
243
+ super(parent)
244
+ @binding_terminus = binding_terminus
245
+ end
246
+
247
+ def dump_on(io, indent, first_indent)
248
+ io << first_indent << 'Data Binding "' << @binding_terminus << "\"\n"
249
+ indent = increase_indent(indent)
250
+ branches.each {|b| b.dump_on(io, indent, indent)}
251
+ dump_outcome(io, indent)
252
+ end
253
+
254
+ def to_hash
255
+ hash = super
256
+ hash[:name] = @binding_terminus
257
+ hash
258
+ end
259
+
260
+ def type
261
+ :global
262
+ end
263
+ end
264
+
265
+ class ExplainDataProvider < ExplainTreeNode
266
+ def initialize(parent, provider)
267
+ super(parent)
268
+ @provider = provider
269
+ end
270
+
271
+ def dump_on(io, indent, first_indent)
272
+ io << first_indent << 'Data Provider "' << @provider.name << "\"\n"
273
+ indent = increase_indent(indent)
274
+ io << indent << 'ConfigurationPath "' << @provider.config_path << "\"\n" if @provider.respond_to?(:config_path)
275
+ branches.each {|b| b.dump_on(io, indent, indent)}
276
+ dump_outcome(io, indent)
277
+ end
278
+
279
+ def to_hash
280
+ hash = super
281
+ hash[:name] = @provider.name
282
+ hash[:configuration_path] = @provider.config_path.to_s if @provider.respond_to?(:config_path)
283
+ hash
284
+ end
285
+
286
+ def type
287
+ :data_provider
288
+ end
289
+ end
290
+
291
+ class ExplainPath < ExplainTreeNode
292
+ def initialize(parent, path)
293
+ super(parent)
294
+ @path = path
295
+ end
296
+
297
+ def dump_on(io, indent, first_indent)
298
+ io << indent << 'Path "' << @path.path << "\"\n"
299
+ indent = increase_indent(indent)
300
+ io << indent << 'Original path: ' << @path.original_path << "\n"
301
+ branches.each {|b| b.dump_on(io, indent, indent)}
302
+ io << indent << "Path not found\n" if @event == :path_not_found
303
+ dump_outcome(io, indent)
304
+ end
305
+
306
+ def to_hash
307
+ hash = super
308
+ hash[:original_path] = @path.original_path
309
+ hash[:path] = @path.path.to_s
310
+ hash
311
+ end
312
+
313
+ def type
314
+ :path
315
+ end
316
+ end
317
+
318
+ class ExplainScope < ExplainTreeNode
319
+ def initialize(parent)
320
+ super(parent)
321
+ end
322
+
323
+ def dump_on(io, indent, first_indent)
324
+ io << indent << 'Global Scope' << "\"\n"
325
+ indent = increase_indent(indent)
326
+ dump_outcome(io, indent)
327
+ end
328
+
329
+ def type
330
+ :scope
331
+ end
332
+ end
333
+
334
+ class Explainer < ExplainNode
335
+ def initialize
336
+ @current = self
337
+ end
338
+
339
+ def push(qualifier_type, qualifier)
340
+ node = case (qualifier_type)
341
+ when :global
342
+ ExplainGlobal.new(@current, qualifier)
343
+ when :path
344
+ ExplainPath.new(@current, qualifier)
345
+ when :module
346
+ ExplainModule.new(@current, qualifier)
347
+ when :interpolate
348
+ ExplainInterpolate.new(@current, qualifier)
349
+ when :data_provider
350
+ ExplainDataProvider.new(@current, qualifier)
351
+ when :merge
352
+ ExplainMerge.new(@current, qualifier)
353
+ when :scope
354
+ ExplainScope.new(@current)
355
+ else
356
+ raise ArgumentError, "Unknown Explain type #{qualifier_type}"
357
+ end
358
+ @current.branches << node
359
+ @current = node
360
+ end
361
+
362
+ def pop
363
+ @current = @current.parent unless @current.parent.nil?
364
+ end
365
+
366
+ def accept_found_in_overrides(key, value)
367
+ @current.found_in_overrides(key, value)
368
+ end
369
+
370
+ def accept_found_in_defaults(key, value)
371
+ @current.found_in_defaults(key, value)
372
+ end
373
+
374
+ def accept_found(key, value)
375
+ @current.found(key, value)
376
+ end
377
+
378
+ def accept_not_found(key)
379
+ @current.not_found(key)
380
+ end
381
+
382
+ def accept_path_not_found
383
+ @current.path_not_found
384
+ end
385
+
386
+ def accept_module_not_found
387
+ @current.module_not_found
388
+ end
389
+
390
+ def accept_result(result)
391
+ @current.result(result)
392
+ end
393
+
394
+ def dump_on(io, indent, first_indent)
395
+ branches.each { |b| b.dump_on(io, indent, first_indent) }
396
+ end
397
+
398
+ def to_hash
399
+ branches.size == 1 ? branches[0].to_hash : super
400
+ end
401
+ end
402
+ end
@@ -0,0 +1,117 @@
1
+ module Puppet::Pops::Lookup
2
+ class Invocation
3
+ attr_reader :scope, :override_values, :default_values, :explainer, :module_name
4
+
5
+ # Creates a context object for a lookup invocation. The object contains the current scope, overrides, and default
6
+ # values and may optionally contain an {ExplanationAcceptor} instance that will receive book-keeping information
7
+ # about the progress of the lookup.
8
+ #
9
+ # If the _explain_ argument is a boolean, then _false_ means that no explanation is needed and _true_ means that
10
+ # the default explanation acceptor should be used. The _explain_ argument may also be an instance of the
11
+ # `ExplanationAcceptor` class.
12
+ #
13
+ # @param scope [Puppet::Parser::Scope] The scope to use for the lookup
14
+ # @param override_values [Hash<String,Object>|nil] A map to use as override. Values found here are returned immediately (no merge)
15
+ # @param default_values [Hash<String,Object>] A map to use as the last resort (but before default)
16
+ # @param explainer [boolean,Explanainer] An boolean true to use the default explanation acceptor or an explainer instance that will receive information about the lookup
17
+ def initialize(scope, override_values = {}, default_values = {}, explainer = nil)
18
+ @name_stack = []
19
+ @scope = scope
20
+ @override_values = override_values
21
+ @default_values = default_values
22
+ unless explainer.is_a?(Explainer)
23
+ explainer = explainer == true ? Explainer.new : nil
24
+ end
25
+ @explainer = explainer
26
+ end
27
+
28
+ def check(name)
29
+ if @name_stack.include?(name)
30
+ raise Puppet::DataBinding::RecursiveLookupError, "Recursive lookup detected in [#{@name_stack.join(', ')}]"
31
+ end
32
+ return unless block_given?
33
+
34
+ @name_stack.push(name)
35
+ begin
36
+ yield
37
+ rescue Puppet::DataBinding::LookupError
38
+ raise
39
+ rescue Puppet::Error => detail
40
+ raise Puppet::DataBinding::LookupError.new(detail.message, detail)
41
+ ensure
42
+ @name_stack.pop
43
+ end
44
+ end
45
+
46
+ # The qualifier_type can be one of:
47
+ # :global - qualifier is the data binding terminus name
48
+ # :data_provider - qualifier a DataProvider instance
49
+ # :path - qualifier is a ResolvedPath instance
50
+ # :merge - qualifier is a MergeStrategy instance
51
+ # :module - qualifier is the name of a module
52
+ # :interpolation - qualifier is the unresolved interpolation expression
53
+ # :meta - qualifier is the name of a module or nil if that's not applicable
54
+ #
55
+ # @param qualifier [Object] A branch, a provider, or a path
56
+ def with(qualifier_type, qualifier)
57
+ is_meta = qualifier_type == :meta
58
+ @module_name = qualifier if is_meta
59
+ if @explainer.nil?
60
+ yield
61
+ else
62
+ if is_meta
63
+ save_explainer = @explainer
64
+ @explainer = nil
65
+ begin
66
+ yield
67
+ ensure
68
+ @explainer = save_explainer
69
+ end
70
+ else
71
+ @explainer.push(qualifier_type, qualifier)
72
+ begin
73
+ yield
74
+ ensure
75
+ @explainer.pop
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def report_found_in_overrides(key, value)
82
+ @explainer.accept_found_in_overrides(key, value) unless @explainer.nil?
83
+ value
84
+ end
85
+
86
+ def report_found_in_defaults(key, value)
87
+ @explainer.accept_found_in_defaults(key, value) unless @explainer.nil?
88
+ value
89
+ end
90
+
91
+ def report_found(key, value)
92
+ @explainer.accept_found(key, value) unless @explainer.nil?
93
+ value
94
+ end
95
+
96
+ # Report the result of a merge or fully resolved interpolated string
97
+ # @param value [Object] The result to report
98
+ # @return [Object] the given value
99
+ def report_result(value)
100
+ @explainer.accept_result(value) unless @explainer.nil?
101
+ value
102
+ end
103
+
104
+ def report_not_found(key)
105
+ @explainer.accept_not_found(key) unless @explainer.nil?
106
+ end
107
+
108
+ def report_path_not_found
109
+ @explainer.accept_path_not_found unless @explainer.nil?
110
+ end
111
+
112
+ def report_module_not_found
113
+ @explainer.accept_module_not_found unless @explainer.nil?
114
+ end
115
+ end
116
+ end
117
+