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
@@ -28,6 +28,7 @@ class Puppet::Node::Facts
28
28
  def add_local_facts
29
29
  values["clientcert"] = Puppet.settings[:certname]
30
30
  values["clientversion"] = Puppet.version.to_s
31
+ values["clientnoop"] = Puppet.settings[:noop]
31
32
  end
32
33
 
33
34
  def initialize(name, values = {})
@@ -64,6 +65,14 @@ class Puppet::Node::Facts
64
65
  end
65
66
  end
66
67
 
68
+ # Sanitize fact values by converting everything not a string, boolean
69
+ # numeric, array or hash into strings.
70
+ def sanitize
71
+ values.each do |fact, value|
72
+ values[fact] = sanitize_fact value
73
+ end
74
+ end
75
+
67
76
  def ==(other)
68
77
  return false unless self.name == other.name
69
78
  strip_internal == other.send(:strip_internal)
@@ -93,11 +102,11 @@ class Puppet::Node::Facts
93
102
  end
94
103
 
95
104
  def timestamp=(time)
96
- self.values[:_timestamp] = time
105
+ self.values['_timestamp'] = time
97
106
  end
98
107
 
99
108
  def timestamp
100
- self.values[:_timestamp]
109
+ self.values['_timestamp']
101
110
  end
102
111
 
103
112
  private
@@ -108,4 +117,21 @@ class Puppet::Node::Facts
108
117
  newvals.find_all { |name, value| name.to_s =~ /^_/ }.each { |name, value| newvals.delete(name) }
109
118
  newvals
110
119
  end
120
+
121
+ def sanitize_fact(fact)
122
+ if fact.is_a? Hash then
123
+ ret = {}
124
+ fact.each_pair { |k,v| ret[sanitize_fact k]=sanitize_fact v }
125
+ ret
126
+ elsif fact.is_a? Array then
127
+ fact.collect { |i| sanitize_fact i }
128
+ elsif fact.is_a? Numeric \
129
+ or fact.is_a? TrueClass \
130
+ or fact.is_a? FalseClass \
131
+ or fact.is_a? String
132
+ fact
133
+ else
134
+ fact.to_s
135
+ end
136
+ end
111
137
  end
@@ -1,5 +1,4 @@
1
1
  require 'puppet/util/methodhelper'
2
- require 'puppet/util/log_paths'
3
2
  require 'puppet/util/logging'
4
3
  require 'puppet/util/docs'
5
4
 
@@ -22,7 +21,6 @@ require 'puppet/util/docs'
22
21
  class Puppet::Parameter
23
22
  include Puppet::Util
24
23
  include Puppet::Util::Errors
25
- include Puppet::Util::LogPaths
26
24
  include Puppet::Util::Logging
27
25
  include Puppet::Util::MethodHelper
28
26
 
@@ -241,10 +239,11 @@ class Puppet::Parameter
241
239
  end
242
240
 
243
241
  # @overload validate {|| ... }
244
- # Defines an optional method that is used to validate the parameter's value.
242
+ # Defines an optional method that is used to validate the parameter's DSL/string value.
245
243
  # Validation should raise appropriate exceptions, the return value of the given block is ignored.
246
244
  # The easiest way to raise an appropriate exception is to call the method {Puppet::Util::Errors.fail} with
247
245
  # the message as an argument.
246
+ # To validate the munged value instead, just munge the value (`munge(value)`).
248
247
  #
249
248
  # @return [void]
250
249
  # @dsl type
@@ -306,19 +305,29 @@ class Puppet::Parameter
306
305
  #
307
306
  attr_accessor :parent
308
307
 
309
- # @!method line()
310
- # @return [Integer] Returns the result of calling the same method on the associated resource.
311
- # @!method file
312
- # @return [Integer] Returns the result of calling the same method on the associated resource.
313
- # @!method version
314
- # @return [Integer] Returns the result of calling the same method on the associated resource.
315
- #
316
- [:line, :file, :version].each do |param|
317
- define_method(param) do
318
- resource.send(param)
319
- end
308
+ # Returns a string representation of the resource's containment path in
309
+ # the catalog.
310
+ # @return [String]
311
+ def path
312
+ @path ||= '/' + pathbuilder.join('/')
320
313
  end
