puppet 4.2.3-x64-mingw32 → 4.3.0-x64-mingw32

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
@@ -1,43 +1,45 @@
1
1
  # This class is the backing implementation of the Puppet function 'lookup'.
2
2
  # See puppet/functions/lookup.rb for documentation.
3
3
  #
4
- class Puppet::Pops::Lookup
4
+ module Puppet::Pops::Lookup
5
5
  # Performs a lookup in the configured scopes and optionally merges the default.
6
6
  #
7
7
  # This is a backing function and all parameters are assumed to have been type checked.
8
8
  # See puppet/functions/lookup.rb for full documentation and all parameter combinations.
9
9
  #
10
- # @param scope [Puppet::Parser::Scope] The scope to use for the lookup
11
10
  # @param name [String|Array<String>] The name or names to lookup
12
11
  # @param type [Puppet::Pops::Types::PAnyType|nil] The expected type of the found value
13
12
  # @param default_value [Object] The value to use as default when no value is found
14
13
  # @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
15
- # @param override [Hash<String,Object>|nil] A map to use as override. Values found here are returned immediately (no merge)
16
- # @param default_values_hash [Hash<String,Object>] A map to use as the last resort (but before default)
17
- # @param merge [String|Hash<String,Object>|nil] Merge strategy or hash with strategy and options
14
+ # @param merge [Puppet::Pops::MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
15
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] Invocation data containing scope, overrides, and defaults
18
16
  # @return [Object] The found value
19
17
  #
20
- def self.lookup(scope, name, value_type, default_value, has_default, override, default_values_hash, merge)
21
- value_type = Puppet::Pops::Types::PDataType.new if value_type.nil?
18
+ def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
19
+ value_type = Puppet::Pops::Types::PDataType::DEFAULT if value_type.nil?
22
20
  names = name.is_a?(Array) ? name : [name]
23
21
 
24
22
  # find first name that yields a non-nil result and wrap it in a two element array
25
23
  # with name and value.
26
- not_found = Object.new
27
- result_with_name = names.reduce([nil,not_found]) do |memo, key|
28
- value = override.include?(key) ? assert_type('override', value_type, override[key]) : not_found
29
- value = search_and_merge(key, scope, merge, not_found) if value.equal?(not_found)
24
+ not_found = Puppet::Pops::MergeStrategy::NOT_FOUND
25
+ override_values = lookup_invocation.override_values
26
+ result_with_name = names.reduce([nil, not_found]) do |memo, key|
27
+ value = override_values.include?(key) ? assert_type('override', value_type, override_values[key]) : not_found
28
+ catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
30
29
  break [key, assert_type('found', value_type, value)] unless value.equal?(not_found)
31
30
  memo
32
31
  end
33
32
 
34
- # Use the 'default_values_hash' map as a last resort if nothing is found
35
- if result_with_name[1].equal?(not_found) && !default_values_hash.empty?
36
- result_with_name = names.reduce(result_with_name) do |memo, key|
37
- value = default_values_hash.include?(key) ? assert_type('default_values_hash', value_type, default_values_hash[key]) : not_found
38
- memo = [ key, value ]
39
- break memo unless value.equal?(not_found)
40
- memo
33
+ # Use the 'default_values' hash as a last resort if nothing is found
34
+ if result_with_name[1].equal?(not_found)
35
+ default_values = lookup_invocation.default_values
36
+ unless default_values.empty?
37
+ result_with_name = names.reduce(result_with_name) do |memo, key|
38
+ value = default_values.include?(key) ? assert_type('default_values_hash', value_type, default_values[key]) : not_found
39
+ memo = [key, value]
40
+ break memo unless value.equal?(not_found)
41
+ memo
42
+ end
41
43
  end
42
44
  end
43
45
 
@@ -54,34 +56,10 @@ class Puppet::Pops::Lookup
54
56
  answer
55
57
  end
56
58
 
57
- def self.search_and_merge(name, scope, merge, not_found)
58
- in_global = lambda { lookup_with_databinding(name, scope, merge) }
59
- in_env = lambda { Puppet::DataProviders.lookup_in_environment(name, scope, merge) }
60
- in_module = lambda { Puppet::DataProviders.lookup_in_module(name, scope, merge) }
61
-
62
- [in_global, in_env, in_module].reduce(not_found) do |memo, f|
63
- found = false # can't trust catch return value since nil is valid
64
- value = catch (:no_such_key) do
65
- answer = f.call
66
- found = true
67
- answer
68
- end
69
- next memo unless found
70
- break value if merge.nil? # value found and no merge
71
- strategy = Puppet::Pops::MergeStrategy.strategy(merge)
72
- memo.equal?(not_found) ? strategy.convert_value(value) : strategy.merge(memo, value)
73
- end
74
- end
75
- private_class_method :search_and_merge
76
-
77
- def self.lookup_with_databinding(key, scope, merge)
78
- begin
79
- Puppet::DataBinding.indirection.find(key, { :environment => scope.environment.to_s, :variables => scope, :merge => merge })
80
- rescue Puppet::DataBinding::LookupError => e
81
- raise Puppet::Error, "Error from DataBinding '#{Puppet[:data_binding_terminus]}' while looking up '#{name}': #{e.message}", e
82
- end
59
+ # @api private
60
+ def self.search_and_merge(name, lookup_invocation, merge)
61
+ return Puppet::DataProviders.lookup_adapter(lookup_invocation).lookup(name, lookup_invocation, merge)
83
62
  end
84
- private_class_method :lookup_with_databinding
85
63
 
86
64
  def self.assert_type(subject, type, value)
87
65
  Puppet::Pops::Types::TypeAsserter.assert_instance_of(subject, type, value)
@@ -89,8 +67,8 @@ class Puppet::Pops::Lookup
89
67
  private_class_method :assert_type
90
68
 
91
69
  def self.fail_lookup(names)
92
- name_part = names.size == 1 ? "the name '#{names[0]}'" : 'any of the names [' + names.map {|n| "'#{n}'"} .join(', ') + ']'
93
- raise Puppet::Error, "Function lookup() did not find a value for #{name_part}"
70
+ name_part = names.size == 1 ? "the name '#{names[0]}'" : 'any of the names [' + names.map { |n| "'#{n}'" }.join(', ') + ']'
71
+ raise Puppet::DataBinding::LookupError, "Function lookup() did not find a value for #{name_part}"
94
72
  end
95
73
  private_class_method :fail_lookup
96
74
  end
@@ -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