puppet 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. data/CONTRIBUTING.md +1 -1
  2. data/Gemfile +5 -7
  3. data/README.md +1 -1
  4. data/Rakefile +20 -0
  5. data/ext/debian/puppet.init +0 -1
  6. data/ext/debian/puppet.logrotate +14 -5
  7. data/ext/osx/puppet.plist +2 -4
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/redhat/client.init +65 -12
  10. data/ext/redhat/logrotate +15 -3
  11. data/ext/redhat/puppet.spec.erb +5 -1
  12. data/ext/redhat/server.init +1 -1
  13. data/ext/solaris/smf/puppet +44 -0
  14. data/ext/solaris/smf/puppet.xml +44 -0
  15. data/ext/suse/client.init +27 -27
  16. data/ext/suse/server.init +2 -2
  17. data/ext/systemd/puppet.service +1 -0
  18. data/install.rb +21 -39
  19. data/lib/hiera/puppet_function.rb +5 -5
  20. data/lib/puppet/agent/locker.rb +11 -2
  21. data/lib/puppet/agent.rb +4 -4
  22. data/lib/puppet/application/agent.rb +28 -14
  23. data/lib/puppet/application/apply.rb +17 -4
  24. data/lib/puppet/application/cert.rb +16 -0
  25. data/lib/puppet/application/filebucket.rb +78 -4
  26. data/lib/puppet/application/lookup.rb +356 -0
  27. data/lib/puppet/application/master.rb +5 -1
  28. data/lib/puppet/configurer.rb +9 -5
  29. data/lib/puppet/context/trusted_information.rb +21 -1
  30. data/lib/puppet/context.rb +16 -1
  31. data/lib/puppet/daemon.rb +17 -13
  32. data/lib/puppet/data_binding.rb +4 -2
  33. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  34. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  35. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  36. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  37. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  38. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  39. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  40. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  41. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  42. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  43. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  44. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  45. data/lib/puppet/data_providers.rb +12 -13
  46. data/lib/puppet/defaults.rb +14 -3
  47. data/lib/puppet/environments.rb +94 -6
  48. data/lib/puppet/error.rb +4 -0
  49. data/lib/puppet/face/module/changes.rb +2 -1
  50. data/lib/puppet/feature/cfacter.rb +1 -0
  51. data/lib/puppet/file_bucket/dipper.rb +58 -2
  52. data/lib/puppet/file_system/windows.rb +3 -1
  53. data/lib/puppet/functions/assert_type.rb +48 -12
  54. data/lib/puppet/functions/defined.rb +79 -48
  55. data/lib/puppet/functions/each.rb +85 -27
  56. data/lib/puppet/functions/epp.rb +29 -37
  57. data/lib/puppet/functions/filter.rb +60 -25
  58. data/lib/puppet/functions/hiera.rb +76 -3
  59. data/lib/puppet/functions/hiera_array.rb +65 -3
  60. data/lib/puppet/functions/hiera_hash.rb +74 -2
  61. data/lib/puppet/functions/hiera_include.rb +77 -4
  62. data/lib/puppet/functions/inline_epp.rb +44 -71
  63. data/lib/puppet/functions/lookup.rb +19 -17
  64. data/lib/puppet/functions/map.rb +56 -21
  65. data/lib/puppet/functions/match.rb +29 -12
  66. data/lib/puppet/functions/reduce.rb +95 -58
  67. data/lib/puppet/functions/versioncmp.rb +36 -0
  68. data/lib/puppet/functions/with.rb +15 -7
  69. data/lib/puppet/functions.rb +2 -4
  70. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  71. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  72. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  73. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  74. data/lib/puppet/indirector/hiera.rb +4 -0
  75. data/lib/puppet/indirector/indirection.rb +6 -1
  76. data/lib/puppet/indirector/json.rb +1 -1
  77. data/lib/puppet/indirector/msgpack.rb +1 -1
  78. data/lib/puppet/indirector/request.rb +7 -8
  79. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  80. data/lib/puppet/info_service/class_information_service.rb +111 -0
  81. data/lib/puppet/info_service.rb +7 -0
  82. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  83. data/lib/puppet/module_tool/metadata.rb +32 -9
  84. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  85. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  86. data/lib/puppet/network/authconfig.rb +21 -1
  87. data/lib/puppet/network/authorization.rb +8 -1
  88. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  89. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  90. data/lib/puppet/node/environment.rb +9 -2
  91. data/lib/puppet/node.rb +11 -5
  92. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  93. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  94. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  95. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  96. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  97. data/lib/puppet/parser/compiler.rb +300 -12
  98. data/lib/puppet/parser/environment_compiler.rb +165 -0
  99. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  100. data/lib/puppet/parser/functions/defined.rb +105 -68
  101. data/lib/puppet/parser/functions/each.rb +85 -27
  102. data/lib/puppet/parser/functions/epp.rb +29 -37
  103. data/lib/puppet/parser/functions/filter.rb +59 -23
  104. data/lib/puppet/parser/functions/hiera.rb +83 -27
  105. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  106. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  107. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  108. data/lib/puppet/parser/functions/inline_epp.rb +35 -60
  109. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  110. data/lib/puppet/parser/functions/map.rb +55 -20
  111. data/lib/puppet/parser/functions/match.rb +27 -12
  112. data/lib/puppet/parser/functions/reduce.rb +97 -60
  113. data/lib/puppet/parser/functions/with.rb +16 -8
  114. data/lib/puppet/parser/resource.rb +103 -21
  115. data/lib/puppet/parser.rb +3 -0
  116. data/lib/puppet/plugins/configuration.rb +3 -2
  117. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  118. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  119. data/lib/puppet/plugins/data_providers.rb +12 -60
  120. data/lib/puppet/pops/adapters.rb +12 -0
  121. data/lib/puppet/pops/binder/binder.rb +2 -2
  122. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  123. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  124. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  125. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  126. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  127. data/lib/puppet/pops/binder/injector.rb +4 -4
  128. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  129. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  130. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  131. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  132. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  133. data/lib/puppet/pops/evaluator/evaluator_impl.rb +10 -6
  134. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  135. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  136. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  137. data/lib/puppet/pops/issues.rb +11 -3
  138. data/lib/puppet/pops/label_provider.rb +1 -1
  139. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  140. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  141. data/lib/puppet/pops/lookup.rb +25 -47
  142. data/lib/puppet/pops/merge_strategy.rb +73 -5
  143. data/lib/puppet/pops/model/factory.rb +38 -3
  144. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  145. data/lib/puppet/pops/model/model_meta.rb +19 -1
  146. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  147. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  148. data/lib/puppet/pops/parser/egrammar.ra +65 -2
  149. data/lib/puppet/pops/parser/eparser.rb +1569 -1241
  150. data/lib/puppet/pops/parser/lexer2.rb +32 -1
  151. data/lib/puppet/pops/parser/locator.rb +1 -1
  152. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  153. data/lib/puppet/pops/patterns.rb +3 -0
  154. data/lib/puppet/pops/types/enumeration.rb +1 -2
  155. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  156. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  157. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  158. data/lib/puppet/pops/types/type_factory.rb +87 -148
  159. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  160. data/lib/puppet/pops/types/type_parser.rb +118 -129
  161. data/lib/puppet/pops/types/types.rb +1394 -255
  162. data/lib/puppet/pops/types/types_meta.rb +0 -234
  163. data/lib/puppet/pops/validation/checker4_0.rb +49 -1
  164. data/lib/puppet/pops/validation/validator_factory_4_0.rb +3 -1
  165. data/lib/puppet/pops/validation.rb +7 -2
  166. data/lib/puppet/pops.rb +19 -17
  167. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  168. data/lib/puppet/provider/exec.rb +6 -1
  169. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  170. data/lib/puppet/provider/package/dnf.rb +41 -0
  171. data/lib/puppet/provider/package/gem.rb +7 -2
  172. data/lib/puppet/provider/package/nim.rb +1 -1
  173. data/lib/puppet/provider/package/rpm.rb +1 -0
  174. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  175. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  176. data/lib/puppet/provider/package/windows/package.rb +9 -1
  177. data/lib/puppet/provider/package/yum.rb +20 -9
  178. data/lib/puppet/provider/service/bsd.rb +1 -1
  179. data/lib/puppet/provider/service/debian.rb +21 -0
  180. data/lib/puppet/provider/service/init.rb +6 -0
  181. data/lib/puppet/provider/service/launchd.rb +36 -7
  182. data/lib/puppet/provider/service/rcng.rb +51 -0
  183. data/lib/puppet/provider/service/redhat.rb +2 -1
  184. data/lib/puppet/provider/service/smf.rb +43 -2
  185. data/lib/puppet/provider/service/src.rb +27 -0
  186. data/lib/puppet/provider/service/systemd.rb +25 -5
  187. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  188. data/lib/puppet/provider/zone/solaris.rb +2 -2
  189. data/lib/puppet/reference/configuration.rb +10 -4
  190. data/lib/puppet/reference/report.rb +9 -12
  191. data/lib/puppet/reports.rb +5 -1
  192. data/lib/puppet/resource/capability_finder.rb +95 -0
  193. data/lib/puppet/resource/catalog.rb +47 -7
  194. data/lib/puppet/resource/status.rb +0 -2
  195. data/lib/puppet/resource/type.rb +238 -44
  196. data/lib/puppet/resource/type_collection.rb +60 -2
  197. data/lib/puppet/resource.rb +50 -73
  198. data/lib/puppet/settings/file_setting.rb +10 -9
  199. data/lib/puppet/settings.rb +2 -2
  200. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  201. data/lib/puppet/ssl/oids.rb +9 -1
  202. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  203. data/lib/puppet/transaction/resource_harness.rb +9 -4
  204. data/lib/puppet/transaction.rb +8 -1
  205. data/lib/puppet/type/augeas.rb +8 -0
  206. data/lib/puppet/type/file/source.rb +14 -12
  207. data/lib/puppet/type/package.rb +9 -6
  208. data/lib/puppet/type/user.rb +4 -2
  209. data/lib/puppet/type.rb +78 -7
  210. data/lib/puppet/util/command_line.rb +4 -0
  211. data/lib/puppet/util/execution.rb +18 -2
  212. data/lib/puppet/util/tagging.rb +7 -1
  213. data/lib/puppet/util/windows/adsi.rb +5 -2
  214. data/lib/puppet/util/windows/security.rb +4 -1
  215. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  216. data/lib/puppet/util.rb +9 -1
  217. data/lib/puppet/version.rb +1 -1
  218. data/lib/puppet.rb +12 -0
  219. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  220. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  224. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  225. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  226. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  227. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  228. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  229. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  230. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  231. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  232. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  233. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  234. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  235. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  236. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  237. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  238. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  239. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  240. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  241. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  242. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  243. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  244. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  245. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  246. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  247. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  248. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  249. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  250. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  251. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  252. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  253. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  254. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  255. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  256. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  257. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  258. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  259. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  260. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  261. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  262. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  263. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  264. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  265. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  266. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  267. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  268. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  269. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  270. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  271. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  272. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  273. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  274. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  275. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  276. data/spec/integration/data_binding_spec.rb +229 -0
  277. data/spec/integration/file_bucket/file_spec.rb +2 -2
  278. data/spec/integration/parser/compiler_spec.rb +30 -24
  279. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  280. data/spec/integration/parser/undef_param_spec.rb +1 -1
  281. data/spec/integration/provider/package_spec.rb +3 -1
  282. data/spec/integration/resource/catalog_spec.rb +1 -1
  283. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  284. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  285. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  286. data/spec/integration/ssl/host_spec.rb +0 -1
  287. data/spec/integration/type/package_spec.rb +2 -0
  288. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  289. data/spec/integration/util/windows/security_spec.rb +18 -0
  290. data/spec/lib/matchers/include_in_order.rb +2 -2
  291. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  292. data/spec/spec_helper.rb +7 -0
  293. data/spec/unit/agent/locker_spec.rb +4 -4
  294. data/spec/unit/agent_spec.rb +0 -8
  295. data/spec/unit/application/agent_spec.rb +5 -0
  296. data/spec/unit/application/apply_spec.rb +9 -1
  297. data/spec/unit/application/filebucket_spec.rb +88 -2
  298. data/spec/unit/application/lookup_spec.rb +195 -0
  299. data/spec/unit/application/master_spec.rb +2 -2
  300. data/spec/unit/application_spec.rb +3 -3
  301. data/spec/unit/appmgmt_spec.rb +657 -0
  302. data/spec/unit/capability_spec.rb +414 -0
  303. data/spec/unit/configurer_spec.rb +7 -1
  304. data/spec/unit/context/trusted_information_spec.rb +24 -1
  305. data/spec/unit/daemon_spec.rb +18 -8
  306. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  307. data/spec/unit/environments_spec.rb +2 -0
  308. data/spec/unit/face/node_spec.rb +1 -1
  309. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  310. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  311. data/spec/unit/file_system_spec.rb +20 -0
  312. data/spec/unit/functions/assert_type_spec.rb +5 -7
  313. data/spec/unit/functions/defined_spec.rb +2 -2
  314. data/spec/unit/functions/epp_spec.rb +2 -2
  315. data/spec/unit/functions/filter_spec.rb +18 -0
  316. data/spec/unit/functions/hiera_spec.rb +2 -2
  317. data/spec/unit/functions/lookup_spec.rb +200 -9
  318. data/spec/unit/functions/regsubst_spec.rb +17 -8
  319. data/spec/unit/functions/scanf_spec.rb +1 -1
  320. data/spec/unit/functions/split_spec.rb +2 -2
  321. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  322. data/spec/unit/functions4_spec.rb +58 -72
  323. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  325. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  326. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  328. data/spec/unit/indirector/indirection_spec.rb +13 -2
  329. data/spec/unit/indirector/request_spec.rb +8 -8
  330. data/spec/unit/indirector/ssl_file_spec.rb +1 -1
  331. data/spec/unit/indirector/yaml_spec.rb +1 -1
  332. data/spec/unit/info_service_spec.rb +236 -0
  333. data/spec/unit/module_tool/application_spec.rb +1 -1
  334. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  335. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  336. data/spec/unit/network/authconfig_spec.rb +62 -32
  337. data/spec/unit/network/authorization_spec.rb +30 -2
  338. data/spec/unit/network/authstore_spec.rb +1 -1
  339. data/spec/unit/network/http/compression_spec.rb +1 -1
  340. data/spec/unit/network/http/connection_spec.rb +14 -19
  341. data/spec/unit/network/http/handler_spec.rb +0 -5
  342. data/spec/unit/network/rights_spec.rb +3 -3
  343. data/spec/unit/node_spec.rb +27 -0
  344. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  345. data/spec/unit/parser/compiler_spec.rb +86 -2
  346. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  347. data/spec/unit/parser/resource_spec.rb +2 -20
  348. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  349. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  350. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  351. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  352. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +20 -11
  353. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  354. data/spec/unit/pops/label_provider_spec.rb +5 -1
  355. data/spec/unit/pops/parser/lexer2_spec.rb +39 -0
  356. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  357. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  358. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  359. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  360. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  361. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  362. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  363. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  364. data/spec/unit/pops/types/type_parser_spec.rb +15 -12
  365. data/spec/unit/pops/validator/validator_spec.rb +68 -0
  366. data/spec/unit/property_spec.rb +1 -1
  367. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  368. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  369. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  370. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  371. data/spec/unit/provider/package/gem_spec.rb +7 -0
  372. data/spec/unit/provider/package/nim_spec.rb +6 -6
  373. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  374. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  375. data/spec/unit/provider/package/yum_spec.rb +35 -12
  376. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  377. data/spec/unit/provider/service/debian_spec.rb +28 -0
  378. data/spec/unit/provider/service/gentoo_spec.rb +1 -0
  379. data/spec/unit/provider/service/init_spec.rb +6 -0
  380. data/spec/unit/provider/service/launchd_spec.rb +85 -10
  381. data/spec/unit/provider/service/openrc_spec.rb +1 -0
  382. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  383. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  384. data/spec/unit/provider/service/smf_spec.rb +30 -5
  385. data/spec/unit/provider/service/src_spec.rb +20 -4
  386. data/spec/unit/provider/service/systemd_spec.rb +79 -29
  387. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -1
  388. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +2 -1
  390. data/spec/unit/provider/zone/solaris_spec.rb +19 -0
  391. data/spec/unit/reports_spec.rb +10 -0
  392. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  393. data/spec/unit/resource/catalog_spec.rb +31 -8
  394. data/spec/unit/resource/type_collection_spec.rb +23 -2
  395. data/spec/unit/resource/type_spec.rb +1 -1
  396. data/spec/unit/resource_spec.rb +23 -5
  397. data/spec/unit/settings/file_setting_spec.rb +31 -0
  398. data/spec/unit/settings_spec.rb +91 -2
  399. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  400. data/spec/unit/ssl/certificate_authority_spec.rb +5 -3
  401. data/spec/unit/ssl/host_spec.rb +2 -2
  402. data/spec/unit/ssl/oids_spec.rb +8 -0
  403. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  404. data/spec/unit/transaction/report_spec.rb +24 -1
  405. data/spec/unit/transaction_spec.rb +7 -0
  406. data/spec/unit/type/exec_spec.rb +16 -8
  407. data/spec/unit/type/host_spec.rb +4 -4
  408. data/spec/unit/type/package_spec.rb +1 -0
  409. data/spec/unit/type/tidy_spec.rb +4 -4
  410. data/spec/unit/type/user_spec.rb +14 -7
  411. data/spec/unit/type/vlan_spec.rb +1 -1
  412. data/spec/unit/type_spec.rb +1 -1
  413. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  414. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  415. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  416. data/spec/unit/util/network_device_spec.rb +1 -1
  417. data/spec/unit/util/storage_spec.rb +5 -1
  418. data/spec/unit/util/windows/adsi_spec.rb +13 -0
  419. data/spec/unit/util_spec.rb +21 -2
  420. metadata +173 -7
  421. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  422. 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)
