puppet 3.2.4 → 3.3.0.rc2

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 (562) hide show
  1. data/COMMITTERS.md +101 -42
  2. data/Gemfile +15 -4
  3. data/README.md +5 -1
  4. data/README_DEVELOPER.md +117 -54
  5. data/Rakefile +4 -0
  6. data/ext/build_defaults.yaml +3 -2
  7. data/ext/debian/puppet-common.manpages +33 -1
  8. data/ext/gentoo/init.d/puppet +1 -1
  9. data/ext/gentoo/init.d/puppetmaster +1 -1
  10. data/ext/redhat/puppet.spec.erb +0 -1
  11. data/install.rb +2 -1
  12. data/lib/hiera/backend/puppet_backend.rb +1 -1
  13. data/lib/puppet/application.rb +10 -9
  14. data/lib/puppet/application/agent.rb +87 -93
  15. data/lib/puppet/application/apply.rb +0 -2
  16. data/lib/puppet/application/device.rb +3 -3
  17. data/lib/puppet/application/kick.rb +2 -2
  18. data/lib/puppet/application/master.rb +41 -19
  19. data/lib/puppet/application/queue.rb +5 -3
  20. data/lib/puppet/bindings.rb +147 -0
  21. data/lib/puppet/configurer.rb +25 -15
  22. data/lib/puppet/configurer/fact_handler.rb +2 -9
  23. data/lib/puppet/daemon.rb +44 -33
  24. data/lib/puppet/defaults.rb +57 -26
  25. data/lib/puppet/error.rb +1 -1
  26. data/lib/puppet/external/dot.rb +2 -2
  27. data/lib/puppet/external/nagios/base.rb +1 -6
  28. data/lib/puppet/external/pson/common.rb +2 -2
  29. data/lib/puppet/external/pson/pure/generator.rb +2 -2
  30. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  31. data/lib/puppet/face/ca.rb +1 -1
  32. data/lib/puppet/face/config.rb +1 -1
  33. data/lib/puppet/face/help.rb +2 -2
  34. data/lib/puppet/face/module/list.rb +2 -2
  35. data/lib/puppet/feature/rails.rb +1 -1
  36. data/lib/puppet/file_bucket/dipper.rb +0 -1
  37. data/lib/puppet/file_serving/base.rb +1 -1
  38. data/lib/puppet/file_serving/configuration/parser.rb +20 -14
  39. data/lib/puppet/forge.rb +0 -32
  40. data/lib/puppet/forge/cache.rb +1 -1
  41. data/lib/puppet/forge/errors.rb +3 -3
  42. data/lib/puppet/forge/repository.rb +7 -42
  43. data/lib/puppet/graph.rb +11 -0
  44. data/lib/puppet/graph/key.rb +26 -0
  45. data/lib/puppet/graph/prioritizer.rb +29 -0
  46. data/lib/puppet/graph/random_prioritizer.rb +16 -0
  47. data/lib/puppet/{rb_tree_map.rb → graph/rb_tree_map.rb} +3 -3
  48. data/lib/puppet/graph/relationship_graph.rb +246 -0
  49. data/lib/puppet/graph/sequential_prioritizer.rb +31 -0
  50. data/lib/puppet/{simple_graph.rb → graph/simple_graph.rb} +22 -3
  51. data/lib/puppet/graph/title_hash_prioritizer.rb +16 -0
  52. data/lib/puppet/indirector.rb +2 -2
  53. data/lib/puppet/indirector/catalog/compiler.rb +10 -7
  54. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -0
  55. data/lib/puppet/indirector/certificate/rest.rb +1 -1
  56. data/lib/puppet/indirector/exec.rb +1 -1
  57. data/lib/puppet/indirector/facts/facter.rb +2 -2
  58. data/lib/puppet/indirector/facts/inventory_active_record.rb +0 -1
  59. data/lib/puppet/indirector/facts/network_device.rb +1 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +0 -1
  61. data/lib/puppet/indirector/indirection.rb +2 -2
  62. data/lib/puppet/indirector/memory.rb +9 -0
  63. data/lib/puppet/indirector/node/ldap.rb +2 -4
  64. data/lib/puppet/indirector/report/processor.rb +1 -2
  65. data/lib/puppet/indirector/report/rest.rb +1 -1
  66. data/lib/puppet/indirector/request.rb +32 -10
  67. data/lib/puppet/indirector/resource/rest.rb +1 -1
  68. data/lib/puppet/indirector/resource_type/parser.rb +31 -12
  69. data/lib/puppet/interface.rb +1 -1
  70. data/lib/puppet/interface/documentation.rb +7 -11
  71. data/lib/puppet/interface/option.rb +1 -1
  72. data/lib/puppet/interface/option_builder.rb +1 -1
  73. data/lib/puppet/metatype/manager.rb +2 -2
  74. data/lib/puppet/module.rb +7 -1
  75. data/lib/puppet/module_tool.rb +1 -1
  76. data/lib/puppet/module_tool/applications/application.rb +10 -0
  77. data/lib/puppet/module_tool/applications/installer.rb +6 -3
  78. data/lib/puppet/module_tool/dependency.rb +2 -0
  79. data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
  80. data/lib/puppet/module_tool/metadata.rb +25 -13
  81. data/lib/puppet/module_tool/modulefile.rb +7 -7
  82. data/lib/puppet/module_tool/shared_behaviors.rb +4 -2
  83. data/lib/puppet/module_tool/skeleton.rb +1 -1
  84. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +5 -5
  85. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +5 -4
  86. data/lib/puppet/network/auth_config_parser.rb +3 -0
  87. data/lib/puppet/network/authconfig.rb +0 -1
  88. data/lib/puppet/network/authorization.rb +1 -1
  89. data/lib/puppet/network/authstore.rb +2 -2
  90. data/lib/puppet/network/format_handler.rb +25 -114
  91. data/lib/puppet/network/format_support.rb +106 -0
  92. data/lib/puppet/network/formats.rb +10 -4
  93. data/lib/puppet/network/http/compression.rb +1 -1
  94. data/lib/puppet/network/http/connection.rb +76 -32
  95. data/lib/puppet/network/http/handler.rb +122 -61
  96. data/lib/puppet/network/http/rack/rest.rb +1 -1
  97. data/lib/puppet/network/http/webrick/rest.rb +9 -3
  98. data/lib/puppet/network/http_pool.rb +2 -2
  99. data/lib/puppet/network/resolver.rb +1 -0
  100. data/lib/puppet/network/server.rb +5 -81
  101. data/lib/puppet/node/environment.rb +256 -13
  102. data/lib/puppet/node/facts.rb +28 -2
  103. data/lib/puppet/parameter.rb +27 -18
  104. data/lib/puppet/parameter/boolean.rb +20 -0
  105. data/lib/puppet/parameter/path.rb +1 -1
  106. data/lib/puppet/parameter/value.rb +1 -1
  107. data/lib/puppet/parameter/value_collection.rb +1 -1
  108. data/lib/puppet/parser/ast/arithmetic_operator.rb +8 -0
  109. data/lib/puppet/parser/ast/casestatement.rb +0 -3
  110. data/lib/puppet/parser/ast/lambda.rb +25 -6
  111. data/lib/puppet/parser/ast/leaf.rb +10 -3
  112. data/lib/puppet/parser/ast/nop.rb +1 -1
  113. data/lib/puppet/parser/ast/resource_override.rb +0 -2
  114. data/lib/puppet/parser/compiler.rb +92 -34
  115. data/lib/puppet/parser/files.rb +0 -5
  116. data/lib/puppet/parser/functions/create_resources.rb +23 -46
  117. data/lib/puppet/parser/functions/each.rb +0 -2
  118. data/lib/puppet/parser/functions/extlookup.rb +2 -2
  119. data/lib/puppet/parser/functions/foreach.rb +0 -2
  120. data/lib/puppet/parser/functions/hiera_include.rb +1 -1
  121. data/lib/puppet/parser/functions/lookup.rb +44 -0
  122. data/lib/puppet/parser/functions/slice.rb +1 -1
  123. data/lib/puppet/parser/grammar.ra +0 -1
  124. data/lib/puppet/parser/lexer.rb +0 -1
  125. data/lib/puppet/parser/parser.rb +0 -1
  126. data/lib/puppet/parser/parser_factory.rb +3 -2
  127. data/lib/puppet/parser/parser_support.rb +1 -1
  128. data/lib/puppet/parser/relationship.rb +1 -1
  129. data/lib/puppet/parser/scope.rb +49 -24
  130. data/lib/puppet/parser/type_loader.rb +13 -18
  131. data/lib/puppet/pops.rb +45 -0
  132. data/lib/puppet/pops/adaptable.rb +2 -2
  133. data/lib/puppet/pops/adapters.rb +4 -0
  134. data/lib/puppet/pops/binder/binder.rb +421 -0
  135. data/lib/puppet/pops/binder/binder_issues.rb +142 -0
  136. data/lib/puppet/pops/binder/bindings_checker.rb +217 -0
  137. data/lib/puppet/pops/binder/bindings_composer.rb +241 -0
  138. data/lib/puppet/pops/binder/bindings_factory.rb +847 -0
  139. data/lib/puppet/pops/binder/bindings_label_provider.rb +46 -0
  140. data/lib/puppet/pops/binder/bindings_loader.rb +79 -0
  141. data/lib/puppet/pops/binder/bindings_model.rb +215 -0
  142. data/lib/puppet/pops/binder/bindings_model_dumper.rb +205 -0
  143. data/lib/puppet/pops/binder/bindings_validator_factory.rb +28 -0
  144. data/lib/puppet/pops/binder/config/binder_config.rb +139 -0
  145. data/lib/puppet/pops/binder/config/binder_config_checker.rb +183 -0
  146. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +32 -0
  147. data/lib/puppet/pops/binder/config/issues.rb +106 -0
  148. data/lib/puppet/pops/binder/hiera2.rb +10 -0
  149. data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +148 -0
  150. data/lib/puppet/pops/binder/hiera2/config.rb +69 -0
  151. data/lib/puppet/pops/binder/hiera2/config_checker.rb +68 -0
  152. data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +36 -0
  153. data/lib/puppet/pops/binder/hiera2/issues.rb +67 -0
  154. data/lib/puppet/pops/binder/hiera2/json_backend.rb +18 -0
  155. data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +21 -0
  156. data/lib/puppet/pops/binder/injector.rb +688 -0
  157. data/lib/puppet/pops/binder/injector_entry.rb +53 -0
  158. data/lib/puppet/pops/binder/key_factory.rb +61 -0
  159. data/lib/puppet/pops/binder/producers.rb +829 -0
  160. data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +67 -0
  161. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +34 -0
  162. data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +92 -0
  163. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +84 -0
  164. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +54 -0
  165. data/lib/puppet/pops/binder/system_bindings.rb +72 -0
  166. data/lib/puppet/pops/issue_reporter.rb +75 -0
  167. data/lib/puppet/pops/issues.rb +9 -5
  168. data/lib/puppet/pops/model/ast_transformer.rb +4 -4
  169. data/lib/puppet/pops/model/ast_tree_dumper.rb +1 -1
  170. data/lib/puppet/pops/model/factory.rb +25 -13
  171. data/lib/puppet/pops/model/model.rb +1 -1
  172. data/lib/puppet/pops/model/tree_dumper.rb +2 -2
  173. data/lib/puppet/pops/parser/egrammar.ra +0 -1
  174. data/lib/puppet/pops/parser/eparser.rb +1 -2
  175. data/lib/puppet/pops/parser/evaluating_parser.rb +162 -0
  176. data/lib/puppet/pops/parser/lexer.rb +8 -6
  177. data/lib/puppet/pops/types/class_loader.rb +118 -0
  178. data/lib/puppet/pops/types/type_calculator.rb +557 -0
  179. data/lib/puppet/pops/types/type_factory.rb +147 -0
  180. data/lib/puppet/pops/types/type_parser.rb +117 -0
  181. data/lib/puppet/pops/types/types.rb +132 -0
  182. data/lib/puppet/pops/validation.rb +146 -17
  183. data/lib/puppet/pops/validation/checker3_1.rb +1 -1
  184. data/lib/puppet/pops/validation/validator_factory_3_1.rb +6 -16
  185. data/lib/puppet/property.rb +3 -3
  186. data/lib/puppet/property/keyvalue.rb +1 -1
  187. data/lib/puppet/provider.rb +2 -2
  188. data/lib/puppet/provider/aixobject.rb +19 -21
  189. data/lib/puppet/provider/augeas/augeas.rb +3 -1
  190. data/lib/puppet/provider/command.rb +2 -2
  191. data/lib/puppet/provider/group/aix.rb +1 -1
  192. data/lib/puppet/provider/group/ldap.rb +1 -1
  193. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  194. data/lib/puppet/provider/mailalias/aliases.rb +3 -8
  195. data/lib/puppet/provider/mcx/mcxcontent.rb +7 -1
  196. data/lib/puppet/provider/mount.rb +8 -3
  197. data/lib/puppet/provider/nameservice.rb +1 -1
  198. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  199. data/lib/puppet/provider/package/appdmg.rb +1 -1
  200. data/lib/puppet/provider/package/apt.rb +0 -1
  201. data/lib/puppet/provider/package/dpkg.rb +86 -32
  202. data/lib/puppet/provider/package/fink.rb +0 -2
  203. data/lib/puppet/provider/package/freebsd.rb +0 -2
  204. data/lib/puppet/provider/package/openbsd.rb +57 -10
  205. data/lib/puppet/provider/package/opkg.rb +0 -1
  206. data/lib/puppet/provider/package/pacman.rb +0 -1
  207. data/lib/puppet/provider/package/pip.rb +1 -1
  208. data/lib/puppet/provider/package/pkgdmg.rb +17 -6
  209. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  210. data/lib/puppet/provider/package/portage.rb +9 -1
  211. data/lib/puppet/provider/package/ports.rb +2 -2
  212. data/lib/puppet/provider/package/rpm.rb +29 -12
  213. data/lib/puppet/provider/package/rug.rb +1 -1
  214. data/lib/puppet/provider/package/urpmi.rb +11 -15
  215. data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
  216. data/lib/puppet/provider/package/windows/package.rb +1 -26
  217. data/lib/puppet/provider/package/yum.rb +1 -1
  218. data/lib/puppet/provider/package/zypper.rb +22 -3
  219. data/lib/puppet/provider/parsedfile.rb +1 -12
  220. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +1 -1
  221. data/lib/puppet/provider/service/base.rb +1 -1
  222. data/lib/puppet/provider/service/daemontools.rb +3 -3
  223. data/lib/puppet/provider/service/debian.rb +1 -1
  224. data/lib/puppet/provider/service/init.rb +14 -20
  225. data/lib/puppet/provider/service/openrc.rb +3 -1
  226. data/lib/puppet/provider/service/redhat.rb +5 -8
  227. data/lib/puppet/provider/service/runit.rb +3 -2
  228. data/lib/puppet/provider/service/systemd.rb +1 -1
  229. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  230. data/lib/puppet/provider/sshkey/parsed.rb +0 -2
  231. data/lib/puppet/provider/user/aix.rb +25 -12
  232. data/lib/puppet/provider/user/directoryservice.rb +4 -7
  233. data/lib/puppet/provider/user/ldap.rb +0 -1
  234. data/lib/puppet/provider/user/user_role_add.rb +2 -0
  235. data/lib/puppet/provider/user/useradd.rb +1 -1
  236. data/lib/puppet/provider/zone/solaris.rb +1 -2
  237. data/lib/puppet/reference/metaparameter.rb +1 -1
  238. data/lib/puppet/reference/type.rb +1 -1
  239. data/lib/puppet/reports/rrdgraph.rb +1 -1
  240. data/lib/puppet/reports/tagmail.rb +1 -1
  241. data/lib/puppet/resource.rb +16 -4
  242. data/lib/puppet/resource/catalog.rb +111 -173
  243. data/lib/puppet/resource/status.rb +42 -3
  244. data/lib/puppet/resource/type.rb +33 -46
  245. data/lib/puppet/resource/type_collection.rb +19 -15
  246. data/lib/puppet/run.rb +5 -1
  247. data/lib/puppet/scheduler/scheduler.rb +14 -15
  248. data/lib/puppet/settings.rb +78 -41
  249. data/lib/puppet/settings/boolean_setting.rb +0 -2
  250. data/lib/puppet/settings/config_file.rb +0 -2
  251. data/lib/puppet/settings/directory_setting.rb +0 -2
  252. data/lib/puppet/settings/duration_setting.rb +0 -2
  253. data/lib/puppet/settings/enum_setting.rb +16 -0
  254. data/lib/puppet/settings/file_setting.rb +0 -2
  255. data/lib/puppet/settings/path_setting.rb +0 -2
  256. data/lib/puppet/settings/string_setting.rb +0 -3
  257. data/lib/puppet/settings/terminus_setting.rb +0 -2
  258. data/lib/puppet/ssl/certificate_authority.rb +102 -9
  259. data/lib/puppet/test/test_helper.rb +1 -0
  260. data/lib/puppet/transaction.rb +130 -292
  261. data/lib/puppet/transaction/additional_resource_generator.rb +126 -0
  262. data/lib/puppet/transaction/event.rb +16 -1
  263. data/lib/puppet/transaction/report.rb +34 -14
  264. data/lib/puppet/transaction/resource_harness.rb +16 -19
  265. data/lib/puppet/type.rb +59 -53
  266. data/lib/puppet/type/component.rb +0 -2
  267. data/lib/puppet/type/cron.rb +13 -2
  268. data/lib/puppet/type/exec.rb +5 -7
  269. data/lib/puppet/type/file.rb +9 -32
  270. data/lib/puppet/type/file/content.rb +4 -1
  271. data/lib/puppet/type/file/ctime.rb +3 -1
  272. data/lib/puppet/type/file/ensure.rb +1 -1
  273. data/lib/puppet/type/file/mode.rb +0 -1
  274. data/lib/puppet/type/file/mtime.rb +2 -1
  275. data/lib/puppet/type/group.rb +7 -9
  276. data/lib/puppet/type/host.rb +1 -2
  277. data/lib/puppet/type/mcx.rb +0 -1
  278. data/lib/puppet/type/mount.rb +38 -6
  279. data/lib/puppet/type/package.rb +2 -2
  280. data/lib/puppet/type/resources.rb +5 -4
  281. data/lib/puppet/type/schedule.rb +1 -4
  282. data/lib/puppet/type/selmodule.rb +1 -1
  283. data/lib/puppet/type/service.rb +1 -3
  284. data/lib/puppet/type/tidy.rb +3 -3
  285. data/lib/puppet/type/user.rb +9 -13
  286. data/lib/puppet/type/yumrepo.rb +11 -7
  287. data/lib/puppet/util.rb +14 -7
  288. data/lib/puppet/util/autoload.rb +0 -1
  289. data/lib/puppet/util/backups.rb +1 -3
  290. data/lib/puppet/util/classgen.rb +1 -1
  291. data/lib/puppet/util/command_line/puppet_option_parser.rb +1 -3
  292. data/lib/puppet/util/command_line/trollop.rb +1 -1
  293. data/lib/puppet/util/constant_inflector.rb +1 -2
  294. data/lib/puppet/util/errors.rb +1 -0
  295. data/lib/puppet/util/file_watcher.rb +28 -0
  296. data/lib/puppet/util/fileparsing.rb +1 -3
  297. data/lib/puppet/util/filetype.rb +0 -1
  298. data/lib/puppet/util/http_proxy.rb +38 -0
  299. data/lib/puppet/util/ldap/manager.rb +1 -2
  300. data/lib/puppet/util/log.rb +31 -10
  301. data/lib/puppet/util/log/destinations.rb +0 -50
  302. data/lib/puppet/util/metric.rb +8 -1
  303. data/lib/puppet/util/monkey_patches.rb +14 -148
  304. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  305. data/lib/puppet/util/network_device/config.rb +6 -9
  306. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  307. data/lib/puppet/util/pidlock.rb +3 -0
  308. data/lib/puppet/util/posix.rb +1 -1
  309. data/lib/puppet/util/profiler.rb +1 -1
  310. data/lib/puppet/util/rdoc.rb +1 -1
  311. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +0 -1
  312. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +50 -42
  313. data/lib/puppet/util/retryaction.rb +0 -1
  314. data/lib/puppet/util/symbolic_file_mode.rb +5 -1
  315. data/lib/puppet/util/tagging.rb +0 -2
  316. data/lib/puppet/util/warnings.rb +3 -0
  317. data/lib/puppet/util/watched_file.rb +37 -0
  318. data/lib/puppet/util/watcher.rb +17 -0
  319. data/lib/puppet/util/watcher/change_watcher.rb +33 -0
  320. data/lib/puppet/util/watcher/periodic_watcher.rb +37 -0
  321. data/lib/puppet/util/watcher/timer.rb +19 -0
  322. data/lib/puppet/util/windows/user.rb +1 -1
  323. data/lib/puppet/version.rb +1 -1
  324. data/lib/puppetx.rb +109 -0
  325. data/lib/puppetx/puppet/bindings_scheme_handler.rb +130 -0
  326. data/lib/puppetx/puppet/hiera2_backend.rb +31 -0
  327. data/lib/puppetx/puppet/syntax_checker.rb +91 -0
  328. data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +39 -0
  329. data/lib/semver.rb +1 -1
  330. data/man/man8/puppet-kick.8 +1 -1
  331. data/spec/fixtures/integration/provider/cron/crontab/unspecialized +15 -0
  332. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +18 -0
  333. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +8 -0
  334. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +1 -0
  335. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +10 -0
  336. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +19 -0
  337. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +1 -0
  338. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +11 -0
  339. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +1 -0
  340. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +3 -0
  341. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +13 -0
  342. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +4 -0
  343. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +11 -0
  344. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_scheme_handler.rb +18 -0
  345. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +1 -0
  346. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +3 -0
  347. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +9 -0
  348. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +2 -0
  349. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +11 -0
  350. data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +9 -0
  351. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +9 -0
  352. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +9 -0
  353. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +5 -0
  354. data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +10 -0
  355. data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +8 -0
  356. data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +1 -0
  357. data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +7 -0
  358. data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +4 -0
  359. data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +2 -0
  360. data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +8 -0
  361. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/empty/common.yaml +0 -0
  362. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +1 -0
  363. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +2 -0
  364. data/spec/fixtures/unit/provider/package/openbsd/pkginfo_flavors.list +2 -0
  365. data/spec/integration/agent/logging_spec.rb +178 -0
  366. data/spec/integration/configurer_spec.rb +1 -1
  367. data/spec/integration/defaults_spec.rb +0 -6
  368. data/spec/integration/network/authconfig_spec.rb +19 -0
  369. data/spec/integration/network/server/webrick_spec.rb +10 -11
  370. data/spec/integration/parser/catalog_spec.rb +85 -0
  371. data/spec/integration/provider/cron/crontab_spec.rb +11 -0
  372. data/spec/integration/provider/mount_spec.rb +1 -0
  373. data/spec/integration/transaction_spec.rb +8 -8
  374. data/spec/integration/type/file_spec.rb +1 -1
  375. data/spec/integration/util/settings_spec.rb +58 -11
  376. data/spec/lib/matchers/include_in_order.rb +21 -0
  377. data/spec/lib/matchers/include_in_order_spec.rb +30 -0
  378. data/spec/lib/matchers/relationship_graph_matchers.rb +48 -0
  379. data/spec/lib/puppet_spec/compiler.rb +24 -0
  380. data/spec/lib/puppet_spec/pops.rb +16 -0
  381. data/spec/spec_helper.rb +0 -1
  382. data/spec/unit/application/agent_spec.rb +145 -145
  383. data/spec/unit/application/apply_spec.rb +1 -1
  384. data/spec/unit/application/doc_spec.rb +1 -1
  385. data/spec/unit/application/face_base_spec.rb +3 -3
  386. data/spec/unit/application/facts_spec.rb +1 -0
  387. data/spec/unit/application/master_spec.rb +0 -15
  388. data/spec/unit/application/queue_spec.rb +6 -12
  389. data/spec/unit/application/resource_spec.rb +1 -1
  390. data/spec/unit/configurer/fact_handler_spec.rb +19 -50
  391. data/spec/unit/configurer_spec.rb +23 -7
  392. data/spec/unit/daemon_spec.rb +97 -121
  393. data/spec/unit/defaults_spec.rb +44 -0
  394. data/spec/unit/face/node_spec.rb +2 -2
  395. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -33
  396. data/spec/unit/file_serving/configuration_spec.rb +2 -2
  397. data/spec/unit/file_serving/mount/file_spec.rb +4 -4
  398. data/spec/unit/forge/repository_spec.rb +9 -29
  399. data/spec/unit/graph/key_spec.rb +41 -0
  400. data/spec/unit/{rb_tree_map_spec.rb → graph/rb_tree_map_spec.rb} +7 -7
  401. data/spec/unit/graph/relationship_graph_spec.rb +393 -0
  402. data/spec/unit/graph/sequential_prioritizer_spec.rb +32 -0
  403. data/spec/unit/{simple_graph_spec.rb → graph/simple_graph.rb} +42 -254
  404. data/spec/unit/graph/title_hash_prioritizer_spec.rb +49 -0
  405. data/spec/unit/hiera_puppet_spec.rb +1 -1
  406. data/spec/unit/indirector/catalog/active_record_spec.rb +4 -2
  407. data/spec/unit/indirector/catalog/compiler_spec.rb +20 -26
  408. data/spec/unit/indirector/face_spec.rb +1 -1
  409. data/spec/unit/indirector/facts/facter_spec.rb +11 -1
  410. data/spec/unit/indirector/facts/network_device_spec.rb +11 -1
  411. data/spec/unit/indirector/hiera_spec.rb +1 -1
  412. data/spec/unit/indirector/instrumentation_data/local_spec.rb +1 -1
  413. data/spec/unit/indirector/instrumentation_listener/local_spec.rb +1 -1
  414. data/spec/unit/indirector/request_spec.rb +92 -39
  415. data/spec/unit/indirector/rest_spec.rb +1 -0
  416. data/spec/unit/indirector_spec.rb +2 -2
  417. data/spec/unit/interface/option_builder_spec.rb +1 -0
  418. data/spec/unit/interface/option_spec.rb +1 -0
  419. data/spec/unit/interface_spec.rb +2 -2
  420. data/spec/unit/module_tool/applications/installer_spec.rb +49 -2
  421. data/spec/unit/module_tool/metadata_spec.rb +13 -0
  422. data/spec/unit/network/authstore_spec.rb +1 -1
  423. data/spec/unit/network/format_handler_spec.rb +33 -282
  424. data/spec/unit/network/format_support_spec.rb +199 -0
  425. data/spec/unit/network/formats_spec.rb +2 -2
  426. data/spec/unit/network/http/connection_spec.rb +88 -7
  427. data/spec/unit/network/http/handler_spec.rb +271 -249
  428. data/spec/unit/network/http/rack/rest_spec.rb +1 -1
  429. data/spec/unit/network/http/webrick/rest_spec.rb +73 -22
  430. data/spec/unit/network/http_pool_spec.rb +40 -0
  431. data/spec/unit/network/server_spec.rb +18 -207
  432. data/spec/unit/node/facts_spec.rb +68 -17
  433. data/spec/unit/other/selinux_spec.rb +24 -20
  434. data/spec/unit/parameter/boolean_spec.rb +25 -0
  435. data/spec/unit/parameter/value_collection_spec.rb +7 -7
  436. data/spec/unit/parameter_spec.rb +10 -13
  437. data/spec/unit/parser/ast/function_spec.rb +4 -4
  438. data/spec/unit/parser/ast/leaf_spec.rb +45 -6
  439. data/spec/unit/parser/collector_spec.rb +3 -3
  440. data/spec/unit/parser/compiler_spec.rb +4 -3
  441. data/spec/unit/parser/functions/create_resources_spec.rb +9 -25
  442. data/spec/unit/parser/functions/extlookup_spec.rb +2 -2
  443. data/spec/unit/parser/functions/hiera_include_spec.rb +12 -0
  444. data/spec/unit/parser/functions/lookup_spec.rb +96 -0
  445. data/spec/unit/parser/functions/regsubst_spec.rb +2 -2
  446. data/spec/unit/parser/functions/split_spec.rb +2 -2
  447. data/spec/unit/parser/functions/sprintf_spec.rb +1 -1
  448. data/spec/unit/parser/functions/versioncmp_spec.rb +2 -2
  449. data/spec/unit/parser/functions_spec.rb +7 -7
  450. data/spec/unit/parser/lexer_spec.rb +1 -1
  451. data/spec/unit/parser/methods/collect_spec.rb +43 -0
  452. data/spec/unit/parser/resource_spec.rb +9 -9
  453. data/spec/unit/parser/scope_spec.rb +45 -2
  454. data/spec/unit/parser/type_loader_spec.rb +159 -175
  455. data/spec/unit/pops/binder/binder_spec.rb +62 -0
  456. data/spec/unit/pops/binder/bindings_checker_spec.rb +196 -0
  457. data/spec/unit/pops/binder/bindings_composer_spec.rb +89 -0
  458. data/spec/unit/pops/binder/bindings_validator_factory_spec.rb +18 -0
  459. data/spec/unit/pops/binder/config/binder_config_spec.rb +48 -0
  460. data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +74 -0
  461. data/spec/unit/pops/binder/hiera2/config_spec.rb +61 -0
  462. data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +33 -0
  463. data/spec/unit/pops/binder/injector_spec.rb +789 -0
  464. data/spec/unit/pops/containment_spec.rb +1 -0
  465. data/spec/unit/pops/issues_spec.rb +1 -1
  466. data/spec/unit/pops/parser/evaluating_parser_spec.rb +88 -0
  467. data/spec/unit/pops/parser/lexer_spec.rb +1 -1
  468. data/spec/unit/pops/parser/parse_calls_spec.rb +4 -0
  469. data/spec/unit/pops/parser/parser_spec.rb +1 -1
  470. data/spec/unit/pops/types/type_calculator_spec.rb +484 -0
  471. data/spec/unit/pops/types/type_factory_spec.rb +65 -0
  472. data/spec/unit/pops/types/type_parser_spec.rb +93 -0
  473. data/spec/unit/property/list_spec.rb +1 -1
  474. data/spec/unit/property/ordered_list_spec.rb +1 -1
  475. data/spec/unit/provider/aixobject_spec.rb +101 -0
  476. data/spec/unit/provider/augeas/augeas_spec.rb +14 -3
  477. data/spec/unit/provider/mcx/mcxcontent_spec.rb +52 -16
  478. data/spec/unit/provider/mount/parsed_spec.rb +44 -56
  479. data/spec/unit/provider/mount_spec.rb +11 -2
  480. data/spec/unit/provider/naginator_spec.rb +8 -0
  481. data/spec/unit/provider/package/apt_spec.rb +5 -1
  482. data/spec/unit/provider/package/aptitude_spec.rb +9 -5
  483. data/spec/unit/provider/package/aptrpm_spec.rb +2 -2
  484. data/spec/unit/provider/package/dpkg_spec.rb +274 -99
  485. data/spec/unit/provider/package/openbsd_spec.rb +84 -1
  486. data/spec/unit/provider/package/opkg_spec.rb +3 -3
  487. data/spec/unit/provider/package/pip_spec.rb +16 -0
  488. data/spec/unit/provider/package/pkgdmg_spec.rb +62 -7
  489. data/spec/unit/provider/package/rpm_spec.rb +112 -21
  490. data/spec/unit/provider/package/urpmi.rb +80 -0
  491. data/spec/unit/provider/package/windows/exe_package_spec.rb +1 -1
  492. data/spec/unit/provider/package/yum_spec.rb +85 -0
  493. data/spec/unit/provider/package/zypper_spec.rb +25 -6
  494. data/spec/unit/provider/parsedfile_spec.rb +3 -2
  495. data/spec/unit/provider/service/init_spec.rb +10 -10
  496. data/spec/unit/provider/service/openrc_spec.rb +16 -0
  497. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  498. data/spec/unit/provider/service/redhat_spec.rb +7 -0
  499. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -2
  500. data/spec/unit/provider/user/aix_spec.rb +89 -0
  501. data/spec/unit/provider/user/directoryservice_spec.rb +11 -4
  502. data/spec/unit/provider/user/user_role_add_spec.rb +18 -0
  503. data/spec/unit/provider_spec.rb +2 -13
  504. data/spec/unit/reports/http_spec.rb +1 -1
  505. data/spec/unit/resource/catalog_spec.rb +23 -97
  506. data/spec/unit/resource/resource_type.json +34 -0
  507. data/spec/unit/resource/status_spec.rb +56 -0
  508. data/spec/unit/resource/type_collection_spec.rb +6 -6
  509. data/spec/unit/resource/type_spec.rb +25 -5
  510. data/spec/unit/resource_spec.rb +68 -24
  511. data/spec/unit/run_spec.rb +16 -0
  512. data/spec/unit/scheduler/scheduler_spec.rb +14 -27
  513. data/spec/unit/semver_spec.rb +5 -0
  514. data/spec/unit/settings/enum_setting_spec.rb +27 -0
  515. data/spec/unit/settings_spec.rb +53 -44
  516. data/spec/unit/ssl/certificate_authority_spec.rb +155 -19
  517. data/spec/unit/transaction/additional_resource_generator_spec.rb +419 -0
  518. data/spec/unit/transaction/event_manager_spec.rb +2 -2
  519. data/spec/unit/transaction/event_spec.rb +57 -0
  520. data/spec/unit/transaction/report_spec.rb +66 -0
  521. data/spec/unit/transaction/resource_harness_spec.rb +27 -20
  522. data/spec/unit/transaction_spec.rb +182 -390
  523. data/spec/unit/type/augeas_spec.rb +3 -3
  524. data/spec/unit/type/component_spec.rb +0 -9
  525. data/spec/unit/type/computer_spec.rb +1 -1
  526. data/spec/unit/type/cron_spec.rb +2 -2
  527. data/spec/unit/type/exec_spec.rb +4 -2
  528. data/spec/unit/type/file/content_spec.rb +11 -0
  529. data/spec/unit/type/file/group_spec.rb +1 -1
  530. data/spec/unit/type/file_spec.rb +16 -8
  531. data/spec/unit/type/mount_spec.rb +445 -259
  532. data/spec/unit/type/package_spec.rb +4 -4
  533. data/spec/unit/type/resources_spec.rb +30 -1
  534. data/spec/unit/type/user_spec.rb +26 -3
  535. data/spec/unit/type/yumrepo_spec.rb +7 -27
  536. data/spec/unit/type/zone_spec.rb +4 -1
  537. data/spec/unit/type_spec.rb +66 -33
  538. data/spec/unit/util/backups_spec.rb +3 -3
  539. data/spec/unit/util/http_proxy_spec.rb +83 -0
  540. data/spec/unit/util/log_spec.rb +79 -8
  541. data/spec/unit/util/metric_spec.rb +12 -0
  542. data/spec/unit/util/monkey_patches_spec.rb +6 -0
  543. data/spec/unit/util/network_device/config_spec.rb +26 -64
  544. data/spec/unit/util/pidlock_spec.rb +4 -1
  545. data/spec/unit/util/tagging_spec.rb +5 -9
  546. data/spec/unit/util/warnings_spec.rb +1 -1
  547. data/spec/unit/util/watched_file_spec.rb +52 -0
  548. data/spec/unit/util/watcher/periodic_watcher_spec.rb +52 -0
  549. data/spec/unit/util/watcher_spec.rb +56 -0
  550. data/spec/unit/util_spec.rb +16 -0
  551. metadata +2767 -2576
  552. data/ext/debian/puppet.manpages +0 -32
  553. data/ext/osx/PackageInfo.plist +0 -36
  554. data/ext/osx/createpackage.sh +0 -187
  555. data/ext/redhat/rundir-perms.patch +0 -28
  556. data/lib/puppet/external/base64.rb +0 -19
  557. data/lib/puppet/util/graph.rb +0 -27
  558. data/lib/puppet/util/loadedfile.rb +0 -61
  559. data/lib/puppet/util/log_paths.rb +0 -22
  560. data/lib/puppet/util/subclass_loader.rb +0 -78
  561. data/spec/monkey_patches/publicize_methods.rb +0 -11
  562. data/spec/unit/util/loadedfile_spec.rb +0 -71
