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
@@ -4,6 +4,8 @@ module Puppet::Pops
4
4
  # Merges to objects into one based on an implemented strategy.
5
5
  #
6
6
  class MergeStrategy
7
+ NOT_FOUND = Object.new.freeze
8
+
7
9
  TypeAsserter = Puppet::Pops::Types::TypeAsserter
8
10
  TypeParser = Puppet::Pops::Types::TypeParser
9
11
 
@@ -20,12 +22,14 @@ module Puppet::Pops
20
22
 
21
23
  # Finds the merge strategy for the given _merge_, creates an instance of it and returns that instance.
22
24
  #
23
- # @param merge [String|Symbol|Hash<String,Object>] The merge strategy. Can be a string or symbol denoting the key
25
+ # @param merge [Puppet::Pops::MergeStrategy,String,Hash<String,Object>,nil] The merge strategy. Can be a string or symbol denoting the key
24
26
  # identifier or a hash with options where the key 'strategy' denotes the key
25
27
  # @return [MergeStrategy] The matching merge strategy
26
28
  #
27
29
  def self.strategy(merge)
28
- TypeAsserter.assert_instance_of("MergeStrategies.merge 'merge' parameter", merge_t, merge)
30
+ return merge if merge.is_a?(MergeStrategy)
31
+ merge = :first if merge.nil?
32
+ TypeAsserter.assert_instance_of("MergeStrategy 'merge' parameter", merge_t, merge)
29
33
  if merge.is_a?(Hash)
30
34
  merge_strategy = merge['strategy']
31
35
  if merge_strategy.nil?
@@ -82,7 +86,7 @@ module Puppet::Pops
82
86
  @options = options
83
87
  end
84
88
 
85
- # Merges the elements of _e1_ and _e2_ accoring to the implemented strategy and options given when this
89
+ # Merges the elements of _e1_ and _e2_ according to the rules of this strategy and options given when this
86
90
  # instance was created
87
91
  #
88
92
  # @param e1 [Object] The first element
@@ -95,6 +99,33 @@ module Puppet::Pops
95
99
  assert_type('e2', value_t, e2))
96
100
  end
97
101
 
102
+ # Merges the result of yielding the given _lookup_variants_ to a given block.
103
+ #
104
+ # @param lookup_variants [Array] The variants to pass as second argument to the given block
105
+ # @return [Object] the merged value.
106
+ # @yield [} ]
107
+ # @yieldparam variant [Object] each variant given in the _lookup_variants_ array.
108
+ # @yieldreturn [Object] the value to merge with other values
109
+ # @throws :no_such_key if the lookup was unsuccessful
110
+ #
111
+ def merge_lookup(lookup_variants)
112
+ result = lookup_variants.reduce(NOT_FOUND) do |memo, lookup_variant|
113
+ not_found = true
114
+ value = catch(:no_such_key) do
115
+ v = yield(lookup_variant)
116
+ not_found = false
117
+ v
118
+ end
119
+ if not_found
120
+ memo
121
+ else
122
+ memo.equal?(NOT_FOUND) ? convert_value(value) : merge(memo, value)
123
+ end
124
+ end
125
+ throw :no_such_key if result == NOT_FOUND
126
+ result
127
+ end
128
+
98
129
  # Converts a single value to the type expeced when peforming a merge of two elements
99
130
  # @param value [Object] the value to convert
100
131
  # @return [Object] the converted value
@@ -102,12 +133,20 @@ module Puppet::Pops
102
133
  value
103
134
  end
104
135
 
105
- protected
106
-
107
136
  def options
108
137
  @options
109
138
  end
110
139
 
140
+ def configuration
141
+ if @options.nil? || @options.empty?
142
+ self.class.key.to_s
143
+ else
144
+ @options.include?('strategy') ? @options : { 'strategy' => self.class.key.to_s }.merge(@options)
145
+ end
146
+ end
147
+
148
+ protected
149
+
111
150
  # Returns the type used to validate the options hash
112
151
  #
113
152
  # @return [Puppet::Pops::Types::PStructType] the puppet type
@@ -133,6 +172,35 @@ module Puppet::Pops
133
172
  end
134
173
  end
135
174
 