@@ -151,8 +159,9 @@ class Puppet::Pops::Model::Factory
151
159
  o
152
160
  end
153
161
 
154
- def build_ReservedWord(o, name)
162
+ def build_ReservedWord(o, name, future)
155
163
  o.word = name
164
+ o.future = future
156
165
  o
157
166
  end
158
167
 
@@ -230,6 +239,15 @@ class Puppet::Pops::Model::Factory
230
239
  o
231
240
  end
232
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
+
233
251
  # @param o [Model::NodeDefinition]
234
252
  # @param hosts [Array<Expression>] host matches
235
253
  # @param parent [Expression] parent node matcher
@@ -242,6 +260,14 @@ class Puppet::Pops::Model::Factory
242
260
  o
243
261
  end
244
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
+
245
271
  def build_Parameter(o, name, expr)
246
272
  o.name = name
247
273
  o.value = build(expr) if expr # don't build a nil/nop
@@ -583,6 +609,7 @@ class Puppet::Pops::Model::Factory
583
609
 
584
610
  def self.NODE(hosts, parent, body); new(Model::NodeDefinition, hosts, parent, body); end
585
611
 
612
+ def self.SITE(body); new(Model::SiteDefinition, body); end
586
613
 
587
614
  # Parameters
588
615
 
@@ -638,8 +665,8 @@ class Puppet::Pops::Model::Factory
638
665
  LAMBDA(params, new(Model::EppExpression, parameters_specified, body))
