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,67 @@
1
+ # Similar to {Puppet::Pops::Binder::SchemeHandler::ModuleHieraScheme ModuleHieraScheme} but path is
2
+ # relative to the `$confdir` instead of relative to a module root.
3
+ #
4
+ # Does not handle wild-cards.
5
+ # @api public
6
+ class Puppet::Pops::Binder::SchemeHandler::ConfdirHieraScheme < Puppetx::Puppet::BindingsSchemeHandler
7
+
8
+ # (Puppetx::Puppet::BindingsSchemeHandler.contributed_bindings)
9
+ #
10
+ def contributed_bindings(uri, scope, composer)
11
+ split_path = uri.path.split('/')
12
+ name = split_path[1]
13
+ confdir = composer.confdir
14
+ provider = Puppet::Pops::Binder::Hiera2::BindingsProvider.new(uri.to_s, File.join(confdir, uri.path), composer.acceptor)
15
+ provider.load_bindings(scope)
16
+ end
17
+
18
+ # This handler does not support wildcards.
19
+ # The given uri is simply returned in an array.
20
+ # @param uri [URI] the uri to expand
21
+ # @return [Array<URI>] the uri wrapped in an array
22
+ # @todo Handle optional and possibly hiera-1 hiera.yaml config file in the expected location (the same as missing)
23
+ # @api public
24
+ #
25
+ def expand_included(uri, composer)
26
+ result = []
27
+ if config_exist?(uri, composer)
28
+ result << uri unless is_ignored_hiera_version?(uri, composer)
29
+ else
30
+ result << uri unless is_optional?(uri)
31
+ end
32
+ result
33
+ end
34
+
35
+ # This handler does not support wildcards.
36
+ # The given uri is simply returned in an array.
37
+ # @param uri [URI] the uri to expand
38
+ # @return [Array<URI>] the uri wrapped in an array
39
+ # @api public
40
+ #
41
+ def expand_excluded(uri, composer)
42
+ [uri]
43
+ end
44
+
45
+ def config_exist?(uri, composer)
46
+ File.exist?(File.join(composer.confdir, uri.path, 'hiera.yaml'))
47
+ end
48
+
49
+ # A hiera.yaml that exists, is readable, can be loaded, and does not have version >= 2 set is ignored.
50
+ # All other conditions are reported as 'not ignored' even if there are errors; these will be handled later
51
+ # as if the hiera.yaml is a hiera-2 file.
52
+ # @api private
53
+ def is_ignored_hiera_version?(uri, composer)
54
+ config_file = File.join(composer.confdir, uri.path, 'hiera.yaml')
55
+ begin
56
+ data = YAML.load_file(config_file)
57
+ if data.is_a?(Hash)
58
+ ver = data[:version] || data['version']
59
+ return ver.nil? || ver < 2
60
+ end
61
+ rescue Errno::ENOENT
62
+ rescue Errno::ENOTDIR
63
+ rescue ::SyntaxError => e
64
+ end
65
+ return false
66
+ end
67
+ end
@@ -0,0 +1,34 @@
1
+ require 'puppet/pops/binder/scheme_handler/symbolic_scheme'
2
+
3
+ # Similar to {Puppet::Pops::Binder::SchemeHandler::ModuleScheme ModuleScheme}, but relative to the config root.
4
+ # Does not support wildcard expansion.
5
+ #
6
+ # URI
7
+ # ---
8
+ # The URI scheme is `confdir:/[<FQN>]['?' | [?optional]` where FQN is the fully qualified name of the bindings to load.
9
+ # The referecence is made optional by using a URI query of `?` or `?optional`.
10
+ #
11
+ # @todo
12
+ # If the file to load is outside of the file system rooted at $confdir (in a gem, or just on the Ruby path), it can not
13
+ # be marked as optional as it will always be ignored.
14
+ #
15
+ class Puppet::Pops::Binder::SchemeHandler::ConfdirScheme < Puppet::Pops::Binder::SchemeHandler::SymbolicScheme
16
+
17
+ def expand_included(uri, composer)
18
+ fqn = fqn_from_path(uri)[1]
19
+ if is_optional?(uri)
20
+ if Puppet::Pops::Binder::BindingsLoader.loadable?(composer.confdir, fqn)
21
+ [URI.parse('confdir:/' + fqn)]
22
+ else
23
+ []
24
+ end
25
+ else
26
+ # assume it exists (do not give error if not, since it may be excluded later)
27
+ [URI.parse('confdir:/' + fqn)]
28
+ end
29
+ end
30
+
31
+ def expand_excluded(uri, composer)
32
+ [URI.parse("confdir:/#{fqn_from_path(uri)[1]}")]
33
+ end
34
+ end
@@ -0,0 +1,92 @@
1
+ # The `module-hiera:` scheme uses the path to denote a directory relative to a module root
2
+ # The path starts with the name of the module, or '*' to denote *any module*.
3
+ #
4
+ # @example All root hiera.yaml from all modules.
5
+ # module-hiera:/*
6
+ #
7
+ # @example The hiera.yaml from the module `foo`'s relative path `<foo root>/bar`.
8
+ # module-hiera:/foo/bar
9
+ #
10
+ class Puppet::Pops::Binder::SchemeHandler::ModuleHieraScheme < Puppetx::Puppet::BindingsSchemeHandler
11
+ # (Puppetx::Puppet::BindingsSchemeHandler.contributed_bindings)
12
+ # @api public
13
+ def contributed_bindings(uri, scope, composer)
14
+ split_path = uri.path.split('/')
15
+ name = split_path[1]
16
+ mod = composer.name_to_module[name]
17
+ provider = Puppet::Pops::Binder::Hiera2::BindingsProvider.new(uri.to_s, File.join(mod.path, split_path[ 2..-1 ]), composer.acceptor)
18
+ provider.load_bindings(scope)
19
+ end
20
+
21
+ # Expands URIs with wildcards and checks optionality.
22
+ # @param uri [URI] the uri to possibly expand
23
+ # @return [Array<URI>] the URIs to include
24
+ # @api public
25
+ #
26
+ def expand_included(uri, composer)
27
+ result = []
28
+ split_path = uri.path.split('/')
29
+ if split_path.size > 1 && split_path[-1].empty?
30
+ split_path.delete_at(-1)
31
+ end
32
+
33
+ # 0 = "", since a URI with a path must start with '/'
34
+ # 1 = '*' or the module name
35
+ case split_path[ 1 ]
36
+ when '*'
37
+ # create new URIs, one per module name that has a hiera.yaml file relative to its root
38
+ composer.name_to_module.each_pair do | name, mod |
39
+ if File.exist?(File.join(mod.path, split_path[ 2..-1 ], 'hiera.yaml' ))
40
+ path_parts =["", name] + split_path[2..-1]
41
+ result << URI.parse('module-hiera:'+File.join(path_parts))
42
+ end
43
+ end
44
+ when nil
45
+ raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position"
46
+ else
47
+ # If uri has query that is empty, or the text 'optional' skip this uri if it does not exist
48
+ if query = uri.query()
49
+ if query == '' || query == 'optional'
50
+ if File.exist?(File.join(mod.path, split_path[ 2..-1 ], 'hiera.yaml' ))
51
+ result << URI.parse('module-hiera:' + uri.path)
52
+ end
53
+ end
54
+ else
55
+ # assume it exists (do not give error since it may be excluded later)
56
+ result << URI.parse('module-hiera:' + File.join(split_path))
57
+ end
58
+ end
59
+ result
60
+ end
61
+
62
+ # Expands URIs with wildcards and checks optionality.
63
+ # @param uri [URI] the uri to possibly expand
64
+ # @return [Array<URI>] the URIs to exclude
65
+ # @api public
66
+ #
67
+ def expand_excluded(uri, composer)
68
+ result = []
69
+ split_path = uri.path.split('/')
70
+ if split_path.size > 1 && split_path[-1].empty?
71
+ split_path.delete_at(-1)
72
+ end
73
+
74
+ # 0 = "", since a URI with a path must start with '/'
75
+ # 1 = '*' or the module name
76
+ case split_path[ 1 ]
77
+ when '*'
78
+ # create new URIs, one per module name that has a hiera.yaml file relative to its root
79
+ composer.name_to_module.each_pair do | name, mod |
80
+ path_parts =["", mod.name] + split_path[2..-1]
81
+ result << URI.parse('module-hiera:'+File.join(path_parts))
82
+ end
83
+
84
+ when nil
85
+ raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position"
86
+ else
87
+ # create a clean copy (get rid of optional, fragments etc. and a trailing "/")
88
+ result << URI.parse('module-hiera:' + File.join(split_path))
89
+ end
90
+ result
91
+ end
92
+ end
@@ -0,0 +1,84 @@
1
+ require 'puppet/pops/binder/scheme_handler/symbolic_scheme'
2
+
3
+ # The module scheme allows loading bindings using the Puppet autoloader.
4
+ # Optional uris are handled by checking if the symbolic name can be resolved to a loadable file
5
+ # from modules.
6
+ #
7
+ # URI
8
+ # ---
9
+ # The uri is on the format: `module:/[fqn][? | ?optional]` where `fqn` is a fully qualified bindings name
10
+ # starting with the module name or '*' to denote 'any module'. A URI query of `?` or `?optional` makes the
11
+ # request optional; if no loadable file is found, it is simply skipped.
12
+ #
13
+ #
14
+ # @todo
15
+ # Does currently only support checking of optionality against files under a module. If the result should be loaded
16
+ # from any other location it can not be marked as optional as it will be ignored.
17
+ #
18
+ class Puppet::Pops::Binder::SchemeHandler::ModuleScheme < Puppet::Pops::Binder::SchemeHandler::SymbolicScheme
19
+
20
+ # Expands URIs with wildcards and checks optionality.
21
+ # @param uri [URI] the uri to possibly expand
22
+ # @return [Array<URI>] the URIs to include
23
+ # @api public
24
+ #
25
+ def expand_included(uri, composer)
26
+ result = []
27
+ split_name, fqn = fqn_from_path(uri)
28
+
29
+ # supports wild card in the module name
30
+ case split_name[0]
31
+ when '*'
32
+ # create new URIs, one per module name that has a corresponding .rb file relative to its
33
+ # '<root>/lib/puppet/bindings/'
34
+ #
35
+ composer.name_to_module.each_pair do | mod_name, mod |
36
+ expanded_name_parts = [mod_name] + split_name[1..-1]
37
+ expanded_name = expanded_name_parts.join('::')
38
+ if Puppet::Pops::Binder::BindingsLoader.loadable?(mod.path, expanded_name)
39
+ result << URI.parse('module:/' + expanded_name)
40
+ end
41
+ end
42
+ when nil
43
+ raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position"
44
+ else
45
+ joined_name = split_name.join('::')
46
+ # skip optional uri if it does not exist
47
+ if is_optional?(uri)
48
+ mod = composer.name_to_module[split_name[0]]
49
+ if mod && Puppet::Binder::BindingsLoader.loadable?(mod.path, joined_name)
50
+ result << URI.parse('module:/' + joined_name)
51
+ end
52
+ else
53
+ # assume it exists (do not give error if not, since it may be excluded later)
54
+ result << URI.parse('module:/' + joined_name)
55
+ end
56
+ end
57
+ result
58
+ end
59
+
60
+ # Expands URIs with wildcards
61
+ # @param uri [URI] the uri to possibly expand
62
+ # @return [Array<URI>] the URIs to exclude
63
+ # @api public
64
+ #
65
+ def expand_excluded(uri, composer)
66
+ result = []
67
+ split_name, fqn = fqn_from_path(uri)
68
+
69
+ case split_name[ 0 ]
70
+ when '*'
71
+ # create new URIs, one per module name
72
+ composer.name_to_module.each_pair do | name, mod |
73
+ result << URI.parse('module:/' + ([name] + split_name).join('::'))
74
+ end
75
+
76
+ when nil
77
+ raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position"
78
+ else
79
+ # create a clean copy (get rid of optional, fragments etc. and any trailing stuff
80
+ result << URI.parse('module:/' + split_name.join('::'))
81
+ end
82
+ result
83
+ end
84
+ end
@@ -0,0 +1,54 @@
1
+ # Abstract base class for schemes based on symbolic names of bindings.
2
+ # This class helps resolve symbolic names by computing a path from a fully qualified name (fqn).
3
+ # There are also helper methods do determine if the symbolic name contains a wild-card ('*') in the first
4
+ # portion of the fqn (with the convention that '*' means 'any module').
5
+ #
6
+ # @abstract
7
+ # @api public
8
+ #
9
+ class Puppet::Pops::Binder::SchemeHandler::SymbolicScheme < Puppetx::Puppet::BindingsSchemeHandler
10
+
11
+ # Shared implementation for module: and confdir: since the distinction is only in checks if a symbolic name
12
+ # exists as a loadable file or not. Once this method is called it is assumed that the name is relative
13
+ # and that it should exist relative to some loadable ruby location.
14
+ #
15
+ # TODO: this needs to be changed once ARM-8 Puppet DSL concrete syntax is also supported.
16
+ # @api public
17
+ #
18
+ def contributed_bindings(uri, scope, composer)
19
+ fqn = fqn_from_path(uri)[1]
20
+ bindings = Puppet::Pops::Binder::BindingsLoader.provide(scope, fqn)
21
+ raise ArgumentError, "Cannot load bindings '#{uri}' - no bindings found." unless bindings
22
+ # Must clone as the the rest mutates the model
23
+ cloned_bindings = Marshal.load(Marshal.dump(bindings))
24
+ # Give no effective categories (i.e. ok with whatever categories there is)
25
+ Puppet::Pops::Binder::BindingsFactory.contributed_bindings(fqn, cloned_bindings, nil)
26
+ end
27
+
28
+ # @api private
29
+ def fqn_from_path(uri)
30
+ split_path = uri.path.split('/')
31
+ if split_path.size > 1 && split_path[-1].empty?
32
+ split_path.delete_at(-1)
33
+ end
34
+
35
+ fqn = split_path[ 1 ]
36
+ raise ArgumentError, "Module scheme binding reference has no name." unless fqn
37
+ split_name = fqn.split('::')
38
+ # drop leading '::'
39
+ split_name.shift if split_name[0] && split_name[0].empty?
40
+ [split_name, split_name.join('::')]
41
+ end
42
+
43
+ # True if super thinks it is optional or if it contains a wildcard.
44
+ # @return [Boolean] true if the uri represents an optional set of bindings.
45
+ # @api public
46
+ def is_optional?(uri)
47
+ super(uri) || has_wildcard?(uri)
48
+ end
49
+
50
+ # @api private
51
+ def has_wildcard?(uri)
52
+ (path = uri.path) && path.split('/')[1].start_with?('*::')
53
+ end
54
+ end
@@ -0,0 +1,72 @@
1
+ class Puppet::Pops::Binder::SystemBindings
2
+ # Constant with name used for bindings used during initialization of injector
3
+ ENVIRONMENT_BOOT_BINDINGS_NAME = 'puppet::env::injector::boot'
4
+
5
+ Factory = Puppet::Pops::Binder::BindingsFactory
6
+ @extension_bindings = Factory.named_bindings("puppet::extensions")
7
+ @default_bindings = Factory.named_bindings("puppet::default")
8
+ # Bindings in effect when real injector is created
9
+ @injector_boot_bindings = Factory.named_bindings("puppet::injector_boot")
10
+
11
+ def self.extensions()
12
+ @extension_bindings
13
+ end
14
+
15
+ def self.default_bindings()
16
+ @default_bindings
17
+ end
18
+
19
+ def self.injector_boot_bindings()
20
+ @injector_boot_bindings
21
+ end
22
+
23
+ # def self.env_boot_bindings()
24
+ # Puppet::Bindings[Puppet::Pops::Binder::SystemBindings::ENVIRONMENT_BOOT_BINDINGS_NAME]
25
+ # end
26
+
27
+ def self.final_contribution
28
+ effective_categories = Factory.categories([['common', 'true']])
29
+ Factory.contributed_bindings("puppet-final", [deep_clone(@extension_bindings.model)], effective_categories)
30
+ end
31
+
32
+ def self.default_contribution
33
+ effective_categories = Factory.categories([['common', 'true']])
34
+ Factory.contributed_bindings("puppet-default", [deep_clone(@default_bindings.model)], effective_categories)
35
+ end
36
+
37
+ def self.injector_boot_contribution(env_boot_bindings)
38
+ # Compose the injector_boot_bindings contributed from the puppet runtime book (i.e. defaults for
39
+ # extensions that should be active in the boot injector - see Puppetx initialization.
40
+ #
41
+ bindings = [deep_clone(@injector_boot_bindings.model), deep_clone(@injector_default_bindings)]
42
+
43
+ # Add the bindings that come from the bindings_composer as it may define custom extensions added in the bindings
44
+ # configuration. (i.e. bindings required to be able to lookup using bindings schemes and backends when
45
+ # configuring the real injector).
46
+ #
47
+ bindings << env_boot_bindings unless env_boot_bindings.nil?
48
+
49
+ # Use an 'extension' category for extension bindings to allow them to override the default
50
+ # bindings since they are placed in the same layer (this is done to avoid having a separate layer).
51
+ # The purpose for allowing overrides is that someone may want to replace say 'yaml' with a different version,
52
+ # (say one that uses a YAML implementation that actually works ok in ruby 1.8.7 ;-)), an encrypted parser, etc.
53
+ effective_categories = Factory.categories([['extension', 'true'],['common', 'true']])
54
+
55
+ # return the composition and the cateogires.
56
+ Factory.contributed_bindings("puppet-injector-boot", bindings, effective_categories)
57
+ end
58
+
59
+ def self.factory()
60
+ Puppet::Pops::Binder::BindingsFactory
61
+ end
62
+
63
+ def self.type_factory()
64
+ Puppet::Pops::Types::TypeFactory
65
+ end
66
+
67
+ private
68
+
69
+ def self.deep_clone(o)
70
+ Marshal.load(Marshal.dump(o))
71
+ end
72
+ end
@@ -0,0 +1,75 @@
1
+ class Puppet::Pops::IssueReporter
2
+
3
+ # @param acceptor [Puppet::Pops::Validation::Acceptor] the acceptor containing reported issues
4
+ # @option options [String] :message (nil) A message text to use as prefix in a single Error message
5
+ # @option options [Boolean] :emit_warnings (false) A message text to use as prefix in a single Error message
6
+ # @option options [Boolean] :emit_errors (true) whether errors should be emitted or only given message
7
+ # @option options [Exception] :exception_class (Puppet::ParseError) The exception to raise
8
+ #
9
+ def self.assert_and_report(acceptor, options)
10
+ return unless acceptor
11
+
12
+ max_errors = Puppet[:max_errors]
13
+ max_warnings = Puppet[:max_warnings] + 1
14
+ max_deprecations = Puppet[:max_deprecations] + 1
15
+ emit_warnings = options[:emit_warnings] || false
16
+ emit_errors = options[:emit_errors] || true
17
+ emit_message = options[:message]
18
+ emit_exception = options[:exception_class] || Puppet::ParseError
19
+
20
+ # If there are warnings output them
21
+ warnings = acceptor.warnings
22
+ if emit_warnings && warnings.size > 0
23
+ formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
24
+ emitted_w = 0
25
+ emitted_dw = 0
26
+ acceptor.warnings.each do |w|
27
+ if w.severity == :deprecation
28
+ # Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
29
+ # deprecation of constructs in manifests! (It is not designed for that purpose even if
30
+ # used throughout the code base).
31
+ #
32
+ Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
33
+ emitted_dw += 1
34
+ else
35
+ Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
36
+ emitted_w += 1
37
+ end
38
+ break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
39
+ end
40
+ end
41
+
42
+ # If there were errors, report the first found. Use a puppet style formatter.
43
+ errors = acceptor.errors
44
+ if errors.size > 0
45
+ unless emit_errors
46
+ raise emit_exception.new(emit_message)
47
+ end
48
+ formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
49
+ if errors.size == 1 || max_errors <= 1
50
+ # raise immediately
51
+ raise emit_exception.new(format_with_prefix(emit_message, formatter.format(errors[0])))
52
+ end
53
+ emitted = 0
54
+ if emit_message
55
+ Puppet.err(emit_message)
56
+ end
57
+ errors.each do |e|
58
+ Puppet.err(formatter.format(e))
59
+ emitted += 1
60
+ break if emitted >= max_errors
61
+ end
62
+ warnings_message = (emit_warnings && warnings.size > 0) ? ", and #{warnings.size} warnings" : ""
63
+ giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
64
+ exception = emit_exception.new(giving_up_message)
65
+ exception.file = errors[0].file
66
+ raise exception
67
+ end
68
+ parse_result
69
+ end
70
+
71
+ def self.format_with_prefix(prefix, message)
72
+ return message unless prefix
73
+ [prefix, message].join(' ')
74
+ end
75
+ end