175
+ # Simple strategy that returns the first value found. It never merges any values.
176
+ #
177
+ class FirstFoundStrategy < MergeStrategy
178
+ def self.key
179
+ :first
180
+ end
181
+
182
+ # Returns the first value found
183
+ #
184
+ # @param lookup_variants [Array] The variants to pass as second argument to the given block
185
+ # @return [Object] the merged value
186
+ # @throws :no_such_key unless the lookup was successful
187
+ #
188
+ def merge_lookup(lookup_variants)
189
+ lookup_variants.each do |lookup_variant|
190
+ catch(:no_such_key) { return yield(lookup_variant) }
191
+ end
192
+ throw :no_such_key
193
+ end
194
+
195
+ protected
196
+
197
+ def value_t
198
+ @value_t ||= Puppet::Pops::Types::PAnyType::DEFAULT
199
+ end
200
+
201
+ MergeStrategy.add_strategy(self)
202
+ end
203
+
136
204
  # Produces a new hash by merging hash e1 with hash e2 in such a way that the values of duplicate keys
137
205
  # will be those of e1
138
206
  #
@@ -53,6 +53,14 @@ class Puppet::Pops::Model::Factory
53
53
 
54
54
  # Building of Model classes
55
55
 
56
+ def build_Application(o, n, ps, body)
57
+ o.name = n
58
+ ps.each { |p| o.addParameters(build(p)) }
59
+ b = f_build_body(body)
60
+ o.body = b.current if b
61
+ o
62
+ end
63
+
56
64
  def build_ArithmeticExpression(o, op, a, b)
57
65
  o.operator = op
58
66
  build_BinaryExpression(o, a, b)
@@ -231,6 +239,15 @@ class Puppet::Pops::Model::Factory
231
239
  o
232
240
  end
233
241
 
242
+ def build_CapabilityMapping(o, kind, component, capability, mappings)
243
+ o.kind = kind
244
+ component = component.current if component.is_a?(Puppet::Pops::Model::Factory)
245
+ o.component = component
246
+ o.capability = capability
247
+ o.mappings = mappings.map { |m| build(m) }
248
+ o
249
+ end
250
+
234
251
  # @param o [Model::NodeDefinition]
235
252
  # @param hosts [Array<Expression>] host matches
236
253
  # @param parent [Expression] parent node matcher
@@ -243,6 +260,14 @@ class Puppet::Pops::Model::Factory
243
260
  o
244
261
  end
245
262
 
263
+ # @param o [Model::SiteDefinition]
264
+ # @param body [Object] see {#f_build_body}
265
+ def build_SiteDefinition(o, body)
266
+ b = f_build_body(body)
267
+ o.body = b.current if b
268
+ o
269
+ end
270
+
246
271
  def build_Parameter(o, name, expr)
247
272
  o.name = name
248
273
  o.value = build(expr) if expr # don't build a nil/nop
@@ -584,6 +609,7 @@ class Puppet::Pops::Model::Factory
584
609
 
585
610
  def self.NODE(hosts, parent, body); new(Model::NodeDefinition, hosts, parent, body); end
586
611
 
612
+ def self.SITE(body); new(Model::SiteDefinition, body); end
587
613
 
588
614
  # Parameters
589
615
 
@@ -755,6 +781,14 @@ class Puppet::Pops::Model::Factory
755
781
  new(Model::ResourceTypeDefinition, name, parameters, body)
756
782
  end
757
783
 
784
+ def self.CAPABILITY_MAPPING(kind, component, cap_name, mappings)
785
+ new(Model::CapabilityMapping, kind, component, cap_name, mappings)
786
+ end
787
+
788
+ def self.APPLICATION(name, parameters, body)
789
+ new(Model::Application, name, parameters, body)
790
+ end
791
+
758
792
  def self.FUNCTION(name, parameters, body)
759
793
  new(Model::FunctionDefinition, name, parameters, body)
760
794
  end
@@ -2,7 +2,9 @@
2
2
  # As an example, if object is an ArithmeticExpression with operator +, `#a_an(o)` produces "a '+' Expression",
3
3
  # #the(o) produces "the + Expression", and #label produces "+ Expression".
4
4
  #