639
666
  end
640
667
 
641
- def self.RESERVED(name)
642
- new(Model::ReservedWord, name)
668
+ def self.RESERVED(name, future=false)
669
+ new(Model::ReservedWord, name, future)
643
670
  end
644
671
 
645
672
  # TODO: This is the same a fqn factory method, don't know if callers to fqn and QNAME can live with the
@@ -754,6 +781,14 @@ class Puppet::Pops::Model::Factory
754
781
  new(Model::ResourceTypeDefinition, name, parameters, body)
755
782
  end
756
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
+
757
792
  def self.FUNCTION(name, parameters, body)
758
793
  new(Model::FunctionDefinition, name, parameters, body)
759
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
@@ -467,9 +474,12 @@ module Puppet::Pops::Model
467
474
  has_attr 'value', String, :lowerBound => 1
468
475
  end
469
476
 
470
- # Represents a parsed reserved word
477
+ # Represents a parsed reserved word. If the 'future' attribute is true
478
+ # the ReserwedWord functions as a deprecation warning + string value
479
+ #
471
480
  class ReservedWord < LiteralValue
472
481
  has_attr 'word', String, :lowerBound => 1
482
+ has_attr 'future', Boolean
473
483
  end
474
484
 
475
485
  # A DSL CLASSREF (one or multiple parts separated by '::' where (at least) the first part starts with an upper case letter).