@@ -1,4 +1,5 @@
1
1
  module Puppet
2
+
2
3
  module Pops
3
4
  require 'puppet/pops/patterns'
4
5
  require 'puppet/pops/utils'
@@ -14,9 +15,18 @@ module Puppet
14
15
  require 'puppet/pops/issues'
15
16
  require 'puppet/pops/label_provider'
16
17
  require 'puppet/pops/validation'
18
+ require 'puppet/pops/issue_reporter'
17
19
 
18
20
  require 'puppet/pops/model/model'
19
21
 
22
+ module Types
23
+ require 'puppet/pops/types/types'
24
+ require 'puppet/pops/types/type_calculator'
25
+ require 'puppet/pops/types/type_factory'
26
+ require 'puppet/pops/types/type_parser'
27
+ require 'puppet/pops/types/class_loader'
28
+ end
29
+
20
30
  module Model
21
31
  require 'puppet/pops/model/tree_dumper'
22
32
  require 'puppet/pops/model/ast_transformer'
@@ -26,10 +36,43 @@ module Puppet
26
36
  require 'puppet/pops/model/model_label_provider'
27
37
  end
28
38
 
39
+ module Binder
40
+ module SchemeHandler
41
+ # the handlers are auto loaded via bindings
42
+ end
43
+ module Producers
44
+ require 'puppet/pops/binder/producers'
45
+ end
46
+
47
+ require 'puppet/pops/binder/binder'
48
+ require 'puppet/pops/binder/bindings_model'
49
+ require 'puppet/pops/binder/binder_issues'
50
+ require 'puppet/pops/binder/bindings_checker'
51
+ require 'puppet/pops/binder/bindings_factory'
52
+ require 'puppet/pops/binder/bindings_label_provider'
53
+ require 'puppet/pops/binder/bindings_validator_factory'
54
+ require 'puppet/pops/binder/injector_entry'
55
+ require 'puppet/pops/binder/key_factory'
56
+ require 'puppet/pops/binder/injector'
57
+ require 'puppet/pops/binder/hiera2'
58
+ require 'puppet/pops/binder/bindings_composer'
59
+ require 'puppet/pops/binder/bindings_model_dumper'
60
+ require 'puppet/pops/binder/system_bindings'
61
+ require 'puppet/pops/binder/bindings_loader'
62
+
63
+ module Config
64
+ require 'puppet/pops/binder/config/binder_config'
65
+ require 'puppet/pops/binder/config/binder_config_checker'
66
+ require 'puppet/pops/binder/config/issues'
67
+ require 'puppet/pops/binder/config/diagnostic_producer'
68
+ end
69
+ end
70
+
29
71
  module Parser