321
314
 
315
+ # @return [Integer] Returns the result of calling the same method on the associated resource.
316
+ def line
317
+ resource.line
318
+ end
319
+
320
+ # @return [Integer] Returns the result of calling the same method on the associated resource.
321
+ def file
322
+ resource.file
323
+ end
324
+
325
+ # @return [Integer] Returns the result of calling the same method on the associated resource.
326
+ def version
327
+ resource.version
328
+ end
329
+
330
+
322
331
  # Initializes the parameter with a required resource reference and optional attribute settings.
323
332
  # The option `:resource` must be specified or an exception is raised. Any additional options passed
324
333
  # are used to initialize the attributes of this parameter by treating each key in the `options` hash as
@@ -377,9 +386,9 @@ class Puppet::Parameter
377
386
  tmp
378
387
  end
379
388
 
380
- # @todo Original comment = _return the full path to us, for logging and rollback; not currently
381
- # used_ This is difficult to figure out (if it is used or not as calls are certainly made to "pathbuilder"
382
- # method is several places, not just sure if it is this implementation or not.
389
+ # Returns an array of strings representing the containment heirarchy
390
+ # (types/classes) that make up the path to the resource from the root
391
+ # of the catalog. This is mostly used for logging purposes.
383
392
  #
384
393
  # @api private
385
394
  def pathbuilder
@@ -477,7 +486,7 @@ class Puppet::Parameter
477
486
  # @todo This original comment _"All of the checking should possibly be
478
487
  # late-binding (e.g., users might not exist when the value is assigned
479
488
  # but might when it is asked for)."_ does not seem to be correct, the implementation
480
- # calls both validate an munge on the given value, so no late binding.
489
+ # calls both validate and munge on the given value, so no late binding.
481
490
  #
482
491
  # The given value is validated and then munged (if munging has been specified). The result is store
483
492
  # as the value of this arameter.
@@ -0,0 +1,20 @@
1
+ # This specialized {Puppet::Parameter} handles boolean options, accepting lots
2
+ # of strings and symbols for both truthiness and falsehood.
3
+ #
4
+ class Puppet::Parameter::Boolean < Puppet::Parameter
5
+ def unsafe_munge(value)
6
+ # downcase strings
7
+ if value.respond_to? :downcase
8
+ value = value.downcase
9
+ end
10
+
11
+ case value
12
+ when true, :true, 'true', :yes, 'yes'
13
+ true
14
+ when false, :false, 'false', :no, 'no'
15
+ false
16
+ else
17
+ fail('expected a boolean value')
18
+ end
19
+ end
20
+ end
@@ -45,7 +45,7 @@ class Puppet::Parameter::Path < Puppet::Parameter
45
45
  # This default implementation does not perform any munging, it just checks the one/many paths
46
46
  # constraints. A derived implementation can perform this check as:
47
47
  # `paths.is_a?(Array) and ! self.class.arrays?` and raise a {Puppet::Error}.
48
- # @param [String, Array<String>] one of multiple paths
48
+ # @param paths [String, Array<String>] one of multiple paths
49
49
  # @return [String, Array<String>] the given paths
50
50
  # @raise [Puppet::Error] if the given paths does not comply with the on/many paths rule.
51
51
  def unsafe_munge(paths)
@@ -34,7 +34,7 @@ class Puppet::Parameter::Value
34
34
 
35
35
  # Initializes the instance with a literal accepted value, or a regular expression.
36
36
  # If anything else is passed, it is turned into a String, and then made into a Symbol.
37
- # @param [Symbol, Regexp, Object] the value to accept, Symbol, a regular expression, or object to convert.
37
+ # @param name [Symbol, Regexp, Object] the value to accept, Symbol, a regular expression, or object to convert.
38
38
  # @api private