@@ -531,6 +541,14 @@ module Puppet::Pops::Model
531
541
  contains_many_uni 'bodies', ResourceBody
532
542
  end
533
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
+
534
552
  # A resource defaults sets defaults for a resource type. This class inherits from AbstractResource
535
553
  # but does only support the :regular form (this is intentional to be able to produce better error messages
536
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,6 +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 SITE_R
26
+ token APPLICATION PRODUCES CONSUMES SITE
25
27
  token LOW
26
28
 
27
29
  prechigh
@@ -192,8 +194,9 @@ resource
192
194
  #
193
195
  expression
194
196
  : primary_expression
197
+ | capability_mapping
195
198
  | call_function_expression
196
- | expression LBRACK expressions RBRACK =LBRACK { result = val[0][*val[2]] ; loc result, val[0], val[3] }
199
+ | bracketed_expression
197
200
  | expression IN expression { result = val[0].in val[2] ; loc result, val[1] }
198
201
  | expression MATCH expression { result = val[0] =~ val[2] ; loc result, val[1] }
199
202
  | expression NOMATCH expression { result = val[0].mne val[2] ; loc result, val[1] }
@@ -218,6 +221,8 @@ expression
218
221
  | expression QMARK selector_entries { result = val[0].select(*val[2]) ; loc result, val[0] }