5
- class Puppet::Pops::Model::ModelLabelProvider < Puppet::Pops::LabelProvider
5
+ class Puppet::Pops::Model::ModelLabelProvider
6
+ include Puppet::Pops::LabelProvider
7
+
6
8
  def initialize
7
9
  @@label_visitor ||= Puppet::Pops::Visitor.new(self,"label",0,0)
8
10
  end
@@ -56,6 +58,7 @@ class Puppet::Pops::Model::ModelLabelProvider < Puppet::Pops::LabelProvider
56
58
  def label_HeredocExpression o ; "'@(#{o.syntax})' expression" end
57
59
  def label_HostClassDefinition o ; "Host Class Definition" end
58
60
  def label_NodeDefinition o ; "Node Definition" end
61
+ def label_SiteDefinition o ; "Site Definition" end
59
62
  def label_ResourceTypeDefinition o ; "'define' expression" end
60
63
  def label_ResourceOverrideExpression o ; "Resource Override" end
61
64
  def label_Parameter o ; "Parameter Definition" end
@@ -64,6 +67,7 @@ class Puppet::Pops::Model::ModelLabelProvider < Puppet::Pops::LabelProvider
64
67
  def label_UnlessExpression o ; "'unless' Statement" end
65
68
  def label_CallNamedFunctionExpression o ; "Function Call" end
66
69
  def label_CallMethodExpression o ; "Method call" end
70
+ def label_CapabilityMapping o ; "Capability Mapping" end
67
71
  def label_CaseExpression o ; "'case' statement" end
68
72
  def label_CaseOption o ; "Case Option" end
69
73
  def label_RenderStringExpression o ; "Epp Text" end
@@ -97,6 +101,11 @@ class Puppet::Pops::Model::ModelLabelProvider < Puppet::Pops::LabelProvider
97
101
  end
98
102
  end
99
103
 
104
+ def label_Resource o
105
+ 'Resource Statement'
106
+ end
107
+
108
+
100
109
  def label_Class o
101
110
  if o <= Puppet::Pops::Types::PAnyType
102
111
  simple_name = o.name.split('::').last
@@ -291,6 +291,9 @@ module Puppet::Pops::Model
291
291
  class ResourceTypeDefinition < NamedDefinition
292
292
  end
293
293
 
294
+ class Application < NamedDefinition
295
+ end
296
+
294
297
  # A node definition matches hosts using Strings, or Regular expressions. It may inherit from
295
298
  # a parent node (also using a String or Regular expression).
296
299
  #
@@ -300,6 +303,10 @@ module Puppet::Pops::Model
300
303
  contains_one_uni 'body', Expression
301
304
  end
302
305
 
306
+ class SiteDefinition < Definition
307
+ contains_one_uni 'body', Expression
308
+ end
309
+
303
310
  class LocatableExpression < Expression
304
311
  has_many_attr 'line_offsets', Integer
305
312
  has_attr 'locator', Object, :lowerBound => 1, :transient => true
@@ -534,6 +541,14 @@ module Puppet::Pops::Model
534
541
  contains_many_uni 'bodies', ResourceBody
535
542
  end
536
543
 
544
+ class CapabilityMapping < Definition
545
+ # 'produces' or 'consumes'
546
+ has_attr 'kind', String, :lowerBound => 1
547
+ has_attr 'capability', String, :lowerBound => 1
548
+ contains_one_uni 'component', Expression, :lowerBound => 1
549
+ contains_many_uni 'mappings', AbstractAttributeOperation
550
+ end
551
+
537
552
  # A resource defaults sets defaults for a resource type. This class inherits from AbstractResource
538
553
  # but does only support the :regular form (this is intentional to be able to produce better error messages
539
554
  # when illegal forms are applied to a model.
@@ -32,6 +32,10 @@ class Puppet::Pops::Model::ModelTreeDumper < Puppet::Pops::Model::TreeDumper
32
32
  do_dump(o.current)
33
33
  end
34
34
 
35
+ def dump_Application o
36
+ ["application", o.name, do_dump(o.parameters), do_dump(o.body)]
37
+ end
38
+
35
39
  def dump_ArithmeticExpression o
36
40
  [o.operator.to_s, do_dump(o.left_expr), do_dump(o.right_expr)]
37
41
  end