30
72
  require 'puppet/pops/parser/eparser'
31
73
  require 'puppet/pops/parser/parser_support'
32
74
  require 'puppet/pops/parser/lexer'
75
+ require 'puppet/pops/parser/evaluating_parser'
33
76
  end
34
77
 
35
78
  module Validation
@@ -37,4 +80,6 @@ module Puppet
37
80
  require 'puppet/pops/validation/validator_factory_3_1'
38
81
  end
39
82
  end
83
+
84
+ require 'puppet/bindings'
40
85
  end
@@ -68,7 +68,7 @@ module Puppet::Pops::Adaptable
68
68
  #
69
69
  def self.get(o)
70
70
  attr_name = :"@#{instance_var_name(self.name)}"
71
- if existing = o.instance_variable_defined?(attr_name)
71
+ if o.instance_variable_defined?(attr_name)
72
72
  o.instance_variable_get(attr_name)
73
73
  else
74
74
  nil
@@ -93,7 +93,7 @@ module Puppet::Pops::Adaptable
93
93
  #
94
94
  def self.adapt(o, &block)
95
95
  attr_name = :"@#{instance_var_name(self.name)}"
96
- adapter = if existing = o.instance_variable_defined?(attr_name) && value = o.instance_variable_get(attr_name)
96
+ adapter = if o.instance_variable_defined?(attr_name) && value = o.instance_variable_get(attr_name)
97
97
  value