219
222
  | LPAREN assignment RPAREN { result = val[1].paren() ; loc result, val[0] }
220
223
 
224
+ bracketed_expression
225
+ : expression LBRACK expressions endcomma RBRACK =LBRACK { result = val[0][*val[2]] ; loc result, val[0], val[4] }
221
226
 
222
227
  #---EXPRESSIONS
223
228
  # (i.e. "argument list")
@@ -237,8 +242,12 @@ primary_expression
237
242
  | if_expression
238
243
  | unless_expression
239
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
240
248
  | hostclass_expression
241
249
  | node_definition_expression
250
+ | site_definition_expression
242
251
  | epp_render_expression
243
252
  | function_definition
244
253
  | reserved_word
@@ -455,7 +464,10 @@ attribute_operations
455
464
  attribute_name
456
465
  : NAME
457
466
  | keyword
458
- # | BOOLEAN
467
+ | APPLICATION_R
468
+ | CONSUMES_R
469
+ | PRODUCES_R
470
+ | SITE_R
459
471
 
460
472
  # In this version, illegal combinations are validated instead of producing syntax errors
461
473
  # (Can give nicer error message "+> is not applicable to...")
@@ -488,6 +500,33 @@ definition_expression
488
500
  end
489
501
  }
490
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
+
491
530
  #---HOSTCLASS