@@ -230,6 +234,16 @@ class Puppet::Pops::Model::ModelTreeDumper < Puppet::Pops::Model::TreeDumper
230
234
  result
231
235
  end
232
236
 
237
+ def dump_SiteDefinition o
238
+ result = ["site"]
239
+ if o.body
240
+ result << do_dump(o.body)
241
+ else
242
+ result << []
243
+ end
244
+ result
245
+ end
246
+
233
247
  def dump_NamedDefinition o
234
248
  # the nil must be replaced with a string
235
249
  result = [nil, o.name]
@@ -248,6 +262,10 @@ class Puppet::Pops::Model::ModelTreeDumper < Puppet::Pops::Model::TreeDumper
248
262
  result
249
263
  end
250
264
 
265
+ def dump_CapabilityMapping o
266
+ [o.kind, do_dump(o.component), o.capability, do_dump(o.mappings)]
267
+ end
268
+
251
269
  def dump_ResourceOverrideExpression o
252
270
  form = o.form == :regular ? '' : o.form.to_s + "-"
253
271
  result = [form+"override", do_dump(o.resources), :indent]
@@ -8,9 +8,21 @@ class Puppet::Pops::Parser::CodeMerger
8
8
  # this is a bit brute force as the result is already 3x ast with wrapped 4x content
9
9
  # this could be combined in a more elegant way, but it is only used to process a handful of files
10
10
  # at the beginning of a puppet run. TODO: Revisit for Puppet 4x when there is no 3x ast at the top.
11
+ # PUP-5299, some sites have thousands of entries, and run out of stack when evaluating - the logic
12
+ # below maps the logic as flatly as possible.
11
13
  #
12
14
  children = parse_results.select {|x| !x.nil? && x.code}.reduce([]) do |memo, parsed_class|
13
- memo << parsed_class.code
15
+ case parsed_class.code
16
+ when Puppet::Parser::AST::BlockExpression
17
+ # the BlockExpression wraps a single 4x instruction that is most likely wrapped in a Factory
18
+ memo += parsed_class.code.children.map {|c| c.is_a?(Puppet::Pops::Model::Factory) ? c.model : c }
19
+ when Puppet::Pops::Model::Factory
20
+ # If it is a 4x instruction wrapped in a Factory
21
+ memo += parsed_class.code.model
22
+ else
23
+ # It is the instruction directly
24
+ memo << parsed_class.code
25
+ end
14
26
  end
15
27
  Puppet::Parser::AST::BlockExpression.new(:children => children)
16
28
  end
@@ -22,7 +22,8 @@ token RENDER_STRING RENDER_EXPR EPP_START EPP_END EPP_END_TRIM
22
22
  token FUNCTION
23
23
  token PRIVATE ATTR TYPE
24
24
  token FUNCTION
25
- token APPLICATION_R CONSUMES_R PRODUCES_R
25
+ token APPLICATION_R CONSUMES_R PRODUCES_R SITE_R
26
+ token APPLICATION PRODUCES CONSUMES SITE
26
27
  token LOW
27
28
 
28
29
  prechigh
@@ -193,8 +194,9 @@ resource
193
194
  #
194
195
  expression
195
196
  : primary_expression
197
+ | capability_mapping
196
198
  | call_function_expression
197
- | expression LBRACK expressions RBRACK =LBRACK { result = val[0][*val[2]] ; loc result, val[0], val[3] }
199
+ | bracketed_expression
198
200
  | expression IN expression { result = val[0].in val[2] ; loc result, val[1] }
199
201
  | expression MATCH expression { result = val[0] =~ val[2] ; loc result, val[1] }
200
202
  | expression NOMATCH expression { result = val[0].mne val[2] ; loc result, val[1] }
@@ -219,6 +221,8 @@ expression
219
221
  | expression QMARK selector_entries { result = val[0].select(*val[2]) ; loc result, val[0] }
220
222
  | LPAREN assignment RPAREN { result = val[1].paren() ; loc result, val[0] }
221
223
 
224
+ bracketed_expression
225
+ : expression LBRACK expressions endcomma RBRACK =LBRACK { result = val[0][*val[2]] ; loc result, val[0], val[4] }
222
226
 
223
227
  #---EXPRESSIONS
224
228
  # (i.e. "argument list")