39
39
  #
40
40
  def initialize(name)
@@ -189,7 +189,7 @@ class Puppet::Parameter::ValueCollection
189
189
  end
190
190
 
191
191
  # Returns a valid value matcher (a literal or regular expression)
192
- # @todo This looks odd, asking for an instance that matches a symbol, or a instance that has
192
+ # @todo This looks odd, asking for an instance that matches a symbol, or an instance that has
193
193
  # a regexp. What is the intention here? Marking as api private...
194
194
  #
195
195
  # @return [Puppet::Parameter::Value] a valid valud matcher
@@ -80,4 +80,12 @@ class Puppet::Parser::AST
80
80
  raise ArgumentError, "Invalid arithmetic operator #{@operator}" unless %w{+ - * / % << >>}.include?(@operator)
81
81
  end
82
82
  end
83
+
84
+ # Used by future parser instead of ArithmeticOperator to enable concatenation
85
+ class ArithmeticOperator2 < ArithmeticOperator
86
+ # Overrides the arithmetic operator to allow concatenation
87
+ def assert_concatenation_supported
88
+ end
89
+ end
90
+
83
91
  end
@@ -15,9 +15,6 @@ class Puppet::Parser::AST
15
15
 
16
16
  value = @test.safeevaluate(scope)
17
17
 
18
- retvalue = nil
19
- found = false
20
-
21
18
  # Iterate across the options looking for a match.
22
19
  default = nil
23
20
  @options.each do |option|
@@ -36,31 +36,50 @@ class Puppet::Parser::AST
36
36
  #
37
37
  def call(scope, *args)
38
38
  raise Puppet::ParseError, "Too many arguments: #{args.size} for #{parameters.size}" unless args.size <= parameters.size
39
+
40
+ # associate values with parameters
39
41
  merged = parameters.zip(args)
40
- missing = merged.select { |e| !e[1] && e[0].size == 1 }
42
+ # calculate missing arguments
43
+ missing = parameters.slice(args.size, parameters.size - args.size).select {|e| e.size == 1}
41
44
  unless missing.empty?
42
45
  optional = parameters.count { |p| p.size == 2 }
43
46
  raise Puppet::ParseError, "Too few arguments; #{args.size} for #{optional > 0 ? ' min ' : ''}#{parameters.size - optional}"
44
47
  end
45
48
 
46
49
  evaluated = merged.collect do |m|
47
- # Ruby 1.8.7 zip seems to produce a different result than Ruby 1.9.3 in some situations
48
- n = m[0].is_a?(Array) ? m[0][0] : m[0]
49
- v = m[1] || (m[0][1]).safeevaluate(scope) # given value or default expression value
50
- [n, v]
50
+ # m can be one of
51
+ # m = [["name"], "given"]
52
+ # | [["name", default_expr], "given"]
53
+ #
54
+ # "given" is always an optional entry. If a parameter was provided then
55
+ # the entry will be in the array, otherwise the m array will be a
56
+ # single element.
57
+ given_argument = m[1]
58
+ argument_name = m[0][0]
59
+ default_expression = m[0][1]
60
+
61
+ value = if m.size == 1
62
+ default_expression.safeevaluate(scope)
63
+ else
64
+ given_argument
65
+ end
66
+ [argument_name, value]
51
67
  end
52
68
 
53
69
  # Store the evaluated name => value associations in a new inner/local/ephemeral scope
54
70
  # (This is made complicated due to the fact that the implementation of scope is overloaded with
55
71
  # functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
56
72
  # on a scope "stack").
73
+
74
+ # Ensure variable exists with nil value if error occurs.
75
+ # Some ruby implementations does not like creating variable on return
76
+ result = nil
57
77
  begin
58
78
  elevel = scope.ephemeral_level
59
79
  scope.ephemeral_from(Hash[evaluated], file, line)
60
80
  result = safeevaluate(scope)
