puppet 3.1.1 → 3.2.0.rc1

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 (477) hide show
  1. data/CONTRIBUTING.md +2 -2
  2. data/Gemfile +32 -19
  3. data/README_DEVELOPER.md +332 -14
  4. data/Rakefile +9 -5
  5. data/ext/build_defaults.yaml +2 -3
  6. data/ext/debian/changelog.erb +6 -0
  7. data/ext/debian/control +6 -6
  8. data/ext/envpuppet +4 -4
  9. data/ext/project_data.yaml +1 -0
  10. data/ext/puppet-nm-dispatcher +13 -0
  11. data/ext/redhat/puppet.spec.erb +17 -0
  12. data/ext/suse/client.init +1 -1
  13. data/ext/systemd/puppetagent.service +2 -2
  14. data/ext/systemd/puppetmaster.service +2 -2
  15. data/lib/hiera/scope.rb +29 -11
  16. data/lib/hiera_puppet.rb +1 -3
  17. data/lib/puppet/agent.rb +3 -3
  18. data/lib/puppet/application.rb +2 -2
  19. data/lib/puppet/application/agent.rb +27 -12
  20. data/lib/puppet/application/apply.rb +11 -1
  21. data/lib/puppet/application/describe.rb +1 -1
  22. data/lib/puppet/application/doc.rb +13 -9
  23. data/lib/puppet/application/filebucket.rb +0 -1
  24. data/lib/puppet/application/kick.rb +1 -0
  25. data/lib/puppet/application/master.rb +16 -8
  26. data/lib/puppet/daemon.rb +19 -64
  27. data/lib/puppet/defaults.rb +61 -5
  28. data/lib/puppet/error.rb +15 -4
  29. data/lib/puppet/external/nagios/grammar.ry +1 -1
  30. data/lib/puppet/external/nagios/makefile +1 -1
  31. data/lib/puppet/external/nagios/parser.rb +185 -618
  32. data/lib/puppet/external/pson/pure/parser.rb +47 -1
  33. data/lib/puppet/face/certificate.rb +3 -3
  34. data/lib/puppet/face/module.rb +1 -1
  35. data/lib/puppet/face/module/changes.rb +3 -1
  36. data/lib/puppet/face/module/uninstall.rb +1 -1
  37. data/lib/puppet/face/node/clean.rb +5 -5
  38. data/lib/puppet/feature/base.rb +3 -1
  39. data/lib/puppet/feature/libuser.rb +8 -0
  40. data/lib/puppet/file_serving/fileset.rb +9 -1
  41. data/lib/puppet/forge.rb +28 -5
  42. data/lib/puppet/forge/errors.rb +34 -0
  43. data/lib/puppet/forge/repository.rb +1 -1
  44. data/lib/puppet/indirector.rb +4 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +37 -30
  46. data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
  47. data/lib/puppet/indirector/indirection.rb +28 -15
  48. data/lib/puppet/indirector/rest.rb +18 -10
  49. data/lib/puppet/interface.rb +11 -4
  50. data/lib/puppet/interface/action.rb +1 -3
  51. data/lib/puppet/interface/action_builder.rb +0 -3
  52. data/lib/puppet/interface/action_manager.rb +0 -3
  53. data/lib/puppet/interface/face_collection.rb +0 -2
  54. data/lib/puppet/interface/option.rb +0 -2
  55. data/lib/puppet/interface/option_builder.rb +0 -2
  56. data/lib/puppet/interface/option_manager.rb +0 -2
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module_tool.rb +1 -0
  59. data/lib/puppet/module_tool/applications/application.rb +0 -3
  60. data/lib/puppet/module_tool/applications/builder.rb +8 -20
  61. data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
  62. data/lib/puppet/module_tool/applications/installer.rb +1 -0
  63. data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +18 -1
  66. data/lib/puppet/module_tool/modulefile.rb +2 -2
  67. data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
  68. data/lib/puppet/module_tool/tar.rb +17 -0
  69. data/lib/puppet/module_tool/tar/gnu.rb +9 -0
  70. data/lib/puppet/module_tool/tar/mini.rb +39 -0
  71. data/lib/puppet/module_tool/tar/solaris.rb +5 -0
  72. data/lib/puppet/network/http.rb +1 -0
  73. data/lib/puppet/network/http/connection.rb +9 -23
  74. data/lib/puppet/network/http/handler.rb +38 -7
  75. data/lib/puppet/network/http/rack/rest.rb +14 -3
  76. data/lib/puppet/network/http/webrick.rb +3 -1
  77. data/lib/puppet/network/http/webrick/rest.rb +11 -2
  78. data/lib/puppet/node/environment.rb +3 -1
  79. data/lib/puppet/parameter.rb +32 -29
  80. data/lib/puppet/parameter/package_options.rb +1 -1
  81. data/lib/puppet/parameter/path.rb +1 -1
  82. data/lib/puppet/parameter/value.rb +1 -1
  83. data/lib/puppet/parameter/value_collection.rb +7 -3
  84. data/lib/puppet/parser/ast.rb +3 -1
  85. data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
  86. data/lib/puppet/parser/ast/astarray.rb +1 -1
  87. data/lib/puppet/parser/ast/block_expression.rb +41 -0
  88. data/lib/puppet/parser/ast/function.rb +13 -2
  89. data/lib/puppet/parser/ast/lambda.rb +107 -0
  90. data/lib/puppet/parser/ast/leaf.rb +1 -2
  91. data/lib/puppet/parser/ast/method_call.rb +77 -0
  92. data/lib/puppet/parser/ast/vardef.rb +7 -0
  93. data/lib/puppet/parser/compiler.rb +27 -16
  94. data/lib/puppet/parser/e_parser_adapter.rb +120 -0
  95. data/lib/puppet/parser/files.rb +7 -6
  96. data/lib/puppet/parser/functions.rb +10 -8
  97. data/lib/puppet/parser/functions/collect.rb +43 -0
  98. data/lib/puppet/parser/functions/each.rb +96 -0
  99. data/lib/puppet/parser/functions/foreach.rb +96 -0
  100. data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
  101. data/lib/puppet/parser/functions/hiera.rb +20 -2
  102. data/lib/puppet/parser/functions/hiera_array.rb +21 -2
  103. data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
  104. data/lib/puppet/parser/functions/hiera_include.rb +33 -2
  105. data/lib/puppet/parser/functions/inline_template.rb +4 -4
  106. data/lib/puppet/parser/functions/reduce.rb +74 -0
  107. data/lib/puppet/parser/functions/reject.rb +46 -0
  108. data/lib/puppet/parser/functions/select.rb +46 -0
  109. data/lib/puppet/parser/functions/slice.rb +96 -0
  110. data/lib/puppet/parser/functions/template.rb +2 -2
  111. data/lib/puppet/parser/grammar.ra +7 -4
  112. data/lib/puppet/parser/lexer.rb +10 -0
  113. data/lib/puppet/parser/methods.rb +69 -0
  114. data/lib/puppet/parser/parser.rb +855 -808
  115. data/lib/puppet/parser/parser_factory.rb +62 -0
  116. data/lib/puppet/parser/parser_support.rb +8 -2
  117. data/lib/puppet/parser/scope.rb +153 -47
  118. data/lib/puppet/parser/templatewrapper.rb +28 -21
  119. data/lib/puppet/parser/type_loader.rb +3 -1
  120. data/lib/puppet/pops.rb +40 -0
  121. data/lib/puppet/pops/adaptable.rb +190 -0
  122. data/lib/puppet/pops/adapters.rb +65 -0
  123. data/lib/puppet/pops/containment.rb +37 -0
  124. data/lib/puppet/pops/issues.rb +258 -0
  125. data/lib/puppet/pops/label_provider.rb +71 -0
  126. data/lib/puppet/pops/model/ast_transformer.rb +636 -0
  127. data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
  128. data/lib/puppet/pops/model/factory.rb +804 -0
  129. data/lib/puppet/pops/model/model.rb +567 -0
  130. data/lib/puppet/pops/model/model_label_provider.rb +75 -0
  131. data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
  132. data/lib/puppet/pops/model/tree_dumper.rb +59 -0
  133. data/lib/puppet/pops/parser/egrammar.ra +723 -0
  134. data/lib/puppet/pops/parser/eparser.rb +2300 -0
  135. data/lib/puppet/pops/parser/grammar.ra +746 -0
  136. data/lib/puppet/pops/parser/lexer.rb +842 -0
  137. data/lib/puppet/pops/parser/makefile +13 -0
  138. data/lib/puppet/pops/parser/parser_support.rb +203 -0
  139. data/lib/puppet/pops/patterns.rb +35 -0
  140. data/lib/puppet/pops/utils.rb +104 -0
  141. data/lib/puppet/pops/validation.rb +297 -0
  142. data/lib/puppet/pops/validation/checker3_1.rb +551 -0
  143. data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
  144. data/lib/puppet/pops/visitable.rb +6 -0
  145. data/lib/puppet/pops/visitor.rb +50 -0
  146. data/lib/puppet/property.rb +37 -28
  147. data/lib/puppet/property/ensure.rb +2 -2
  148. data/lib/puppet/property/ordered_list.rb +1 -1
  149. data/lib/puppet/provider.rb +26 -30
  150. data/lib/puppet/provider/aixobject.rb +45 -44
  151. data/lib/puppet/provider/augeas/augeas.rb +0 -1
  152. data/lib/puppet/provider/confiner.rb +1 -1
  153. data/lib/puppet/provider/cron/crontab.rb +107 -67
  154. data/lib/puppet/provider/group/groupadd.rb +59 -3
  155. data/lib/puppet/provider/interface/cisco.rb +4 -4
  156. data/lib/puppet/provider/mount/parsed.rb +1 -1
  157. data/lib/puppet/provider/nameservice.rb +22 -6
  158. data/lib/puppet/provider/nameservice/pw.rb +1 -1
  159. data/lib/puppet/provider/package/aix.rb +28 -4
  160. data/lib/puppet/provider/package/gem.rb +0 -2
  161. data/lib/puppet/provider/package/macports.rb +1 -1
  162. data/lib/puppet/provider/package/nim.rb +249 -4
  163. data/lib/puppet/provider/package/opkg.rb +77 -0
  164. data/lib/puppet/provider/package/pacman.rb +2 -2
  165. data/lib/puppet/provider/package/rpm.rb +30 -16
  166. data/lib/puppet/provider/package/yum.rb +3 -3
  167. data/lib/puppet/provider/parsedfile.rb +80 -3
  168. data/lib/puppet/provider/selmodule/semodule.rb +2 -2
  169. data/lib/puppet/provider/service/debian.rb +0 -4
  170. data/lib/puppet/provider/service/freebsd.rb +2 -2
  171. data/lib/puppet/provider/service/gentoo.rb +0 -9
  172. data/lib/puppet/provider/service/init.rb +27 -2
  173. data/lib/puppet/provider/service/launchd.rb +1 -1
  174. data/lib/puppet/provider/service/openwrt.rb +36 -0
  175. data/lib/puppet/provider/service/redhat.rb +0 -9
  176. data/lib/puppet/provider/service/src.rb +38 -4
  177. data/lib/puppet/provider/service/systemd.rb +2 -2
  178. data/lib/puppet/provider/service/upstart.rb +1 -8
  179. data/lib/puppet/provider/user/aix.rb +4 -10
  180. data/lib/puppet/provider/user/pw.rb +6 -10
  181. data/lib/puppet/provider/user/useradd.rb +129 -31
  182. data/lib/puppet/provider/vlan/cisco.rb +4 -4
  183. data/lib/puppet/reference/function.rb +2 -2
  184. data/lib/puppet/reference/indirection.rb +46 -5
  185. data/lib/puppet/reference/metaparameter.rb +2 -2
  186. data/lib/puppet/reports.rb +5 -5
  187. data/lib/puppet/reports/rrdgraph.rb +4 -4
  188. data/lib/puppet/reports/tagmail.rb +1 -1
  189. data/lib/puppet/resource.rb +1 -1
  190. data/lib/puppet/resource/type.rb +13 -11
  191. data/lib/puppet/scheduler.rb +16 -0
  192. data/lib/puppet/scheduler/job.rb +53 -0
  193. data/lib/puppet/scheduler/scheduler.rb +45 -0
  194. data/lib/puppet/scheduler/splay_job.rb +32 -0
  195. data/lib/puppet/scheduler/timer.rb +13 -0
  196. data/lib/puppet/settings/base_setting.rb +1 -1
  197. data/lib/puppet/simple_graph.rb +4 -4
  198. data/lib/puppet/ssl/base.rb +12 -2
  199. data/lib/puppet/ssl/certificate.rb +4 -1
  200. data/lib/puppet/ssl/certificate_request.rb +4 -1
  201. data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
  202. data/lib/puppet/ssl/configuration.rb +32 -0
  203. data/lib/puppet/ssl/host.rb +18 -21
  204. data/lib/puppet/ssl/key.rb +4 -1
  205. data/lib/puppet/ssl/validator.rb +116 -0
  206. data/lib/puppet/transaction.rb +1 -1
  207. data/lib/puppet/transaction/event.rb +3 -10
  208. data/lib/puppet/transaction/event_manager.rb +8 -1
  209. data/lib/puppet/transaction/report.rb +17 -16
  210. data/lib/puppet/type.rb +77 -69
  211. data/lib/puppet/type/cron.rb +20 -8
  212. data/lib/puppet/type/exec.rb +9 -3
  213. data/lib/puppet/type/file.rb +95 -21
  214. data/lib/puppet/type/file/content.rb +1 -1
  215. data/lib/puppet/type/file/mode.rb +7 -1
  216. data/lib/puppet/type/file/source.rb +2 -2
  217. data/lib/puppet/type/group.rb +11 -0
  218. data/lib/puppet/type/scheduled_task.rb +5 -1
  219. data/lib/puppet/type/service.rb +1 -1
  220. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  221. data/lib/puppet/type/user.rb +24 -6
  222. data/lib/puppet/util.rb +12 -2
  223. data/lib/puppet/util/classgen.rb +4 -4
  224. data/lib/puppet/util/colors.rb +55 -0
  225. data/lib/puppet/util/command_line/trollop.rb +4 -4
  226. data/lib/puppet/util/errors.rb +39 -3
  227. data/lib/puppet/util/fileparsing.rb +5 -0
  228. data/lib/puppet/util/filetype.rb +11 -9
  229. data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
  230. data/lib/puppet/util/libuser.conf +15 -0
  231. data/lib/puppet/util/libuser.rb +12 -0
  232. data/lib/puppet/util/monkey_patches.rb +48 -0
  233. data/lib/puppet/util/network_device.rb +1 -1
  234. data/lib/puppet/util/network_device/base.rb +2 -2
  235. data/lib/puppet/util/network_device/cisco/device.rb +29 -19
  236. data/lib/puppet/util/network_device/config.rb +5 -2
  237. data/lib/puppet/util/network_device/ipcalc.rb +1 -1
  238. data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
  239. data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
  240. data/lib/puppet/util/plugins.rb +4 -4
  241. data/lib/puppet/util/posix.rb +1 -1
  242. data/lib/puppet/util/profiler.rb +28 -0
  243. data/lib/puppet/util/profiler/logging.rb +47 -0
  244. data/lib/puppet/util/profiler/none.rb +8 -0
  245. data/lib/puppet/util/profiler/object_counts.rb +17 -0
  246. data/lib/puppet/util/profiler/wall_clock.rb +34 -0
  247. data/lib/puppet/util/provider_features.rb +1 -1
  248. data/lib/puppet/util/rdoc/parser.rb +5 -5
  249. data/lib/puppet/util/ssl.rb +38 -0
  250. data/lib/puppet/util/subclass_loader.rb +1 -5
  251. data/lib/puppet/util/windows.rb +1 -0
  252. data/lib/puppet/util/windows/process.rb +3 -0
  253. data/lib/puppet/util/windows/root_certs.rb +86 -0
  254. data/lib/puppet/util/windows/security.rb +1 -0
  255. data/lib/puppet/version.rb +1 -1
  256. data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
  257. data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
  258. data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
  259. data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
  260. data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
  261. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
  262. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
  263. data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
  264. data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
  265. data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
  266. data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
  267. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
  268. data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
  269. data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
  270. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
  271. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
  272. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
  273. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
  274. data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
  275. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
  276. data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
  277. data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
  278. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
  279. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
  280. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
  281. data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
  282. data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
  283. data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
  284. data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
  285. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
  286. data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
  287. data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
  288. data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
  289. data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
  290. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
  291. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
  292. data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
  293. data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
  294. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
  295. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
  296. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
  297. data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
  298. data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
  299. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
  300. data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
  301. data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
  302. data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
  303. data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
  304. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
  305. data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
  306. data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
  307. data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
  308. data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
  309. data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
  310. data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
  311. data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
  312. data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
  313. data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
  314. data/spec/integration/parser/collector_spec.rb +1 -1
  315. data/spec/integration/parser/compiler_spec.rb +252 -227
  316. data/spec/integration/parser/parser_spec.rb +171 -53
  317. data/spec/integration/parser/scope_spec.rb +1 -1
  318. data/spec/integration/provider/cron/crontab_spec.rb +187 -0
  319. data/spec/integration/provider/service/systemd_spec.rb +20 -0
  320. data/spec/integration/type/file_spec.rb +21 -21
  321. data/spec/integration/type/package_spec.rb +1 -1
  322. data/spec/lib/puppet_spec/database.rb +2 -5
  323. data/spec/spec_helper.rb +6 -1
  324. data/spec/unit/application/apply_spec.rb +16 -1
  325. data/spec/unit/application/describe_spec.rb +1 -1
  326. data/spec/unit/application/doc_spec.rb +55 -32
  327. data/spec/unit/application/kick_spec.rb +8 -6
  328. data/spec/unit/application/master_spec.rb +4 -4
  329. data/spec/unit/daemon_spec.rb +1 -1
  330. data/spec/unit/forge/errors_spec.rb +40 -0
  331. data/spec/unit/forge/repository_spec.rb +11 -1
  332. data/spec/unit/forge_spec.rb +13 -3
  333. data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
  334. data/spec/unit/hiera/scope_spec.rb +48 -25
  335. data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
  336. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
  337. data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
  338. data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
  339. data/spec/unit/indirector/indirection_spec.rb +5 -0
  340. data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
  341. data/spec/unit/indirector_spec.rb +7 -1
  342. data/spec/unit/interface/action_builder_spec.rb +1 -1
  343. data/spec/unit/interface/action_manager_spec.rb +0 -2
  344. data/spec/unit/interface/action_spec.rb +1 -1
  345. data/spec/unit/interface/documentation_spec.rb +0 -2
  346. data/spec/unit/interface/face_collection_spec.rb +1 -1
  347. data/spec/unit/interface/option_builder_spec.rb +1 -1
  348. data/spec/unit/interface/option_spec.rb +0 -1
  349. data/spec/unit/module_spec.rb +17 -19
  350. data/spec/unit/module_tool/application_spec.rb +1 -3
  351. data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
  352. data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
  353. data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
  354. data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
  355. data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
  356. data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
  357. data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
  358. data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
  359. data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
  360. data/spec/unit/network/http/connection_spec.rb +17 -2
  361. data/spec/unit/network/http/handler_spec.rb +195 -167
  362. data/spec/unit/network/http/rack/rest_spec.rb +26 -4
  363. data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
  364. data/spec/unit/network/http/webrick_spec.rb +12 -3
  365. data/spec/unit/node/environment_spec.rb +421 -404
  366. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
  367. data/spec/unit/parser/collector_spec.rb +4 -4
  368. data/spec/unit/parser/compiler_spec.rb +13 -13
  369. data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
  370. data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
  371. data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
  372. data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
  373. data/spec/unit/parser/functions/hiera_spec.rb +0 -2
  374. data/spec/unit/parser/functions_spec.rb +27 -15
  375. data/spec/unit/parser/methods/collect_spec.rb +110 -0
  376. data/spec/unit/parser/methods/each_spec.rb +91 -0
  377. data/spec/unit/parser/methods/foreach_spec.rb +91 -0
  378. data/spec/unit/parser/methods/reduce_spec.rb +67 -0
  379. data/spec/unit/parser/methods/reject_spec.rb +73 -0
  380. data/spec/unit/parser/methods/select_spec.rb +79 -0
  381. data/spec/unit/parser/methods/shared.rb +61 -0
  382. data/spec/unit/parser/methods/slice_spec.rb +97 -0
  383. data/spec/unit/parser/parser_spec.rb +2 -2
  384. data/spec/unit/parser/scope_spec.rb +39 -16
  385. data/spec/unit/parser/templatewrapper_spec.rb +6 -5
  386. data/spec/unit/parser/type_loader_spec.rb +191 -165
  387. data/spec/unit/pops/adaptable_spec.rb +143 -0
  388. data/spec/unit/pops/containment_spec.rb +25 -0
  389. data/spec/unit/pops/factory_rspec_helper.rb +77 -0
  390. data/spec/unit/pops/factory_spec.rb +329 -0
  391. data/spec/unit/pops/issues_spec.rb +26 -0
  392. data/spec/unit/pops/label_provider_spec.rb +42 -0
  393. data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
  394. data/spec/unit/pops/model/model_spec.rb +37 -0
  395. data/spec/unit/pops/parser/lexer_spec.rb +884 -0
  396. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
  397. data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
  398. data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
  399. data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
  400. data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
  401. data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
  402. data/spec/unit/pops/parser/parser_spec.rb +15 -0
  403. data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
  404. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
  405. data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
  406. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
  407. data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
  408. data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
  409. data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
  410. data/spec/unit/pops/visitor_spec.rb +94 -0
  411. data/spec/unit/property_spec.rb +11 -0
  412. data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
  413. data/spec/unit/provider/cron/crontab_spec.rb +97 -7
  414. data/spec/unit/provider/cron/parsed_spec.rb +325 -0
  415. data/spec/unit/provider/exec/posix_spec.rb +1 -1
  416. data/spec/unit/provider/group/groupadd_spec.rb +33 -3
  417. data/spec/unit/provider/group/pw_spec.rb +5 -5
  418. data/spec/unit/provider/nameservice_spec.rb +304 -0
  419. data/spec/unit/provider/package/aix_spec.rb +53 -11
  420. data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
  421. data/spec/unit/provider/package/gem_spec.rb +6 -11
  422. data/spec/unit/provider/package/nim_spec.rb +216 -7
  423. data/spec/unit/provider/package/opkg_spec.rb +180 -0
  424. data/spec/unit/provider/package/rpm_spec.rb +149 -3
  425. data/spec/unit/provider/package/yum_spec.rb +6 -5
  426. data/spec/unit/provider/parsedfile_spec.rb +122 -28
  427. data/spec/unit/provider/service/freebsd_spec.rb +18 -0
  428. data/spec/unit/provider/service/init_spec.rb +108 -87
  429. data/spec/unit/provider/service/launchd_spec.rb +2 -2
  430. data/spec/unit/provider/service/openwrt_spec.rb +109 -0
  431. data/spec/unit/provider/service/src_spec.rb +117 -41
  432. data/spec/unit/provider/service/systemd_spec.rb +125 -17
  433. data/spec/unit/provider/service/upstart_spec.rb +1 -1
  434. data/spec/unit/provider/user/aix_spec.rb +42 -0
  435. data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
  436. data/spec/unit/provider/user/pw_spec.rb +24 -12
  437. data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
  438. data/spec/unit/provider/user/useradd_spec.rb +179 -15
  439. data/spec/unit/resource/type_spec.rb +3 -3
  440. data/spec/unit/scheduler/job_spec.rb +79 -0
  441. data/spec/unit/scheduler/scheduler_spec.rb +129 -0
  442. data/spec/unit/scheduler/splay_job_spec.rb +35 -0
  443. data/spec/unit/ssl/base_spec.rb +3 -9
  444. data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
  445. data/spec/unit/ssl/certificate_request_spec.rb +3 -1
  446. data/spec/unit/ssl/certificate_spec.rb +3 -1
  447. data/spec/unit/ssl/configuration_spec.rb +74 -0
  448. data/spec/unit/ssl/host_spec.rb +28 -7
  449. data/spec/unit/ssl/validator_spec.rb +311 -0
  450. data/spec/unit/transaction/event_manager_spec.rb +49 -0
  451. data/spec/unit/transaction/event_spec.rb +20 -5
  452. data/spec/unit/transaction/report_spec.rb +8 -0
  453. data/spec/unit/type/cron_spec.rb +9 -0
  454. data/spec/unit/type/exec_spec.rb +11 -0
  455. data/spec/unit/type/file/content_spec.rb +20 -20
  456. data/spec/unit/type/file/mode_spec.rb +6 -0
  457. data/spec/unit/type/file/source_spec.rb +9 -7
  458. data/spec/unit/type/file_spec.rb +22 -3
  459. data/spec/unit/type/service_spec.rb +34 -21
  460. data/spec/unit/type_spec.rb +46 -1
  461. data/spec/unit/util/backups_spec.rb +2 -2
  462. data/spec/unit/util/execution_spec.rb +4 -1
  463. data/spec/unit/util/filetype_spec.rb +6 -0
  464. data/spec/unit/util/monkey_patches_spec.rb +18 -0
  465. data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
  466. data/spec/unit/util/network_device/config_spec.rb +14 -0
  467. data/spec/unit/util/network_device_spec.rb +3 -3
  468. data/spec/unit/util/profiler/logging_spec.rb +81 -0
  469. data/spec/unit/util/profiler/none_spec.rb +12 -0
  470. data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
  471. data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
  472. data/spec/unit/util/pson_spec.rb +5 -0
  473. data/spec/unit/util/ssl_spec.rb +51 -0
  474. data/spec/unit/util/windows/root_certs_spec.rb +15 -0
  475. data/spec/unit/util_spec.rb +28 -0
  476. metadata +2593 -2307
  477. data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -0,0 +1,551 @@