@@ -238,8 +242,12 @@ primary_expression
238
242
  | if_expression
239
243
  | unless_expression
240
244
  | definition_expression
245
+ # @todo lutter 2014-09-03: application declarations must be at the toplevel
246
+ # in a manifest - Should be validated, not handled here. helindbe 2015-09-10
247
+ | application_expression
241
248
  | hostclass_expression
242
249
  | node_definition_expression
250
+ | site_definition_expression
243
251
  | epp_render_expression
244
252
  | function_definition
245
253
  | reserved_word
@@ -459,7 +467,7 @@ attribute_operations
459
467
  | APPLICATION_R
460
468
  | CONSUMES_R
461
469
  | PRODUCES_R
462
- # | BOOLEAN
470
+ | SITE_R
463
471
 
464
472
  # In this version, illegal combinations are validated instead of producing syntax errors
465
473
  # (Can give nicer error message "+> is not applicable to...")
@@ -492,6 +500,33 @@ definition_expression
492
500
  end
493
501
  }
494
502
 
503
+ #---APPLICATION
504
+ application_expression
505
+ : APPLICATION classname parameter_list LBRACE opt_statements RBRACE {
506
+ result = add_definition(Factory.APPLICATION(classname(val[1][:value]), val[2], val[4]))
507
+ loc result, val[0], val[5]
508
+ }
509
+
510
+ capability_mapping
511
+ : classname capability_kw classname LBRACE attribute_operations endcomma RBRACE {
512
+ result = Factory.CAPABILITY_MAPPING(val[1][:value],
513
+ Factory.QNAME(classname(val[0][:value])),
514
+ classname(val[2][:value]), val[4])
515
+ loc result, val[0], val[6]
516
+ add_mapping(result)
517
+ }
518
+ | bracketed_expression capability_kw classname LBRACE attribute_operations endcomma RBRACE {
519
+ result = Factory.CAPABILITY_MAPPING(val[1][:value],
520
+ val[0],
521
+ classname(val[2][:value]), val[4])
522
+ loc result, val[0], val[6]
523
+ add_mapping(result)
524
+ }
525
+
526
+ capability_kw
527
+ : PRODUCES
528
+ | CONSUMES
529
+
495
530
  #---HOSTCLASS
496
531
  #
497
532
  # Produces Model::HostClassDefinition
@@ -528,6 +563,20 @@ hostclass_expression
528
563
  : classname
529
564
  | DEFAULT
530
565
 
566
+ #---SITE
567
+ #
568
+ # Produces Model::SiteDefinition
569
+ #
570
+ site_definition_expression
571
+ : SITE LBRACE statements RBRACE {
572
+ result = add_definition(Factory.SITE(val[2]))
573
+ loc result, val[0], val[3]
574
+ }
575
+ | SITE LBRACE RBRACE {
576
+ result = add_definition(Factory.SITE(nil))
577
+ loc result, val[0], val[2]
578
+ }
579
+
531
580
  #---NODE
532
581
  #
533
582
  # Produces Model::NodeDefinition
@@ -590,6 +639,7 @@ classname
590
639
  | APPLICATION_R
591
640
  | CONSUMES_R
592
641
  | PRODUCES_R
642
+ | SITE_R
593
643
  | CLASS { error val[0], "'class' is not a valid classname" }
594
644
 
595
645
  # Produces Array<Model::Parameter>
@@ -640,6 +690,7 @@ reserved_word
640
690
  | APPLICATION_R { result = Factory.RESERVED(val[0][:value], true) ; loc result, val[0] }
641
691
  | CONSUMES_R { result = Factory.RESERVED(val[0][:value], true) ; loc result, val[0] }
642
692
  | PRODUCES_R { result = Factory.RESERVED(val[0][:value], true) ; loc result, val[0] }
693
+ | SITE_R { result = Factory.RESERVED(val[0][:value], true) ; loc result, val[0] }
643
694
 
644
695
  #---LITERALS (dynamic and static)
645
696
  #
@@ -744,6 +795,8 @@ keyword
744
795
  | ATTR
745
796
  | FUNCTION
746
797
  | PRIVATE
798
+ | APPLICATION
799
+ | PRODUCES
747
800
 
748
801
  nil
749
802
  : { result = nil}