61
81
  ensure
62
82
  scope.unset_ephemeral_var(elevel)
63
- result ||= nil
64
83
  end
65
84
  result
66
85
  end
@@ -131,7 +131,13 @@ class Puppet::Parser::AST
131
131
 
132
132
  def evaluate_container(scope)
133
133
  container = variable.respond_to?(:evaluate) ? variable.safeevaluate(scope) : variable
134
- (container.is_a?(Hash) or container.is_a?(Array)) ? container : scope[container, {:file => file, :line => line}]
134
+ if container.is_a?(Hash) || container.is_a?(Array)
135
+ container
136
+ elsif container.is_a?(::String)
137
+ scope[container, {:file => file, :line => line}]
138
+ else
139
+ raise Puppet::ParseError, "#{variable} is #{container.inspect}, not a hash or array"
140
+ end
135
141
  end
136
142
 
137
143
  def evaluate_key(scope)
@@ -148,9 +154,10 @@ class Puppet::Parser::AST
148
154
  def evaluate(scope)
149
155
  object = evaluate_container(scope)
150
156
  accesskey = evaluate_key(scope)
151
- raise Puppet::ParseError, "#{variable} is not an hash or array when accessing it with #{accesskey}" unless object.is_a?(Hash) or object.is_a?(Array)
157
+ raise Puppet::ParseError, "#{variable} is not a hash or array when accessing it with #{accesskey}" unless object.is_a?(Hash) or object.is_a?(Array)
152
158
 
153
- object[array_index_or_key(object, accesskey)] || :undef
159
+ result = object[array_index_or_key(object, accesskey)]
160
+ result.nil? ? :undef : result
154
161
  end
155
162
 
156
163
  # Assign value to this hashkey or array index
@@ -2,7 +2,7 @@ require 'puppet/parser/ast/branch'
2
2
 
3
3
  class Puppet::Parser::AST
4
4
  # This class is a no-op, it doesn't produce anything
5
- # when evaluated, hence it's name :-)
5
+ # when evaluated, hence its name :-)
6
6
  class Nop < AST::Leaf
7
7
  def evaluate(scope)
8
8
  # nothing to do
@@ -23,8 +23,6 @@ class Puppet::Parser::AST
23
23
  # Get our object reference.
24
24
  resource = @object.safeevaluate(scope)
25
25
 
26
- hash = {}
27
-
28
26
  # Evaluate all of the specified params.