98
98
  else
99
99
  associate_adapter(create_adapter(o), o)
@@ -47,6 +47,10 @@ module Puppet::Pops::Adapters
47
47
  # representing the adapted object from the origin. Not including any
48
48
  # trailing whitespace.
49
49
  attr_accessor :length
50
+
51
+ def extract_text_from_string(string)
52
+ string.slice(offset, length)
53
+ end
50
54
  end
51
55
 
52
56
  # A LoaderAdapter adapts an object with a {Puppet::Pops::Loader}. This is used to make further loading from the
@@ -0,0 +1,421 @@
1
+ # The Binder is responsible for processing layered bindings that can be used to setup an Injector.
2
+ #
3
+ # An instance should be created, and calls should then be made to {#define_categories} to define the available categories, and
4
+ # their precedence. This should be followed by a call to {#define_layers} which will match the layered bindings against the
5
+ # effective categories (filtering out everything that does not apply, handle overrides, abstract entries etc.).
6
+ # The constructed hash with `key => InjectorEntry` mappings is obtained as {#injector_entries}, and is used to initialize an
7
+ # {Puppet::Pops::Binder::Injector Injector}.
8
+ #
9
+ # @api public
10
+ #
11
+ class Puppet::Pops::Binder::Binder
12
+ # This limits the number of available categorizations, including "common".
13
+ # @api private
14
+ PRECEDENCE_MAX = 1000
15
+
16
+ # @api private
17
+ attr_reader :category_precedences
18
+
19
+ # @api private
20
+ attr_reader :category_values
21
+
22
+ # @api private
23
+ attr_reader :injector_entries
24
+
25
+ # @api private
26
+ attr_reader :key_factory
27
+
28
+ # Whether the binder is fully configured or not
29
+ # @api public
30
+ #
31
+ attr_reader :configured
32
+
33
+ # @api public
34
+ def initialize
35
+ @category_precedences = {}
36
+ @category_values = {}
37
+ @key_factory = Puppet::Pops::Binder::KeyFactory.new()
38
+
39
+ # Resulting hash of all key -> binding
40
+ @injector_entries = {}
41
+
42
+ # Not configured until the fat lady sings
43
+ @configured = false
44
+
45
+ @next_anonymous_key = 0
46
+ end
47
+
48
+ # Answers the question 'is this binder configured?' to the point it can be used to instantiate an Injector
49
+ # @api public
50
+ def configured?()
51
+ configured()
52
+ end
53
+
54
+ # Defines the effective categories in precedence order (highest precedence first).
55
+ # The 'common' (lowest precedence) category should not be included in the list.
56
+ # A sanity check is made that there are no more than 1000 categorizations (which is pretty wild).
57
+ #
58
+ # The term 'effective categories' refers to the evaluated list of tuples (categorization, category-value) represented with
59
+ # an instance of Puppet::Pops::Binder::Bindings::EffectiveCategories.
60
+ #
61
+ # @param effective_categories [Puppet::Pops::Binder::Bindings::EffectiveCategories] effective categories (i.e. with evaluated values)
62
+ # @raise ArgumentError if this binder is already configured
63
+ # @raise ArgumentError if the argument is not an EffectiveCategories
64
+ # @raise ArgumentError if there is an attempt to redefine a category (non unique, or 'common').
65
+ # @return [Puppet::Pops::Binder::Binder] self
66
+ # @api public
67
+ #
68
+ def define_categories(effective_categories)
69
+ raise ArgumentError, "This categories are already defined. Cannot redefine." unless @category_precedences.empty?
70
+
71
+ # Note: a model instance is used since a Hash does not have a defined order in all Rubies.
72
+ unless effective_categories.is_a?(Puppet::Pops::Binder::Bindings::EffectiveCategories)
73
+ raise ArgumentError, "Expected Puppet::Pops::Binder::Bindings::EffectiveCategories, but got a: #{effective_categories.class}"
74
+ end
75
+ categories = effective_categories.categories
76
+ raise ArgumentError, "Category limit (#{PRECEDENCE_MAX}) exceeded" unless categories.size <= PRECEDENCE_MAX
77
+
78
+ # Automatically add the 'common' category with lowest precedence
79
+ @category_precedences['common'] = 0
80
+
81
+ # if categories contains "common", it should be last - simply drop it if present
82
+ if last = categories[-1]
83
+ if last.categorization == 'common'
84
+ categories.delete_at(-1)
85
+ end
86
+ end
87
+ # Process the given categories (highest precedence is first in the list)
88
+ categories.each_with_index do |c, index|
89
+ cname = c.categorization
90
+ raise ArgumentError, "Attempt to redefine categorization: #{cname}" if @category_precedences[cname]
91
+ @category_precedences[cname] = PRECEDENCE_MAX - index
92
+ @category_values[cname] = c.value
93
+ end
94
+ self
95
+ end
96
+
97
+ # Binds layers from highest to lowest as defined by the given LayeredBindings.
98
+ # @note
99
+ # Categories must be set with #define_categories before calling this method. The model should have been
100
+ # validated to get better error messages if the model is invalid. This implementation expects the model
101
+ # to be valid, and any errors raised will be more technical runtime errors.
102
+ #
103
+ # @param layered_bindings [Puppet::Pops::Binder::Bindings::LayeredBindings] the named and ordered layers
104
+ # @raise ArgumentError if categories have not been defined
105
+ # @raise ArgumentError if this binder is already configured
106
+ # @raise ArgumentError if bindings with unresolved 'override' surfaces as an effective binding
107
+ # @raise ArgumentError if the given argument has the wrong type, or if model is invalid in some way
108
+ # @return [Puppet::Pops::Binder::Binder] self
109
+ # @api public
110
+ #
111
+ def define_layers(layered_bindings)
112
+ raise ArgumentError, "This binder is already configured. Cannot redefine its content." if configured?()
113
+
114
+ raise ArgumentError, "Categories must be defined first" if @category_precedences.empty?
115
+ LayerProcessor.new(self, key_factory).bind(layered_bindings)
116
+ injector_entries.each do |k,v|
117
+ unless key_factory.is_contributions_key?(k) || v.is_resolved?()
118
+ raise ArgumentError, "Binding with unresolved 'override' detected: #{self.class.format_binding(v.binding)}}"
119
+ end
120
+ end
121
+ # and the fat lady has sung
122
+ @configured = true
123
+ self
124
+ end
125
+
126
+ # @api private
127
+ def next_anonymous_key
128
+ tmp = @next_anonymous_key
129
+ @next_anonymous_key += 1
130
+ tmp
131
+ end
132
+
133
+ # @api private
134
+ def self.format_binding(b)
135
+ type_name = Puppet::Pops::Types::TypeCalculator.new().string(b.type)
136
+ layer_name, bindings_name = get_named_binding_layer_and_name(b)
137
+ "binding: '#{type_name}/#{b.name}' in: '#{bindings_name}' in layer: '#{layer_name}'"
138
+ end
139
+
140
+ # @api private
141
+ def self.format_contribution_source(b)
142
+ layer_name, bindings_name = get_named_binding_layer_and_name(b)
143
+ "(layer: #{layer_name}, bindings: #{bindings_name})"
144
+ end
145
+
146
+ # @api private
147
+ def self.get_named_binding_layer_and_name(b)
148
+ return ['<unknown>', '<unknown>'] if b.nil?
149
+ return [get_named_layer(b), b.name] if b.is_a?(Puppet::Pops::Binder::Bindings::NamedBindings)
150
+ get_named_binding_layer_and_name(b.eContainer)
151
+ end
152
+
153
+ # @api private
154
+ def self.get_named_layer(b)
155
+ return '<unknown>' if b.nil?
156
+ return b.name if b.is_a?(Puppet::Pops::Binder::Bindings::NamedLayer)
157
+ get_named_layer(b.eContainer)
158
+ end
159
+
160
+ # Processes the information in a layer, aggregating it to the injector_entries hash in its parent binder.
161
+ # A LayerProcessor holds the intermediate state required while processing one layer.
162
+ #
163
+ # @api private
164
+ #
165
+ class LayerProcessor
166
+ attr :effective_prec
167
+ attr :prec_stack
168
+ attr :bindings
169
+ attr :binder
170
+ attr :key_factory
171
+ attr :contributions
172
+
173
+ def initialize(binder, key_factory)
174
+ @binder = binder
175
+ @key_factory = key_factory
176
+ @prec_stack = []
177
+ @effective_prec = nil
178
+ @bindings = []
179
+ @contributions = []
180
+ @@bind_visitor ||= Puppet::Pops::Visitor.new(nil,"bind",0,0)
181
+ end
182
+
183
+ # Add the binding to the list of potentially effective bindings from this layer
184
+ # @api private
185
+ #
186
+ def add(b)
187
+ bindings << Puppet::Pops::Binder::InjectorEntry.new(effective_prec, b)
188
+ end
189
+
190
+ # Add a multibind contribution
191
+ # @api private
192
+ #
193
+ def add_contribution(b)
194
+ contributions << Puppet::Pops::Binder::InjectorEntry.new(effective_prec, b)
195
+ end
196
+
197
+ # Bind given abstract binding
198
+ # @api private
199
+ #
200
+ def bind(binding)
201
+ @@bind_visitor.visit_this(self, binding)
202
+ end
203
+
204
+ # @return [Puppet::Pops::Binder::InjectorEntry] the entry with the highest (category) precedence
205
+ # @api private
206
+ def highest(b1, b2)
207
+ case b1.precedence <=> b2.precedence
208
+ when 1
209
+ b1
210
+ when -1
211
+ b2
212
+ when 0
213
+ raise_conflicting_binding(b1, b2)
214
+ end
215
+ end
216
+
217
+ # Raises a conflicting bindings error given two InjectorEntry's with same precedence in the same layer
218
+ # (if they are in different layers, something is seriously wrong)
219
+ def raise_conflicting_binding(b1, b2)
220
+ b1_layer_name, b1_bindings_name = Puppet::Pops::Binder::Binder.get_named_binding_layer_and_name(b1.binding)
221
+ b2_layer_name, b2_bindings_name = Puppet::Pops::Binder::Binder.get_named_binding_layer_and_name(b2.binding)
222
+
223
+ # The resolution is per layer, and if they differ something is serious wrong as a higher layer
224
+ # overrides a lower; so no such conflict should be possible:
225
+ unless b1_layer_name == b2_layer_name
226
+ raise ArgumentError, [
227
+ 'Internal Error: Conflicting binding for',
228
+ "'#{b1.binding.name}'",
229
+ 'being resolved across layers',
230
+ "'#{b1_layer_name}' and",
231
+ "'#{b2_layer_name}'"
232
+ ].join(' ')
233
+ end
234
+
235
+ # Conflicting bindings made from the same source
236
+ if b1_bindings_name == b2_bindings_name
237
+ raise ArgumentError, [
238
+ 'Conflicting binding for name:',
239
+ "'#{b1.binding.name}'",
240
+ 'in layer:',
241
+ "'#{b1_layer_name}', ",
242
+ 'both from:',
243
+ "'#{b1_bindings_name}'"
244
+ ].join(' ')
245
+ end
246
+
247
+ # Conflicting bindings from different sources
248
+ raise ArgumentError, [
249
+ 'Conflicting binding for name:',
250
+ "'#{b1.binding.name}'",
251
+ 'in layer:',
252
+ "'#{b1_layer_name}',",
253
+ 'from:',
254
+ "'#{b1_bindings_name}', and",
255
+ "'#{b2_bindings_name}'"
256
+ ].join(' ')
257
+ end
258
+
259
+
260
+ # Produces the key for the given Binding.
261
+ # @param binding [Puppet::Pops::Binder::Bindings::Binding] the binding to get a key for
262
+ # @return [Object] an opaque key
263
+ # @api private
264
+ #
265
+ def key(binding)
266
+ k = if is_contribution?(binding)
267
+ # contributions get a unique (sequential) key
268
+ binder.next_anonymous_key()
269
+ else
270
+ key_factory.binding_key(binding)
271
+ end
272
+ end
273
+
274
+ # @api private
275
+ def is_contribution?(binding)
276
+ ! binding.multibind_id.nil?
277
+ end
278
+
279
+ # @api private
280
+ def push_precedences(precedences)
281
+ prec_stack.push(precedences)
282
+ @effective_prec = nil # clear cache
283
+ end
284
+
285
+ # @api private
286
+ def pop_precedences()
287
+ prec_stack.pop()
288
+ @effective_prec = nil # clear cache
289
+ end
290
+
291
+ # Returns the effective precedence as an array with highest precedence first.
292
+ # Internally the precedence is an array with the highest precedence first.
293
+ #
294
+ # @api private
295
+ #
296
+ def effective_prec()
297
+ unless @effective_prec
298
+ @effective_prec = prec_stack.flatten.uniq.sort.reverse
299
+ if @effective_prec.size == 0
300
+ @effective_prec = [ 0 ] # i.e. "common"
301
+ end
302
+ end
303
+ @effective_prec
304
+ end
305
+
306
+ # @api private
307
+ def bind_Binding(o)
308
+ if is_contribution?(o)
309
+ add_contribution(o)
310
+ else
311
+ add(o)
312
+ end
313
+ end
314
+
315
+ # @api private
316
+ def bind_Bindings(o)
317
+ o.bindings.each {|b| bind(b) }
318
+ end
319
+
320
+ # @api private
321
+ def bind_NamedBindings(o)
322
+ # Name is ignored here, it should be introspected when needed (in case of errors)
323
+ o.bindings.each {|b| bind(b) }
324
+ end
325
+
326
+ # Process CategorizedBindings by calculating precedence, and then if satisfying the predicates, process the contained
327
+ # bindings.
328
+ # @api private
329
+ #
330
+ def bind_CategorizedBindings(o)
331
+ precedences = o.predicates.collect do |p|
332
+ prec = binder.category_precedences[p.categorization]
333
+
334
+ # Skip bindings if the categorization is not present, or
335
+ # if the category value is not the effective value for the categorization
336
+ # Ignore the value for the common category (it is not possible to state common 'false' etc.)
337
+ #
338
+ return unless prec
339
+ return unless binder.category_values[p.categorization] == p.value.downcase || p.categorization == 'common'
340
+ prec
341
+ end
342
+ push_precedences(precedences)
343
+ o.bindings.each {|b| bind(b) }
344
+ pop_precedences()
345
+ end
346
+
347
+ # Process layered bindings from highest to lowest layer
348
+ # @api private
349
+ #
350
+ def bind_LayeredBindings(o)
351
+ o.layers.each do |layer|
352
+ processor = LayerProcessor.new(binder, key_factory)
353
+ # All except abstract (==error) are transfered to injector_entries
354
+
355
+ processor.bind(layer).each do |k, v|
356
+ entry = binder.injector_entries[k]
357
+ unless key_factory.is_contributions_key?(k)
358
+ if v.is_abstract?()
359
+ layer_name, bindings_name = Puppet::Pops::Binder::Binder.get_named_binding_layer_and_name(v.binding)
360
+ type_name = key_factory.type_calculator.string(v.binding.type)
361
+ raise ArgumentError, "The abstract binding '#{type_name}/#{v.binding.name}' in '#{bindings_name}' in layer '#{layer_name}' was not overridden"
362
+ end
363
+ raise ArgumentError, "Internal Error - redefinition of key: #{k}, (should never happen)" if entry
364
+ binder.injector_entries[k] = v
365
+ else
366
+ entry ? entry << v : binder.injector_entries[k] = v
367
+ end
368
+ end
369
+ end
370
+ end
371
+
372
+ # Processes one named ("top level") layer consisting of a list of NamedBindings
373
+ # @api private
374
+ #
375
+ def bind_NamedLayer(o)
376
+ o.bindings.each {|b| bind(b) }
377
+ this_layer = {}
378
+
379
+ # process regular bindings
380
+ bindings.each do |b|
381
+ bkey = key(b.binding)
382
+
383
+ # ignore if a higher layer defined it, but ensure override gets resolved
384
+ if x = binder.injector_entries[bkey]
385
+ x.mark_override_resolved()
386
+ next
387
+ end
388
+
389
+ # if already found in this layer, one wins (and resolves override), or it is an error
390
+ existing = this_layer[bkey]
391
+ winner = existing ? highest(existing, b) : b
392
+ this_layer[bkey] = winner
393
+ if existing
394
+ winner.mark_override_resolved()
395
+ end
396
+ end
397
+
398
+ # Process contributions
399
+ # - organize map multibind_id to bindings with this id
400
+ # - for each id, create an array with the unique anonymous keys to the contributed bindings
401
+ # - bind the index to a special multibind contributions key (these are aggregated)
402
+ #
403
+ c_hash = Hash.new {|hash, key| hash[ key ] = [] }
404
+ contributions.each {|b| c_hash[ b.binding.multibind_id ] << b }
405
+ # - for each id
406
+ c_hash.each do |k, v|
407
+ index = v.collect do |b|
408
+ bkey = key(b.binding)
409
+ this_layer[bkey] = b
410
+ bkey
411
+ end
412
+ contributions_key = key_factory.multibind_contributions(k)
413
+ unless this_layer[contributions_key]
414
+ this_layer[contributions_key] = []
415
+ end
416
+ this_layer[contributions_key] += index
417
+ end
418
+ this_layer
419
+ end
420
+ end
421
+ end