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
@@ -0,0 +1,142 @@
1
+ # @api public
2
+ module Puppet::Pops::Binder::BinderIssues
3
+
4
+ # NOTE: The methods #issue and #hard_issue are done in a somewhat funny way
5
+ # since the Puppet::Pops::Issues is a module with these methods defined on the module-class
6
+ # This makes it hard to inherit them in this module. (Likewise if Issues was a class, and they
7
+ # need to be defined for the class, and such methods are also not inherited, it becomes more
8
+ # difficult to reuse these. It did not seem as a good idea to refactor Issues at this point
9
+ # in time - they should both probably be refactored once bindings support is finished.
10
+ # Meanwhile, they delegate to Issues.
11
+
12
+
13
+ # (see Puppet::Pops::Issues#issue)
14
+ def self.issue (issue_code, *args, &block)
15
+ Puppet::Pops::Issues.issue(issue_code, *args, &block)
16
+ end
17
+
18
+ # (see Puppet::Pops::Issues#hard_issue)
19
+ def self.hard_issue(issue_code, *args, &block)
20
+ Puppet::Pops::Issues.hard_issue(issue_code, *args, &block)
21
+ end
22
+
23
+ # Producer issues (binding identified using :binding argument)
24
+
25
+ # @api public
26
+ MISSING_NAME = issue :MISSING_NAME, :binding do
27
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no name"
28
+ end
29
+
30
+ # @api public
31
+ MISSING_KEY = issue :MISSING_KEY, :binding do
32
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no key"
33
+ end
34
+
35
+ # @api public
36
+ MISSING_VALUE = issue :MISSING_VALUE, :binding do
37
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no value"
38
+ end
39
+
40
+ # @api public
41
+ MISSING_EXPRESSION = issue :MISSING_EXPRESSION, :binding do
42
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no expression"
43
+ end
44
+
45
+ # @api public
46
+ MISSING_CLASS_NAME = issue :MISSING_CLASS_NAME, :binding do
47
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no class name"
48
+ end
49
+
50
+ # @api public
51
+ CACHED_PRODUCER_MISSING_PRODUCER = issue :PRODUCER_MISSING_PRODUCER, :binding do
52
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no producer"
53
+ end
54
+
55
+ # @api public
56
+ INCOMPATIBLE_TYPE = issue :INCOMPATIBLE_TYPE, :binding, :expected_type, :actual_type do
57
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has an incompatible type: expected #{label.a_an(expected_type)}, but got #{label.a_an(actual_type)}."
58
+ end
59
+
60
+ # @api public
61
+ MULTIBIND_INCOMPATIBLE_TYPE = issue :MULTIBIND_INCOMPATIBLE_TYPE, :binding, :actual_type do
62
+ "#{label.a_an_uc(binding)} with #{label.a_an(semantic)} cannot bind #{label.a_an(actual_type)} value"
63
+ end
64
+
65
+ # @api public
66
+ MODEL_OBJECT_IS_UNBOUND = issue :MODEL_OBJECT_IS_UNBOUND do
67
+ "#{label.a_an_uc(semantic)} is not contained in a binding"
68
+ end
69
+
70
+ # Binding issues (binding identified using semantic)
71
+
72
+ # @api public
73
+ MISSING_PRODUCER = issue :MISSING_PRODUCER do
74
+ "#{label.a_an_uc(semantic)} has no producer"
75
+ end
76
+
77
+ # @api public
78
+ MISSING_TYPE = issue :MISSING_TYPE do
79
+ "#{label.a_an_uc(semantic)} has no type"
80
+ end
81
+
82
+ # @api public
83
+ MULTIBIND_NOT_COLLECTION_PRODUCER = issue :MULTIBIND_NOT_COLLECTION_PRODUCER, :actual_producer do
84
+ "#{label.a_an_uc(semantic)} must have a MultibindProducerDescriptor, but got: #{label.a_an(actual_producer)}"
85
+ end
86
+
87
+ # @api public
88
+ MULTIBIND_TYPE_ERROR = issue :MULTIBIND_TYPE_ERROR, :actual_type do
89
+ "#{label.a_an_uc(semantic)} is expected to bind a collection type, but got: #{label.a_an(actual_type)}."
90
+ end
91
+
92
+ # @api public
93
+ MISSING_BINDINGS = issue :MISSING_BINDINGS do
94
+ "#{label.a_an_uc(semantic)} has zero bindings"
95
+ end
96
+
97
+ # @api public
98
+ MISSING_BINDINGS_NAME = issue :MISSING_BINDINGS_NAME do
99
+ "#{label.a_an_uc(semantic)} has no name"
100
+ end
101
+
102
+ # @api public
103
+ MISSING_PREDICATES = issue :MISSING_PREDICATES do
104
+ "#{label.a_an_uc(semantic)} has zero predicates"
105
+ end
106
+
107
+ # @api public
108
+ MISSING_CATEGORIZATION = issue :MISSING_CATEGORIZATION do
109
+ "#{label.a_an_uc(semantic)} has a category without categorization"
110
+ end
111
+
112
+ # @api public
113
+ MISSING_CATEGORY_VALUE = issue :MISSING_CATEGORY_VALUE do
114
+ "#{label.a_an_uc(semantic)} has a category without value"
115
+ end
116
+
117
+ # @api public
118
+ MISSING_LAYERS = issue :MISSING_LAYERS do
119
+ "#{label.a_an_uc(semantic)} has zero layers"
120
+ end
121
+
122
+ # @api public
123
+ MISSING_LAYER_NAME = issue :MISSING_LAYER_NAME do
124
+ "#{label.a_an_uc(semantic)} has a layer without name"
125
+ end
126
+
127
+ # @api public
128
+ MISSING_BINDINGS_IN_LAYER = issue :MISSING_BINDINGS_IN_LAYER, :layer do
129
+ "#{label.a_an_uc(semantic)} has zero bindings in #{label.label(layer)}"
130
+ end
131
+
132
+ # @api public
133
+ PRECEDENCE_MISMATCH_IN_CONTRIBUTION = issue :PRECEDENCE_MISMATCH_IN_CONTRIBUTION, :categorization do
134
+ "Precedence mismatch: binding contribution '#{semantic.name}', category: '#{categorization}' is not in correct order"
135
+ end
136
+
137
+ # @api public
138
+ MISSING_CATEGORY_PRECEDENCE = issue :MISSING_CATEGORY_PRECEDENCE, :categorization do
139
+ "Missing category precedence: binding contribution '#{semantic.name}', category: '#{categorization}' not found in overall config"
140
+ end
141
+
142
+ end
@@ -0,0 +1,217 @@
1
+ # A validator/checker of a bindings model
2
+ # @api public
3
+ #
4
+ class Puppet::Pops::Binder::BindingsChecker
5
+ Bindings = Puppet::Pops::Binder::Bindings
6
+ Issues = Puppet::Pops::Binder::BinderIssues
7
+ Types = Puppet::Pops::Types
8
+
9
+ attr_reader :type_calculator
10
+ attr_reader :acceptor
11
+
12
+ # @api public
13
+ def initialize(diagnostics_producer)
14
+ @@check_visitor ||= Puppet::Pops::Visitor.new(nil, "check", 0, 0)
15
+ @type_calculator = Puppet::Pops::Types::TypeCalculator.new()
16
+ @expression_validator = Puppet::Pops::Validation::ValidatorFactory_3_1.new().checker(diagnostics_producer)
17
+ @acceptor = diagnostics_producer
18
+ end
19
+
20
+ # Validates the entire model by visiting each model element and calling `check`.
21
+ # The result is collected (or acted on immediately) by the configured diagnostic provider/acceptor
22
+ # given when creating this Checker.
23
+ #
24
+ # @api public
25
+ #
26
+ def validate(b)
27
+ check(b)
28
+ b.eAllContents.each {|c| check(c) }
29
+ end
30
+
31
+ # Performs binding validity check
32
+ # @api private
33
+ def check(b)
34
+ @@check_visitor.visit_this(self, b)
35
+ end
36
+
37
+ # Checks that a binding has a producer and a type
38
+ # @api private
39
+ def check_Binding(b)
40
+ # Must have a type
41
+ acceptor.accept(Issues::MISSING_TYPE, b) unless b.type.is_a?(Types::PObjectType)
42
+
43
+ # Must have a producer
44
+ acceptor.accept(Issues::MISSING_PRODUCER, b) unless b.producer.is_a?(Bindings::ProducerDescriptor)
45
+ end
46
+
47
+ # Checks that the producer is a Multibind producer and that the type is a PCollectionType
48
+ # @api private
49
+ def check_Multibinding(b)
50
+ # id is optional (empty id blocks contributions)
51
+
52
+ # A multibinding must have PCollectionType
53
+ acceptor.accept(Issues::MULTIBIND_TYPE_ERROR, b, {:actual_type => b.type}) unless b.type.is_a?(Types::PCollectionType)
54
+
55
+ # if the producer is nil, a suitable producer will be picked automatically
56
+ unless b.producer.nil? || b.producer.is_a?(Bindings::MultibindProducerDescriptor)
57
+ acceptor.accept(Issues::MULTIBIND_NOT_COLLECTION_PRODUCER, b, {:actual_producer => b.producer})
58
+ end
59
+ end
60
+
61
+ # Checks that the bindings object contains at least one binding. Then checks each binding in turn
62
+ # @api private
63
+ def check_Bindings(b)
64
+ acceptor.accept(Issues::MISSING_BINDINGS, b) unless has_entries?(b.bindings)
65
+ end
66
+
67
+ # Checks that a name has been associated with the bindings
68
+ # @api private
69
+ def check_NamedBindings(b)
70
+ acceptor.accept(Issues::MISSING_BINDINGS_NAME, b) unless has_chars?(b.name)
71
+ check_Bindings(b)
72
+ end
73
+
74
+ # Check that the category has a categorization and a value
75
+ # @api private
76
+ def check_Category(c)
77
+ acceptor.accept(Issues::MISSING_CATEGORIZATION, binding_parent(c)) unless has_chars?(c.categorization)
78
+ acceptor.accept(Issues::MISSING_CATEGORY_VALUE, binding_parent(c)) unless has_chars?(c.value)
79
+ end
80
+
81
+ # Check that the binding contains at least one predicate and that all predicates are categorized and has a value
82
+ # @api private
83
+ def check_CategorizedBindings(b)
84
+ acceptor.accept(Issues::MISSING_PREDICATES, b) unless has_entries?(b.predicates)
85
+ check_Bindings(b)
86
+ end
87
+
88
+ # @api private
89
+ def check_EffectiveCategories(ec)
90
+ end
91
+
92
+ # Check layer has a name
93
+ # @api private
94
+ def check_NamedLayer(l)
95
+ acceptor.accept(Issues::MISSING_LAYER_NAME, binding_parent(l)) unless has_chars?(l.name)
96
+ # It is ok to have an empty layer
97
+ # acceptor.accept(Issues::MISSING_BINDINGS_IN_LAYER, binding_parent(l), { :layer => l.name }) unless has_entries?(l.bindings)
98
+ end
99
+
100
+ # Checks that the binding has layers and that each layer has a name and at least one binding
101
+ # @api private
102
+ def check_LayeredBindings(b)
103
+ acceptor.accept(Issues::MISSING_LAYERS, b) unless has_entries?(b.layers)
104
+ end
105
+
106
+ # Checks that the non caching producer has a producer to delegate to
107
+ # @api private
108
+ def check_NonCachingProducerDescriptor(p)
109
+ acceptor.accept(Issues::PRODUCER_MISSING_PRODUCER, p) unless p.producer.is_a?(Bindings::ProducerDescriptor)
110
+ end
111
+
112
+ # Checks that a constant value has been declared in the producer and that the type
113
+ # of the value is compatible with the type declared in the binding
114
+ # @api private
115
+ def check_ConstantProducerDescriptor(p)
116
+ # the product must be of compatible type
117
+ # TODO: Likely to change when value becomes a typed Puppet Object
118
+ b = binding_parent(p)
119
+ if p.value.nil?
120
+ acceptor.accept(Issues::MISSING_VALUE, p, {:binding => b})
121
+ else
122
+ infered = type_calculator.infer(p.value)
123
+ unless type_calculator.assignable?(b.type, infered)
124
+ acceptor.accept(Issues::INCOMPATIBLE_TYPE, p, {:binding => b, :expected_type => b.type, :actual_type => infered})
125
+ end
126
+ end
127
+ end
128
+
129
+ # Checks that an expression has been declared in the producer
130
+ # @api private
131
+ def check_EvaluatingProducerDescriptor(p)
132
+ unless p.expression.is_a?(Puppet::Pops::Model::Expression)
133
+ acceptor.accept(Issues::MISSING_EXPRESSION, p, {:binding => binding_parent(p)})
134
+ end
135
+ end
136
+
137
+ # Checks that a class name has been declared in the producer
138
+ # @api private
139
+ def check_InstanceProducerDescriptor(p)
140
+ acceptor.accept(Issues::MISSING_CLASS_NAME, p, {:binding => binding_parent(p)}) unless has_chars?(p.class_name)
141
+ end
142
+
143
+ # Checks that a type and a name has been declared. The type must be assignable to the type
144
+ # declared in the binding. The name can be an empty string to denote 'no name'
145
+ # @api private
146
+ def check_LookupProducerDescriptor(p)
147
+ b = binding_parent(p)
148
+ unless type_calculator.assignable(b.type, p.type)
149
+ acceptor.accept(Issues::INCOMPATIBLE_TYPE, p, {:binding => b, :expected_type => b.type, :actual_type => p.type })
150
+ end
151
+ acceptor.accept(Issues::MISSING_NAME, p, {:binding => b}) if p.name.nil? # empty string is OK
152
+ end
153
+
154
+ # Checks that a key has been declared, then calls producer_LookupProducerDescriptor to perform
155
+ # checks associated with the super class
156
+ # @api private
157
+ def check_HashLookupProducerDescriptor(p)
158
+ acceptor.accept(Issues::MISSING_KEY, p, {:binding => binding_parent(p)}) unless has_chars?(p.key)
159
+ check_LookupProducerDescriptor(p)
160
+ end
161
+
162
+ # Checks that the type declared in the binder is a PArrayType
163
+ # @api private
164
+ def check_ArrayMultibindProducerDescriptor(p)
165
+ b = binding_parent(p)
166
+ acceptor.accept(Issues::MULTIBIND_INCOMPATIBLE_TYPE, p, {:binding => b, :actual_type => b.type}) unless b.type.is_a?(Types::PArrayType)
167
+ end
168
+
169
+ # Checks that the type declared in the binder is a PHashType
170
+ # @api private
171
+ def check_HashMultibindProducerDescriptor(p)
172
+ b = binding_parent(p)
173
+ acceptor.accept(Issues::MULTIBIND_INCOMPATIBLE_TYPE, p, {:binding => b, :actual_type => b.type}) unless b.type.is_a?(Types::PHashType)
174
+ end
175
+
176
+ # Checks that the producer that this producer delegates to is declared
177
+ # @api private
178
+ def check_ProducerProducerDescriptor(p)
179
+ unless p.producer.is_a?(Bindings::ProducerDescriptor)
180
+ acceptor.accept(Issues::PRODUCER_MISSING_PRODUCER, p, {:binding => binding_parent(p)})
181
+ end
182
+ end
183
+
184
+ # @api private
185
+ def check_Expression(t)
186
+ @expression_validator.validate(t)
187
+ end
188
+
189
+ # @api private
190
+ def check_PObjectType(t)
191
+ # Do nothing
192
+ end
193
+
194
+ # Returns true if the argument is a non empty string
195
+ # @api private
196
+ def has_chars?(s)
197
+ s.is_a?(String) && !s.empty?
198
+ end
199
+
200
+ # @api private
201
+ def has_entries?(s)
202
+ !(s.nil? || s.empty?)
203
+ end
204
+
205
+ # @api private
206
+ def binding_parent(p)
207
+ begin
208
+ x = p.eContainer
209
+ if x.nil?
210
+ acceptor.accept(Issues::MODEL_OBJECT_IS_UNBOUND, p)
211
+ return nil
212
+ end
213
+ p = x
214
+ end while !p.is_a?(Bindings::AbstractBinding)
215
+ p
216
+ end
217
+ end
@@ -0,0 +1,241 @@
1
+ # The BindingsComposer handles composition of multiple bindings sources
2
+ # It is directed by a {Puppet::Pops::Binder::Config::BinderConfig BinderConfig} that indicates how
3
+ # the final composition should be layered, and what should be included/excluded in each layer
4
+ #
5
+ # The bindings composer is intended to be used once per environment as the compiler starts its work.
6
+ #
7
+ # TODO: Possibly support envdir: scheme / relative to environment root (== same as confdir if there is only one environment).
8
+ # This is probably easier to do after ENC changes described in ARM-8 have been implemented.
9
+ # TODO: If same config is loaded in a higher layer, skip it in the lower (since it is meaningless to load it again with lower
10
+ # precedence. (Optimization, or possibly an error, should produce a warning).
11
+ #
12
+ class Puppet::Pops::Binder::BindingsComposer
13
+
14
+ # The BindingsConfig instance holding the read and parsed, but not evaluated configuration
15
+ # @api public
16
+ #
17
+ attr_reader :config
18
+
19
+ # map of scheme name to handler
20
+ # @api private
21
+ attr_reader :scheme_handlers
22
+
23
+ # @return Hash<String, Puppet::Module> map of module name to module instance
24
+ # @api private
25
+ attr_reader :name_to_module
26
+
27
+ # @api private
28
+ attr_reader :confdir
29
+
30
+ # @api private
31
+ attr_reader :diagnostics
32
+
33
+ # Container of all warnings and errors produced while initializing and loading bindings
34
+ #
35
+ # @api public
36
+ attr_reader :acceptor
37
+
38
+ # @api public
39
+ def initialize()
40
+ @acceptor = Puppet::Pops::Validation::Acceptor.new()
41
+ @diagnostics = Puppet::Pops::Binder::Config::DiagnosticProducer.new(acceptor)
42
+ @config = Puppet::Pops::Binder::Config::BinderConfig.new(@diagnostics)
43
+ if acceptor.errors?
44
+ Puppet::Pops::IssueReporter.assert_and_report(acceptor, :message => 'Binding Composer: error while reading config.')
45
+ raise Puppet::DevError.new("Internal Error: IssueReporter did not raise exception for errors in bindings config.")
46
+ end
47
+ end
48
+
49
+ # Configures and creates the boot injector.
50
+ # The read config may optionally contain mapping of bindings scheme handler name to handler class, and
51
+ # mapping of biera2 backend symbolic name to backend class.
52
+ # If present, these are turned into bindings in the category 'extension' (which is only used in the boot injector) which
53
+ # has higher precedence than 'default'. This is done to allow users to override the default bindings for
54
+ # schemes and backends.
55
+ # @param scope [Puppet::Parser:Scope] the scope (used to find compiler and injector for the environment)
56
+ # @api private
57
+ #
58
+ def configure_and_create_injector(scope)
59
+ # create the injector (which will pick up the bindings registered above)
60
+ @scheme_handlers = SchemeHandlerHelper.new(scope)
61
+
62
+ # get extensions from the config
63
+ # ------------------------------
64
+ scheme_extensions = @config.scheme_extensions
65
+ hiera_backends = @config.hiera_backends
66
+
67
+ # Define a named bindings that are known by the SystemBindings
68
+ boot_bindings = Puppet::Pops::Binder::BindingsFactory.named_bindings(Puppet::Pops::Binder::SystemBindings::ENVIRONMENT_BOOT_BINDINGS_NAME) do
69
+ scheme_extensions.each_pair do |scheme, class_name|
70
+ # turn each scheme => class_name into a binding (contribute to the buildings-schemes multibind).
71
+ # do this in category 'extensions' to allow them to override the 'default'
72
+ when_in_category('extension', 'true').bind do
73
+ name(scheme)
74
+ instance_of(Puppetx::BINDINGS_SCHEMES_TYPE)
75
+ in_multibind(Puppetx::BINDINGS_SCHEMES)
76
+ to_instance(class_name)
77
+ end
78
+ end
79
+ hiera_backends.each_pair do |symbolic, class_name|
80
+ # turn each symbolic => class_name into a binding (contribute to the hiera backends multibind).
81
+ # do this in category 'extensions' to allow them to override the 'default'
82
+ when_in_category('extension', 'true').bind do
83
+ name(symbolic)
84
+ instance_of(Puppetx::HIERA2_BACKENDS_TYPE)
85
+ in_multibind(Puppetx::HIERA2_BACKENDS)
86
+ to_instance(class_name)
87
+ end
88
+ end
89
+ end
90
+
91
+ @injector = scope.compiler.create_boot_injector(boot_bindings.model)
92
+ end
93
+
94
+ # @return [Puppet::Pops::Binder::Bindings::LayeredBindings]
95
+ def compose(scope)
96
+ # The boot injector is used to lookup scheme-handlers
97
+ configure_and_create_injector(scope)
98
+
99
+ # get all existing modules and their root path
100
+ @name_to_module = {}
101
+ scope.environment.modules.each {|mod| name_to_module[mod.name] = mod }
102
+
103
+ # setup the confdir
104
+ @confdir = Puppet.settings[:confdir]
105
+
106
+ factory = Puppet::Pops::Binder::BindingsFactory
107
+ contributions = []
108
+ configured_layers = @config.layering_config.collect do | layer_config |
109
+ # get contributions with effective categories
110
+ contribs = configure_layer(layer_config, scope, diagnostics)
111
+ # collect the contributions separately for later checking of category precedence
112
+ contributions.concat(contribs)
113
+ # create a named layer with all the bindings for this layer
114
+ factory.named_layer(layer_config['name'], *contribs.collect {|c| c.bindings }.flatten)
115
+ end
116
+
117
+ # must check all contributions are based on compatible category precedence
118
+ # (Note that contributions no longer contains the bindings as a side effect of setting them in the collected
119
+ # layer. The effective categories and the name remains in the contributed model; this is enough for checking
120
+ # and error reporting).
121
+ check_contribution_precedence(contributions)
122
+
123
+ # Add the two system layers; the final - highest ("can not be overridden" layer), and the lowest
124
+ # Everything here can be overridden 'default' layer.
125
+ #
126
+ configured_layers.insert(0, Puppet::Pops::Binder::SystemBindings.final_contribution)
127
+ configured_layers.insert(-1, Puppet::Pops::Binder::SystemBindings.default_contribution)
128
+
129
+ # and finally... create the resulting structure
130
+ factory.layered_bindings(*configured_layers)
131
+ end
132
+
133
+ # Evaluates configured categorization and returns the result.
134
+ # The result is not cached.
135
+ # @api public
136
+ #
137
+ def effective_categories(scope)
138
+ unevaluated_categories = @config.categorization
139
+ parser = Puppet::Pops::Parser::EvaluatingParser.new()
140
+ file_source = @config.config_file or "defaults in: #{__FILE__}"
141
+ evaluated_categories = unevaluated_categories.collect do |category_tuple|
142
+ evaluated_categories = [ category_tuple[0], parser.evaluate_string( scope, parser.quote( category_tuple[1] ), file_source ) ]
143
+ if evaluated_categories[1].is_a?(String)
144
+ # category values are always in lower case
145
+ evaluated_categories[1] = evaluated_categories[1].downcase
146
+ else
147
+ raise ArgumentError, "Categorization value must be a string, category #{evaluated_categories[0]} evaluation resulted in a: '#{result[1].class}'"
148
+ end
149
+ evaluated_categories
150
+ end
151
+ Puppet::Pops::Binder::BindingsFactory::categories(evaluated_categories)
152
+ end
153
+
154
+ private
155
+
156
+ # Checks that contribution's effective categorization is in the same relative order as in the overall
157
+ # categorization precedence.
158
+ #
159
+ def check_contribution_precedence(contributions)
160
+ cat_prec = { }
161
+ @config.categorization.each_with_index {|c, i| cat_prec[ c[0] ] = i }
162
+ contributions.each() do |contrib|
163
+ # Contributions that do not specify their opinion about categorization silently accepts the precedence
164
+ # set in the root configuration - and may thus produce an unexpected result
165
+ #
166
+ next unless ec = contrib.effective_categories
167
+ next unless categories = ec.categories
168
+ prev_prec = -1
169
+ categories.each do |c|
170
+ prec = cat_prec[c.categorization]
171
+ issues = Puppet::Pops::Binder::BinderIssues
172
+ unless prec
173
+ diagnostics.accept(issues::MISSING_CATEGORY_PRECEDENCE, c, :categorization => c.categorization)
174
+ next
175
+ end
176
+ unless prec > prev_prec
177
+ diagnostics.accept(issues::PRECEDENCE_MISMATCH_IN_CONTRIBUTION, c, :categorization => c.categorization)
178
+ end
179
+ prev_prec = prec
180
+ end
181
+ end
182
+ end
183
+
184
+ def configure_layer(layer_description, scope, diagnostics)
185
+ name = layer_description['name']
186
+
187
+ # compute effective set of uris to load (and get rid of any duplicates in the process
188
+ included_uris = array_of_uris(layer_description['include'])
189
+ excluded_uris = array_of_uris(layer_description['exclude'])
190
+ effective_uris = Set.new(expand_included_uris(included_uris)).subtract(Set.new(expand_excluded_uris(excluded_uris)))
191
+
192
+ # Each URI should result in a ContributedBindings
193
+ effective_uris.collect { |uri| scheme_handlers[uri.scheme].contributed_bindings(uri, scope, self) }
194
+ end
195
+
196
+ def array_of_uris(descriptions)
197
+ return [] unless descriptions
198
+ descriptions = [descriptions] unless descriptions.is_a?(Array)
199
+ descriptions.collect {|d| URI.parse(d) }
200
+ end
201
+
202
+ def expand_included_uris(uris)
203
+ result = []
204
+ uris.each do |uri|
205
+ unless handler = scheme_handlers[uri.scheme]
206
+ raise ArgumentError, "Unknown bindings provider scheme: '#{uri.scheme}'"
207
+ end
208
+ result.concat(handler.expand_included(uri, self))
209
+ end
210
+ result
211
+ end
212
+
213
+ def expand_excluded_uris(uris)
214
+ result = []
215
+ uris.each do |uri|
216
+ unless handler = scheme_handlers[uri.scheme]
217
+ raise ArgumentError, "Unknown bindings provider scheme: '#{uri.scheme}'"
218
+ end
219
+ result.concat(handler.expand_excluded(uri, self))
220
+ end
221
+ result
222
+ end
223
+
224
+ class SchemeHandlerHelper
225
+ T = Puppet::Pops::Types::TypeFactory
226
+ HASH_OF_HANDLER = T.hash_of(T.type_of('Puppetx::Puppet::BindingsSchemeHandler'))
227
+ def initialize(scope)
228
+ @scope = scope
229
+ @cache = nil
230
+ end
231
+ def [] (scheme)
232
+ load_schemes unless @cache
233
+ @cache[scheme]
234
+ end
235
+
236
+ def load_schemes
237
+ @cache = @scope.compiler.boot_injector.lookup(@scope, HASH_OF_HANDLER, Puppetx::BINDINGS_SCHEMES) || {}
238
+ end
239
+ end
240
+
241
+ end