29
27
  params = @parameters.collect { |param|
30
28
  param.safeevaluate(scope)
@@ -35,6 +35,22 @@ class Puppet::Parser::Compiler
35
35
 
36
36
  attr_reader :node, :facts, :collections, :catalog, :resources, :relationships, :topscope
37
37
 
38
+ # The injector that provides lookup services, or nil if accessed before the compiler has started compiling and
39
+ # bootstrapped. The injector is initialized and available before any manifests are evaluated.
40
+ #
41
+ # @return [Puppet::Pops::Binder::Injector, nil] The injector that provides lookup services for this compiler/environment
42
+ # @api public
43
+ #
44
+ attr_accessor :injector
45
+
46
+ # The injector that provides lookup services during the creation of the {#injector}.
47
+ # @return [Puppet::Pops::Binder::Injector, nil] The injector that provides lookup services during injector creation
48
+ # for this compiler/environment
49
+ #
50
+ # @api private
51
+ #
52
+ attr_accessor :boot_injector
53
+
38
54
  # Add a collection to the global list.
39
55
  def_delegator :@collections, :<<, :add_collection
40
56
  def_delegator :@relationships, :<<, :add_relationship
@@ -51,7 +67,6 @@ class Puppet::Parser::Compiler
51
67
  end
52
68
  end
53
69
 
54
- # Store a resource in our resource table.
55
70
  def add_resource(scope, resource)
56
71
  @resources << resource
57
72
 
@@ -94,6 +109,10 @@ class Puppet::Parser::Compiler
94
109
 
95
110
  Puppet::Util::Profiler.profile("Compile: Created settings scope") { create_settings_scope }
96
111
 
112
+ if is_binder_active?
113
+ Puppet::Util::Profiler.profile("Compile: Created injector") { create_injector }
114
+ end
115
+
97
116
  Puppet::Util::Profiler.profile("Compile: Evaluated main") { evaluate_main }
98
117
 
99
118
  Puppet::Util::Profiler.profile("Compile: Evaluated AST node") { evaluate_ast_node }
@@ -135,7 +154,7 @@ class Puppet::Parser::Compiler
135
154
  #
136
155
  # Sometimes we evaluate classes with a fully qualified name already, in which
137
156
  # case, we tell scope.find_hostclass we've pre-qualified the name so it
138
- # doesn't need to search it's namespaces again. This gets around a weird
157
+ # doesn't need to search its namespaces again. This gets around a weird
139
158
  # edge case of duplicate class names, one at top scope and one nested in our
140
159
  # namespace and the wrong one (or both!) getting selected. See ticket #13349
141
160
  # for more detail. --jeffweiss 26 apr 2012
@@ -197,6 +216,47 @@ class Puppet::Parser::Compiler
197
216
  @resource_overrides[resource.ref]
198
217
  end
199
218
 
219
+ def injector
220
+ create_injector if @injector.nil?
221
+ @injector
222
+ end
223
+
224
+ def boot_injector
225
+ create_boot_injector(nil) if @boot_injector.nil?
226
+ @boot_injector
227
+ end
228
+
229
+ # Creates the boot injector from registered system, default, and injector config.
230
+ # @return [Puppet::Pops::Binder::Injector] the created boot injector
231
+ # @api private Cannot be 'private' since it is called from the BindingsComposer.
232
+ #
233
+ def create_boot_injector(env_boot_bindings)
234
+ assert_binder_active()
235
+ boot_contribution = Puppet::Pops::Binder::SystemBindings.injector_boot_contribution(env_boot_bindings)
236
+ final_contribution = Puppet::Pops::Binder::SystemBindings.final_contribution
237
+ binder = Puppet::Pops::Binder::Binder.new()
238
+ binder.define_categories(boot_contribution.effective_categories)
239
+ binder.define_layers(Puppet::Pops::Binder::BindingsFactory.layered_bindings(final_contribution, boot_contribution))
240
+ @boot_injector = Puppet::Pops::Binder::Injector.new(binder)
241
+ end
242
+
243
+ # Answers if Puppet Binder should be active or not, and if it should and is not active, then it is activated.
244
+ # @return [Boolean] true if the Puppet Binder should be activated
245
+ def is_binder_active?
246
+ should_be_active = Puppet[:binder] || Puppet[:parser] == 'future'
247
+ if should_be_active
248
+ # TODO: this should be in a central place, not just for ParserFactory anymore...
249
+ Puppet::Parser::ParserFactory.assert_rgen_installed()
250
+ @@binder_loaded ||= false
251
+ unless @@binder_loaded
252
+ require 'puppet/pops'
253
+ require 'puppetx'
254
+ @@binder_loaded = true
255
+ end
256
+ end
257
+ should_be_active
258
+ end
259
+
200
260
  private
201
261
 
202
262
  # If ast nodes are enabled, then see if we can find and evaluate one.
@@ -303,16 +363,11 @@ class Puppet::Parser::Compiler
303
363
  # not find the resource they were supposed to override, so we
304
364
  # want to throw an exception.
305
365
  def fail_on_unevaluated_overrides
306
- remaining = []
307
- @resource_overrides.each do |name, overrides|
308
- remaining.concat overrides
309
- end
366
+ remaining = @resource_overrides.values.flatten.collect(&:ref)
310
367
 
311
- unless remaining.empty?
368
+ if !remaining.empty?
312
369
  fail Puppet::ParseError,
313
- "Could not find resource(s) %s for overriding" % remaining.collect { |o|
314
- o.ref
315
- }.join(", ")
370
+ "Could not find resource(s) #{remaining.join(', ')} for overriding"
316
371
  end
317
372
  end
318
373
 
@@ -320,22 +375,11 @@ class Puppet::Parser::Compiler
320
375
  # look for resources, because we want to consider those to be
321
376
  # parse errors.
322
377
  def fail_on_unevaluated_resource_collections
323
- remaining = []
324
- @collections.each do |coll|
325
- # We're only interested in the 'resource' collections,
326
- # which result from direct calls of 'realize'. Anything
327
- # else is allowed not to return resources.
328
- # Collect all of them, so we have a useful error.
329
- if r = coll.resources
330
- if r.is_a?(Array)
331
- remaining += r
332
- else
333
- remaining << r
334
- end
335
- end
336
- end
378
+ remaining = @collections.collect(&:resources).flatten.compact
337
379
 
338
- raise Puppet::ParseError, "Failed to realize virtual resources #{remaining.join(', ')}" unless remaining.empty?
380
+ if !remaining.empty?
381
+ raise Puppet::ParseError, "Failed to realize virtual resources #{remaining.join(', ')}"
382
+ end
339
383
  end
340
384
 
341
385
  # Make sure all of our resources and such have done any last work
@@ -366,10 +410,8 @@ class Puppet::Parser::Compiler
366
410
  raise "Couldn't find main"
367
411
  end
368
412
 
369
- names = []
370
- Puppet::Type.eachmetaparam do |name|
371
- next if Puppet::Parser::Resource.relationship_parameter?(name)
372
- names << name
413
+ names = Puppet::Type.metaparams.select do |name|
414
+ !Puppet::Parser::Resource.relationship_parameter?(name)
373
415
  end
374
416
 
375
417
  data = {}
@@ -405,9 +447,6 @@ class Puppet::Parser::Compiler
405
447
 
406
448
  # Set up all of our internal variables.
407
449
  def initvars
408
- # The list of objects that will available for export.
409
- @exported_resources = {}
410
-
411
450
  # The list of overrides. This is used to cache overrides on objects
412
451
  # that don't exist yet. We store an array of each override.
413
452
  @resource_overrides = Hash.new do |overs, ref|
@@ -430,8 +469,7 @@ class Puppet::Parser::Compiler
430
469
  # Create our initial scope and a resource that will evaluate main.
431
470
  @topscope = Puppet::Parser::Scope.new(self)
432
471
 
433
- @main_stage_resource = Puppet::Parser::Resource.new("stage", :main, :scope => @topscope)
434
- @catalog.add_resource(@main_stage_resource)
472
+ @catalog.add_resource(Puppet::Parser::Resource.new("stage", :main, :scope => @topscope))
435
473
 
436
474
  # local resource array to maintain resource ordering
437
475
  @resources = []
@@ -481,4 +519,24 @@ class Puppet::Parser::Compiler
481
519
  # The order of these is significant for speed due to short-circuting
482
520
  resources.reject { |resource| resource.evaluated? or resource.virtual? or resource.builtin_type? }
483
521
  end
522
+
523
+ # Creates the injector from bindings found in the current environment.
524
+ # @return [void]
525
+ # @api private
526
+ #
527
+ def create_injector
528
+ assert_binder_active()
529
+ composer = Puppet::Pops::Binder::BindingsComposer.new()
530
+ layered_bindings = composer.compose(topscope)
531
+ binder = Puppet::Pops::Binder::Binder.new()
532
+ binder.define_categories(composer.effective_categories(topscope))
533
+ binder.define_layers(layered_bindings)
534
+ @injector = Puppet::Pops::Binder::Injector.new(binder)
535
+ end
536
+
537
+ def assert_binder_active
538
+ unless is_binder_active?
539
+ raise ArgumentError, "The Puppet Binder is only available when either '--binder true' or '--parser future' is used"
540
+ end
541
+ end
484
542
  end