492
531
  #
493
532
  # Produces Model::HostClassDefinition
@@ -524,6 +563,20 @@ hostclass_expression
524
563
  : classname
525
564
  | DEFAULT
526
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
+
527
580
  #---NODE
528
581
  #
529
582
  # Produces Model::NodeDefinition
@@ -583,6 +636,10 @@ classname
583
636
  : NAME
584
637
  | WORD
585
638
  | CLASSREF
639
+ | APPLICATION_R
640
+ | CONSUMES_R
641
+ | PRODUCES_R
642
+ | SITE_R
586
643
  | CLASS { error val[0], "'class' is not a valid classname" }
587
644
 
588
645
  # Produces Array<Model::Parameter>
@@ -630,6 +687,10 @@ reserved_word
630
687
  : PRIVATE { result = Factory.RESERVED(val[0][:value]) ; loc result, val[0] }
631
688
  | TYPE { result = Factory.RESERVED(val[0][:value]) ; loc result, val[0] }
632
689
  | ATTR { result = Factory.RESERVED(val[0][:value]) ; loc result, val[0] }
690
+ | APPLICATION_R { result = Factory.RESERVED(val[0][:value], true) ; loc result, val[0] }
691
+ | CONSUMES_R { result = Factory.RESERVED(val[0][:value], true) ; loc result, val[0] }
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] }
633
694
 
634
695
  #---LITERALS (dynamic and static)
635
696
  #
@@ -734,6 +795,8 @@ keyword
734
795
  | ATTR
735
796
  | FUNCTION
736
797
  | PRIVATE
798
+ | APPLICATION
799
+ | PRODUCES
737
800
 
738
801
  nil
739
802
  : { result = nil}