1
+ # A Validator validates a model.
2
+ #
3
+ # Validation is performed on each model element in isolation. Each method should validate the model element's state
4
+ # but not validate its referenced/contained elements except to check their validity in their respective role.
5
+ # The intent is to drive the validation with a tree iterator that visits all elements in a model.
6
+ #
7
+ #
8
+ # TODO: Add validation of multiplicities - this is a general validation that can be checked for all
9
+ # Model objects via their metamodel. (I.e an extra call to multiplicity check in polymorph check).
10
+ # This is however mostly valuable when validating model to model transformations, and is therefore T.B.D
11
+ #
12
+ class Puppet::Pops::Validation::Checker3_1
13
+ Issues = Puppet::Pops::Issues
14
+ Model = Puppet::Pops::Model
15
+
16
+ attr_reader :acceptor
17
+ # Initializes the validator with a diagnostics producer. This object must respond to
18
+ # `:will_accept?` and `:accept`.
19
+ #
20
+ def initialize(diagnostics_producer)
21
+ @@check_visitor ||= Puppet::Pops::Visitor.new(nil, "check", 0, 0)
22
+ @@rvalue_visitor ||= Puppet::Pops::Visitor.new(nil, "rvalue", 0, 0)
23
+ @@hostname_visitor ||= Puppet::Pops::Visitor.new(nil, "hostname", 1, 1)
24
+ @@assignment_visitor ||= Puppet::Pops::Visitor.new(nil, "assign", 0, 1)
25
+ @@query_visitor ||= Puppet::Pops::Visitor.new(nil, "query", 0, 0)
26
+ @@top_visitor ||= Puppet::Pops::Visitor.new(nil, "top", 1, 1)
27
+ @@relation_visitor ||= Puppet::Pops::Visitor.new(nil, "relation", 1, 1)
28
+
29
+ @acceptor = diagnostics_producer
30
+ end
31
+
32
+ # Validates the entire model by visiting each model element and calling `check`.
33
+ # The result is collected (or acted on immediately) by the configured diagnostic provider/acceptor
34
+ # given when creating this Checker.
35
+ #
36
+ def validate(model)
37
+ # tree iterate the model, and call check for each element
38
+ check(model)
39
+ model.eAllContents.each {|m| check(m) }
40
+ end
41
+
42
+ # Performs regular validity check
43
+ def check(o)
44
+ @@check_visitor.visit_this(self, o)
45
+ end
46
+
47
+ # Performs check if this is a vaid hostname expression
48
+ def hostname(o, semantic)
49
+ @@hostname_visitor.visit_this(self, o, semantic)
50
+ end
51
+
52
+ # Performs check if this is valid as a query
53
+ def query(o)
54
+ @@query_visitor.visit_this(self, o)
55
+ end
56
+
57
+ # Performs check if this is valid as a relationship side
58
+ def relation(o, container)
59
+ @@relation_visitor.visit_this(self, o, container)
60
+ end
61
+
62
+ # Performs check if this is valid as a rvalue
63
+ def rvalue(o)
64
+ @@rvalue_visitor.visit_this(self, o)
65
+ end
66
+
67
+ # Performs check if this is valid as a container of a definition (class, define, node)
68
+ def top(o, definition)
69
+ @@top_visitor.visit_this(self, o, definition)
70
+ end
71
+
72
+ # Checks the LHS of an assignment (is it assignable?).
73
+ # If args[0] is true, assignment via index is checked.
74
+ #
75
+ def assign(o, *args)
76
+ @@assignment_visitor.visit_this(self, o, *args)
77
+ end
78
+
79
+ #---ASSIGNMENT CHECKS
80
+
81
+ def assign_VariableExpression(o, *args)
82
+ varname_string = varname_to_s(o.expr)
83
+ if varname_string =~ /^[0-9]+$/
84
+ acceptor.accept(Issues::ILLEGAL_NUMERIC_ASSIGNMENT, o, :varname => varname_string)
85
+ end
86
+ # Can not assign to something in another namespace (i.e. a '::' in the name is not legal)
87
+ if acceptor.will_accept? Issues::CROSS_SCOPE_ASSIGNMENT
88
+ if varname_string =~ /::/
89
+ acceptor.accept(Issues::CROSS_SCOPE_ASSIGNMENT, o, :name => varname_string)
90
+ end
91
+ end
92
+ # TODO: Could scan for reassignment of the same variable if done earlier in the same container
93
+ # Or if assigning to a parameter (more work).
94
+ # TODO: Investigate if there are invalid cases for += assignment
95
+ end
96
+
97
+ def assign_AccessExpression(o, *args)
98
+ # Are indexed assignments allowed at all ? $x[x] = '...'
99
+ if acceptor.will_accept? Issues::ILLEGAL_INDEXED_ASSIGNMENT
100
+ acceptor.accept(Issues::ILLEGAL_INDEXED_ASSIGNMENT, o)
101
+ else
102
+ # Then the left expression must be assignable-via-index
103
+ assign(o.left_expr, true)
104
+ end
105
+ end
106
+
107
+ def assign_Object(o, *args)
108
+ # Can not assign to anything else (differentiate if this is via index or not)
109
+ # i.e. 10 = 'hello' vs. 10['x'] = 'hello' (the root is reported as being in error in both cases)
110
+ #
111
+ acceptor.accept(args[0] ? Issues::ILLEGAL_ASSIGNMENT_VIA_INDEX : Issues::ILLEGAL_ASSIGNMENT, o)
112
+ end
113
+
114
+ #---CHECKS
115
+
116
+ def check_Object(o)
117
+ end
118
+
119
+ def check_Factory(o)
120
+ check(o.current)
121
+ end
122
+
123
+ def check_AccessExpression(o)
124
+ # Check multiplicity of keys
125
+ case o.left_expr
126
+ when Model::QualifiedName
127
+ # allows many keys, but the name should really be a QualifiedReference
128
+ acceptor.accept(Issues::DEPRECATED_NAME_AS_TYPE, o, :name => o.value)
129
+ when Model::QualifiedReference
130
+ # ok, allows many - this is a resource reference
131
+
132
+ else
133
+ # i.e. for any other expression that may produce an array or hash
134
+ if o.keys.size > 1
135
+ acceptor.accept(Issues::UNSUPPORTED_RANGE, o, :count => o.keys.size)
136
+ end
137
+ if o.keys.size < 1
138
+ acceptor.accept(Issues::MISSING_INDEX, o)
139
+ end
140
+ end
141
+ end
142
+
143
+ def check_AssignmentExpression(o)
144
+ assign(o.left_expr)
145
+ rvalue(o.right_expr)
146
+ end
147
+
148
+ # Checks that operation with :+> is contained in a ResourceOverride or Collector.
149
+ #
150
+ # Parent of an AttributeOperation can be one of:
151
+ # * CollectExpression
152
+ # * ResourceOverride
153
+ # * ResourceBody (ILLEGAL this is a regular resource expression)
154
+ # * ResourceDefaults (ILLEGAL)
155
+ #
156
+ def check_AttributeOperation(o)
157
+ if o.operator == :'+>'
158
+ # Append operator use is constrained
159
+ parent = o.eContainer
160
+ unless parent.is_a?(Model::CollectExpression) || parent.is_a?(Model::ResourceOverrideExpression)
161
+ acceptor.accept(Issues::ILLEGAL_ATTRIBUTE_APPEND, o, {:name=>o.attribute_name, :parent=>parent})
162
+ end
163
+ end
164
+ rvalue(o.value_expr)
165
+ end
166
+
167
+ def check_BinaryExpression(o)
168
+ rvalue(o.left_expr)
169
+ rvalue(o.right_expr)
170
+ end
171
+
172
+ def check_CallNamedFunctionExpression(o)
173
+ unless o.functor_expr.is_a? Model::QualifiedName
174
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.functor_expr, :feature => 'function name', :container => o)
175
+ end
176
+ end
177
+
178
+ def check_MethodCallExpression(o)
179
+ unless o.functor_expr.is_a? Model::QualifiedName
180
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.functor_expr, :feature => 'function name', :container => o)
181
+ end
182
+ end
183
+
184
+ def check_CaseExpression(o)
185
+ # There should only be one LiteralDefault case option value
186
+ # TODO: Implement this check
187
+ end
188
+
189
+ def check_CollectExpression(o)
190
+ unless o.type_expr.is_a? Model::QualifiedReference
191
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.type_expr, :feature=> 'type name', :container => o)
192
+ end
193
+
194
+ # If a collect expression tries to collect exported resources and storeconfigs is not on
195
+ # then it will not work... This was checked in the parser previously. This is a runtime checking
196
+ # thing as opposed to a language thing.
197
+ if acceptor.will_accept?(Issues::RT_NO_STORECONFIGS) && o.query.is_a?(Model::ExportedQuery)
198
+ acceptor.accept(Issues::RT_NO_STORECONFIGS, o)
199
+ end
200
+ end
201
+
202
+ # Only used for function names, grammar should not be able to produce something faulty, but
203
+ # check anyway if model is created programatically (it will fail in transformation to AST for sure).
204
+ def check_NamedAccessExpression(o)
205
+ name = o.right_expr
206
+ unless name.is_a? Model::QualifiedName
207
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, name, :feature=> 'function name', :container => o.eContainer)
208
+ end
209
+ end
210
+
211
+ # for 'class' and 'define'
212
+ def check_NamedDefinition(o)
213
+ top(o.eContainer, o)
214
+ if (acceptor.will_accept? Issues::NAME_WITH_HYPHEN) && o.name.include?('-')
215
+ acceptor.accept(Issues::NAME_WITH_HYPHEN, o, {:name => o.name})
216
+ end
217
+ end
218
+
219
+ def check_ImportExpression(o)
220
+ o.files.each do |f|
221
+ unless f.is_a? Model::LiteralString
222
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, f, :feature => 'file name', :container => o)
223
+ end
224
+ end
225
+ end
226
+
227
+ def check_InstanceReference(o)
228
+ # TODO: Original warning is :
229
+ # Puppet.warning addcontext("Deprecation notice: Resource references should now be capitalized")
230
+ # This model element is not used in the egrammar.
231
+ # Either implement checks or deprecate the use of InstanceReference (the same is acheived by
232
+ # transformation of AccessExpression when used where an Instance/Resource reference is allowed.
233
+ #
234
+ end
235
+
236
+ # Restrictions on hash key are because of the strange key comparisons/and merge rules in the AST evaluation
237
+ # (Even the allowed ones are handled in a strange way).
238
+ #
239
+ def transform_KeyedEntry(o)
240
+ case o.key
241
+ when Model::QualifiedName
242
+ when Model::LiteralString
243
+ when Model::LiteralNumber
244
+ when Model::ConcatenatedString
245
+ else
246
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.key, :feature => 'hash key', :container => o.eContainer)
247
+ end
248
+ end
249
+
250
+ # A Lambda is a Definition, but it may appear in other scopes that top scope (Which check_Definition asserts).
251
+ #
252
+ def check_LambdaExpression(o)
253
+ end
254
+
255
+ def check_NodeDefinition(o)
256
+ # Check that hostnames are valid hostnames (or regular expressons)
257
+ hostname(o.host_matches, o)
258
+ top(o.eContainer, o)
259
+ end
260
+
261
+ # Asserts that value is a valid QualifiedName. No additional checking is made, objects that use
262
+ # a QualifiedName as a name should check the validity - this since a QualifiedName is used as a BARE WORD
263
+ # and then additional chars may be valid (like a hyphen).
264
+ #
265
+ def check_QualifiedName(o)
266
+ # Is this a valid qualified name?
267
+ if o.value !~ Puppet::Pops::Patterns::NAME
268
+ acceptor.accept(Issues::ILLEGAL_NAME, o, {:name=>o.value})
269
+ end
270
+ end
271
+
272
+ # Checks that the value is a valid UpperCaseWord (a CLASSREF), and optionally if it contains a hypen.
273
+ # DOH: QualifiedReferences are created with LOWER CASE NAMES at parse time
274
+ def check_QualifiedReference(o)
275
+ # Is this a valid qualified name?
276
+ if o.value !~ Puppet::Pops::Patterns::CLASSREF
277
+ acceptor.accept(Issues::ILLEGAL_CLASSREF, o, {:name=>o.value})
278
+ elsif (acceptor.will_accept? Issues::NAME_WITH_HYPHEN) && o.value.include?('-')
279
+ acceptor.accept(Issues::NAME_WITH_HYPHEN, o, {:name => o.value})
280
+ end
281
+ end
282
+
283
+ def check_QueryExpression(o)
284
+ rvalue(o.expr) if o.expr # is optional
285
+ end
286
+
287
+ def relation_Object(o, rel_expr)
288
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o, {:feature => o.eContainingFeature, :container => rel_expr})
289
+ end
290
+
291
+ def relation_AccessExpression(o, rel_expr); end
292
+
293
+ def relation_CollectExpression(o, rel_expr); end
294
+
295
+ def relation_VariableExpression(o, rel_expr); end
296
+
297
+ def relation_LiteralString(o, rel_expr); end
298
+
299
+ def relation_ConcatenatedStringExpression(o, rel_expr); end
300
+
301
+ def relation_SelectorExpression(o, rel_expr); end
302
+
303
+ def relation_CaseExpression(o, rel_expr); end
304
+
305
+ def relation_ResourceExpression(o, rel_expr); end
306
+
307
+ def relation_RelationshipExpression(o, rel_expr); end
308
+
309
+ def check_Parameter(o)
310
+ if o.name =~ /^[0-9]+$/
311
+ acceptor.accept(Issues::ILLEGAL_NUMERIC_PARAMETER, o, :name => o.name)
312
+ end
313
+ end
314
+
315
+ #relationship_side: resource
316
+ # | resourceref
317
+ # | collection
318
+ # | variable
319
+ # | quotedtext
320
+ # | selector
321
+ # | casestatement
322
+ # | hasharrayaccesses
323
+
324
+ def check_RelationshipExpression(o)
325
+ relation(o.left_expr, o)
326
+ relation(o.right_expr, o)
327
+ end
328
+
329
+ def check_ResourceExpression(o)
330
+ # A resource expression must have a lower case NAME as its type e.g. 'file { ... }'
331
+ unless o.type_name.is_a? Model::QualifiedName
332
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.type_name, :feature => 'resource type', :container => o)
333
+ end
334
+
335
+ # This is a runtime check - the model is valid, but will have runtime issues when evaluated
336
+ # and storeconfigs is not set.
337
+ if acceptor.will_accept?(Issues::RT_NO_STORECONFIGS) && o.exported
338
+ acceptor.accept(Issues::RT_NO_STORECONFIGS_EXPORT, o)
339
+ end
340
+ end
341
+
342
+ def check_ResourceDefaultsExpression(o)
343
+ if o.form && o.form != :regular
344
+ acceptor.accept(Issues::NOT_VIRTUALIZEABLE, o)
345
+ end
346
+ end
347
+
348
+ # Transformation of SelectorExpression is limited to certain types of expressions.
349
+ # This is probably due to constraints in the old grammar rather than any real concerns.
350
+ def select_SelectorExpression(o)
351
+ case o.left_expr
352
+ when Model::CallNamedFunctionExpression
353
+ when Model::AccessExpression
354
+ when Model::VariableExpression
355
+ when Model::ConcatenatedString
356
+ else
357
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o.left_expr, :feature => 'left operand', :container => o)
358
+ end
359
+ end
360
+
361
+ def check_UnaryExpression(o)
362
+ rvalue(o.expr)
363
+ end
364
+
365
+ def check_UnlessExpression(o)
366
+ # TODO: Unless may not have an elsif
367
+ # TODO: 3.x unless may not have an else
368
+ end
369
+
370
+ def check_VariableExpression(o)
371
+ # The expression must be a qualified name
372
+ if !o.expr.is_a? Model::QualifiedName
373
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o, :feature => 'name', :container => o)
374
+ else
375
+ # Note, that if it later becomes illegal with hyphen in any name, this special check
376
+ # can be skipped in favor of the check in QualifiedName, which is now not done if contained in
377
+ # a VariableExpression
378
+ name = o.expr.value
379
+ if (acceptor.will_accept? Issues::VAR_WITH_HYPHEN) && name.include?('-')
380
+ acceptor.accept(Issues::VAR_WITH_HYPHEN, o, {:name => name})
381
+ end
382
+ end
383
+ end
384
+
385
+ #--- HOSTNAME CHECKS
386
+
387
+ # Transforms Array of host matching expressions into a (Ruby) array of AST::HostName
388
+ def hostname_Array(o, semantic)
389
+ o.each {|x| hostname x, semantic }
390
+ end
391
+
392
+ def hostname_String(o, semantic)
393
+ # The 3.x checker only checks for illegal characters - if matching /[^-\w.]/ the name is invalid,
394
+ # but this allows pathological names like "a..b......c", "----"
395
+ # TODO: Investigate if more illegal hostnames should be flagged.
396
+ #
397
+ if o =~ Puppet::Pops::Patterns::ILLEGAL_HOSTNAME_CHARS
398
+ acceptor.accept(Issues::ILLEGAL_HOSTNAME_CHARS, semantic, :hostname => o)
399
+ end
400
+ end
401
+
402
+ def hostname_LiteralValue(o, semantic)
403
+ hostname_String(o.value.to_s, o)
404
+ end
405
+
406
+ def hostname_ConcatenatedString(o, semantic)
407
+ # Puppet 3.1. only accepts a concatenated string without interpolated expressions
408
+ if the_expr = o.segments.index {|s| s.is_a?(Model::TextExpression) }
409
+ acceptor.accept(Issues::ILLEGAL_HOSTNAME_INTERPOLATION, o.segments[the_expr].expr)
410
+ elsif o.segments.size() != 1
411
+ # corner case, bad model, concatenation of several plain strings
412
+ acceptor.accept(Issues::ILLEGAL_HOSTNAME_INTERPOLATION, o)
413
+ else
414
+ # corner case, may be ok, but lexer may have replaced with plain string, this is
415
+ # here if it does not
416
+ hostname_String(o.segments[0], o.segments[0])
417
+ end
418
+ end
419
+
420
+ def hostname_QualifiedName(o, semantic)
421
+ hostname_String(o.value.to_s, o)
422
+ end
423
+
424
+ def hostname_QualifiedReference(o, semantic)
425
+ hostname_String(o.value.to_s, o)
426
+ end
427
+
428
+ def hostname_LiteralNumber(o, semantic)
429
+ # always ok
430
+ end
431
+
432
+ def hostname_LiteralDefault(o, semantic)
433
+ # always ok
434
+ end
435
+
436
+ def hostname_LiteralRegularExpression(o, semantic)
437
+ # always ok
438
+ end
439
+
440
+ def hostname_Object(o, semantic)
441
+ acceptor.accept(Issues::ILLEGAL_EXPRESSION, o, {:feature=>'hostname', :container=>semantic})
442
+ end
443
+
444
+ #---QUERY CHECKS
445
+
446
+ # Anything not explicitly allowed is flagged as error.
447
+ def query_Object(o)
448
+ acceptor.accept(Issues::ILLEGAL_QUERY_EXPRESSION, o)
449
+ end
450
+
451
+ # Puppet AST only allows == and !=
452
+ #
453
+ def query_ComparisonExpression(o)
454
+ acceptor.accept(Issues::ILLEGAL_QUERY_EXPRESSION, o) unless [:'==', :'!='].include? o.operator
455
+ end
456
+
457
+ # Allows AND, OR, and checks if left/right are allowed in query.
458
+ def query_BooleanExpression(o)
459
+ query o.left_expr
460
+ query o.right_expr
461
+ end
462
+
463
+ def query_ParenthesizedExpression(o)
464
+ query(o.expr)
465
+ end
466
+
467
+ def query_VariableExpression(o); end
468
+
469
+ def query_QualifiedName(o); end
470
+
471
+ def query_LiteralNumber(o); end
472
+
473
+ def query_LiteralString(o); end
474
+
475
+ def query_LiteralBoolean(o); end
476
+
477
+ #---RVALUE CHECKS
478
+
479
+ # By default, all expressions are reported as being rvalues
480
+ # Implement specific rvalue checks for those that are not.
481
+ #
482
+ def rvalue_Expression(o); end
483
+
484
+ def rvalue_ImportExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
485
+
486
+ def rvalue_BlockExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
487
+
488
+ def rvalue_CaseExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
489
+
490
+ def rvalue_IfExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
491
+
492
+ def rvalue_UnlessExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
493
+
494
+ def rvalue_ResourceExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
495
+
496
+ def rvalue_ResourceDefaultsExpression(o); acceptor.accept(Issues::NOT_RVALUE, o) ; end
497
+
498
+ def rvalue_ResourceOverrideExpression(o); acceptor.accept(Issues::NOT_RVALUE, o) ; end
499
+
500
+ def rvalue_CollectExpression(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
501
+
502
+ def rvalue_Definition(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
503
+
504
+ def rvalue_NodeDefinition(o) ; acceptor.accept(Issues::NOT_RVALUE, o) ; end
505
+
506
+ def rvalue_UnaryExpression(o) ; rvalue o.expr ; end
507
+
508
+ #---TOP CHECK
509
+
510
+ def top_NilClass(o, definition)
511
+ # ok, reached the top, no more parents
512
+ end
513
+
514
+ def top_Object(o, definition)
515
+ # fail, reached a container that is not top level
516
+ acceptor.accept(Issues::NOT_TOP_LEVEL, definition)
517
+ end
518
+
519
+ def top_BlockExpression(o, definition)
520
+ # ok, if this is a block representing the body of a class, or is top level
521
+ top o.eContainer, definition
522
+ end
523
+
524
+ def top_HostClassDefinition(o, definition)
525
+ # ok, stop scanning parents
526
+ end
527
+
528
+ # A LambdaExpression is a BlockExpression, and this method is needed to prevent the polymorph method for BlockExpression
529
+ # to accept a lambda.
530
+ # A lambda can not iteratively create classes, nodes or defines as the lambda does not have a closure.
531
+ #
532
+ def top_LambdaExpression(o, definition)
533
+ # fail, stop scanning parents
534
+ acceptor.accept(Issues::NOT_TOP_LEVEL, definition)
535
+ end
536
+
537
+ #--- NON POLYMORPH, NON CHECKING CODE
538
+
539
+ # Produces string part of something named, or nil if not a QualifiedName or QualifiedReference
540
+ #
541
+ def varname_to_s(o)
542
+ case o
543
+ when Model::QualifiedName
544
+ o.value
545
+ when Model::QualifiedReference
546
+ o.value
547
+ else
548
+ nil
549
+ end
550
+ end
551
+ end