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
@@ -1,11 +1,12 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
+ require 'puppet/parser/parser_factory'
3
4
 
4
- describe Puppet::Parser::Parser do
5
+ describe "Puppet::Parser::Parser" do
5
6
  module ParseMatcher
6
7
  class ParseAs
7
8
  def initialize(klass)
8
- @parser = Puppet::Parser::Parser.new "development"
9
+ @parser = Puppet::Parser::ParserFactory.parser("development")
9
10
  @class = klass
10
11
  end
11
12
 
@@ -38,7 +39,7 @@ describe Puppet::Parser::Parser do
38
39
 
39
40
  class ParseWith
40
41
  def initialize(block)
41
- @parser = Puppet::Parser::Parser.new "development"
42
+ @parser = Puppet::Parser::ParserFactory.parser("development")
42
43
  @block = block
43
44
  end
44
45
 
@@ -74,76 +75,193 @@ describe Puppet::Parser::Parser do
74
75
 
75
76
  before :each do
76
77
  @resource_type_collection = Puppet::Resource::TypeCollection.new("env")
77
- @parser = Puppet::Parser::Parser.new "development"
78
- end
79
-
80
- describe "when parsing comments before statement" do
81
- it "should associate the documentation to the statement AST node" do
82
- ast = @parser.parse("""
83
- # comment
84
- class test {}
85
- """)
78
+ @parser = Puppet::Parser::ParserFactory.parser("development")
86
79
 
87
- ast.code[0].should be_a(Puppet::Parser::AST::Hostclass)
88
- ast.code[0].name.should == 'test'
89
- ast.code[0].instantiate('')[0].doc.should == "comment\n"
90
- end
80
+ # @parser = Puppet::Parser::Parser.new "development"
91
81
  end
82
+ shared_examples_for 'a puppet parser' do
83
+ describe "when parsing comments before statement" do
84
+ it "should associate the documentation to the statement AST node" do
85
+ if Puppet[:parser] == 'future'
86
+ pending "egrammar does not yet process comments"
87
+ end
88
+ ast = @parser.parse("""
89
+ # comment
90
+ class test {}
91
+ """)
92
92
 
93
- describe "when parsing" do
94
- it "should be able to parse normal left to right relationships" do
95
- "Notify[foo] -> Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
93
+ ast.code[0].should be_a(Puppet::Parser::AST::Hostclass)
94
+ ast.code[0].name.should == 'test'
95
+ ast.code[0].instantiate('')[0].doc.should == "comment\n"
96
+ end
96
97
  end
97
98
 
98
- it "should be able to parse right to left relationships" do
99
- "Notify[foo] <- Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
100
- end
99
+ describe "when parsing" do
100
+ it "should be able to parse normal left to right relationships" do
101
+ "Notify[foo] -> Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
102
+ end
101
103
 
102
- it "should be able to parse normal left to right subscriptions" do
103
- "Notify[foo] ~> Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
104
- end
104
+ it "should be able to parse right to left relationships" do
105
+ "Notify[foo] <- Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
106
+ end
105
107
 
106
- it "should be able to parse right to left subscriptions" do
107
- "Notify[foo] <~ Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
108
- end
108
+ it "should be able to parse normal left to right subscriptions" do
109
+ "Notify[foo] ~> Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
110
+ end
111
+
112
+ it "should be able to parse right to left subscriptions" do
113
+ "Notify[foo] <~ Notify[bar]".should parse_as(Puppet::Parser::AST::Relationship)
114
+ end
109
115
 
110
- it "should correctly set the arrow type of a relationship" do
111
- "Notify[foo] <~ Notify[bar]".should parse_with { |rel| rel.arrow == "<~" }
116
+ it "should correctly set the arrow type of a relationship" do
117
+ "Notify[foo] <~ Notify[bar]".should parse_with { |rel| rel.arrow == "<~" }
118
+ end
119
+
120
+ it "should be able to parse deep hash access" do
121
+ %q{
122
+ $hash = { 'a' => { 'b' => { 'c' => 'it works' } } }
123
+ $out = $hash['a']['b']['c']
124
+ }.should parse_with { |v| v.value.is_a?(Puppet::Parser::AST::ASTHash) }
125
+ end
126
+
127
+ it "should fail if asked to parse '$foo::::bar'" do
128
+ expect { @parser.parse("$foo::::bar") }.to raise_error(Puppet::ParseError, /Syntax error at ':'/)
129
+ end
130
+
131
+ describe "function calls" do
132
+ it "should be able to pass an array to a function" do
133
+ "my_function([1,2,3])".should parse_with { |fun|
134
+ fun.is_a?(Puppet::Parser::AST::Function) &&
135
+ fun.arguments[0].evaluate(stub 'scope') == ['1','2','3']
136
+ }
137
+ end
138
+
139
+ it "should be able to pass a hash to a function" do
140
+ "my_function({foo => bar})".should parse_with { |fun|
141
+ fun.is_a?(Puppet::Parser::AST::Function) &&
142
+ fun.arguments[0].evaluate(stub 'scope') == {'foo' => 'bar'}
143
+ }
144
+ end
145
+ end
146
+
147
+ describe "collections" do
148
+ it "should find resources according to an expression" do
149
+ %q{ File <| mode == 0700 + 0050 + 0050 |> }.should parse_with { |coll|
150
+ coll.is_a?(Puppet::Parser::AST::Collection) &&
151
+ coll.query.evaluate(stub 'scope').first == ["mode", "==", 0700 + 0050 + 0050]
152
+ }
153
+ end
154
+ end
112
155
  end
156
+ end
113
157
 
114
- it "should be able to parse deep hash access" do
115
- %q{
116
- $hash = { 'a' => { 'b' => { 'c' => 'it works' } } }
117
- $out = $hash['a']['b']['c']
118
- }.should parse_with { |v| v.value.is_a?(Puppet::Parser::AST::ASTHash) }
158
+ describe 'using classic parser' do
159
+ before :each do
160
+ Puppet[:parser] = 'current'
119
161
  end
162
+ it_behaves_like 'a puppet parser'
163
+ end
120
164
 
121
- it "should fail if asked to parse '$foo::::bar'" do
122
- expect { @parser.parse("$foo::::bar") }.to raise_error(Puppet::ParseError, /Syntax error at ':'/)
165
+ describe 'using future parser' do
166
+ before :each do
167
+ Puppet[:parser] = 'future'
123
168
  end
169
+ it_behaves_like 'a puppet parser'
124
170
 
125
- describe "function calls" do
126
- it "should be able to pass an array to a function" do
127
- "my_function([1,2,3])".should parse_with { |fun|
128
- fun.is_a?(Puppet::Parser::AST::Function) &&
129
- fun.arguments[0].evaluate(stub 'scope') == ['1','2','3']
130
- }
171
+ context 'more detailed errors should be generated' do
172
+ before :each do
173
+ Puppet[:parser] = 'future'
174
+ @resource_type_collection = Puppet::Resource::TypeCollection.new("env")
175
+ @parser = Puppet::Parser::ParserFactory.parser("development")
176
+ end
177
+
178
+ it 'should flag illegal type references' do
179
+ source = <<-SOURCE.gsub(/^ {8}/,'')
180
+ 1+1 { "title": }
181
+ SOURCE
182
+ # This error message is currently produced by the parser, and is not as detailed as desired
183
+ # It references position 16 at the closing '}'
184
+ expect { @parser.parse(source) }.to raise_error(/Expression is not valid as a resource.*line 1:16/)
185
+ end
186
+
187
+ it 'should flag illegal type references and get position correct' do
188
+ source = <<-SOURCE.gsub(/^ {8}/,'')
189
+ 1+1 { "title":
190
+ }
191
+ SOURCE
192
+ # This error message is currently produced by the parser, and is not as detailed as desired
193
+ # It references position 16 at the closing '}'
194
+ expect { @parser.parse(source) }.to raise_error(/Expression is not valid as a resource.*line 2:3/)
131
195
  end
132
196
 
133
- it "should be able to pass a hash to a function" do
134
- "my_function({foo => bar})".should parse_with { |fun|
135
- fun.is_a?(Puppet::Parser::AST::Function) &&
136
- fun.arguments[0].evaluate(stub 'scope') == {'foo' => 'bar'}
197
+ it 'should flag illegal use of non r-value producing if' do
198
+ source = <<-SOURCE.gsub(/^ {8}/,'')
199
+ $a = if true {
200
+ false
137
201
  }
202
+ SOURCE
203
+ expect { @parser.parse(source) }.to raise_error(/An 'if' statement does not produce a value at line 1:6/)
138
204
  end
139
- end
140
205
 
141
- describe "collections" do
142
- it "should find resources according to an expression" do
143
- %q{ File <| mode == 0700 + 0050 + 0050 |> }.should parse_with { |coll|
144
- coll.is_a?(Puppet::Parser::AST::Collection) &&
145
- coll.query.evaluate(stub 'scope').first == ["mode", "==", 0700 + 0050 + 0050]
206
+ it 'should flag illegal use of non r-value producing case' do
207
+ source = <<-SOURCE.gsub(/^ {8}/,'')
208
+ $a = case true {
209
+ false :{ }
146
210
  }
211
+ SOURCE
212
+ expect { @parser.parse(source) }.to raise_error(/A 'case' statement does not produce a value at line 1:6/)
213
+ end
214
+
215
+ it 'should flag illegal use of non r-value producing <| |>' do
216
+ expect { @parser.parse("$a = file <| |>") }.to raise_error(/A Virtual Query does not produce a value at line 1:6/)
217
+ end
218
+
219
+ it 'should flag illegal use of non r-value producing <<| |>>' do
220
+ expect { @parser.parse("$a = file <<| |>>") }.to raise_error(/An Exported Query does not produce a value at line 1:6/)
221
+ end
222
+
223
+ it 'should flag illegal use of non r-value producing define' do
224
+ Puppet.expects(:err).with("Invalid use of expression. A 'define' expression does not produce a value at line 1:6")
225
+ Puppet.expects(:err).with("Classes, definitions, and nodes may only appear at toplevel or inside other classes at line 1:6")
226
+ expect { @parser.parse("$a = define foo { }") }.to raise_error(/2 errors/)
227
+ end
228
+
229
+ it 'should flag illegal use of non r-value producing class' do
230
+ Puppet.expects(:err).with("Invalid use of expression. A Host Class Definition does not produce a value at line 1:6")
231
+ Puppet.expects(:err).with("Classes, definitions, and nodes may only appear at toplevel or inside other classes at line 1:6")
232
+ expect { @parser.parse("$a = class foo { }") }.to raise_error(/2 errors/)
233
+ end
234
+
235
+ it 'unclosed quote should be flagged for start position of string' do
236
+ source = <<-SOURCE.gsub(/^ {8}/,'')
237
+ $a = "xx
238
+ yyy
239
+ SOURCE
240
+ expect { @parser.parse(source) }.to raise_error(/Unclosed quote after '"' followed by 'xx\\nyy\.\.\.' at line 1:6/)
241
+ end
242
+
243
+ it 'can produce multiple errors and raise a summary exception' do
244
+ source = <<-SOURCE.gsub(/^ {8}/,'')
245
+ $a = node x { }
246
+ SOURCE
247
+ Puppet.expects(:err).with("Invalid use of expression. A Node Definition does not produce a value at line 1:6")
248
+ Puppet.expects(:err).with("Classes, definitions, and nodes may only appear at toplevel or inside other classes at line 1:6")
249
+ expect { @parser.parse(source) }.to raise_error(/2 errors/)
250
+ end
251
+
252
+ it 'can produce detailed error for a bad hostname' do
253
+ source = <<-SOURCE.gsub(/^ {8}/,'')
254
+ node 'macbook+owned+by+name' { }
255
+ SOURCE
256
+ expect { @parser.parse(source) }.to raise_error(/The hostname 'macbook\+owned\+by\+name' contains illegal characters.*at line 1:6/)
257
+ end
258
+
259
+ it 'can produce detailed error for a hostname with interpolation' do
260
+ source = <<-SOURCE.gsub(/^ {8}/,'')
261
+ $name = 'fred'
262
+ node "macbook-owned-by$name" { }
263
+ SOURCE
264
+ expect { @parser.parse(source) }.to raise_error(/An interpolated expression is not allowed in a hostname of a node at line 2:24/)
147
265
  end
148
266
  end
149
267
  end
@@ -182,7 +182,7 @@ describe "Two step scoping for variables" do
182
182
  class c {
183
183
  notify { 'something': message => "$a::b" }
184
184
  }
185
-
185
+
186
186
  class a { }
187
187
 
188
188
  node default {
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'spec_helper'
4
+ require 'puppet/file_bucket/dipper'
5
+
6
+ describe Puppet::Type.type(:cron).provider(:crontab), '(integration)', :unless => Puppet.features.microsoft_windows? do
7
+ include PuppetSpec::Files
8
+
9
+ before :each do
10
+ Puppet::Type.type(:cron).stubs(:defaultprovider).returns described_class
11
+ Puppet::FileBucket::Dipper.any_instance.stubs(:backup) # Don't backup to filebucket
12
+
13
+ # I dont want to execute anything
14
+ described_class.stubs(:filetype).returns Puppet::Util::FileType::FileTypeFlat
15
+ described_class.stubs(:default_target).returns crontab_user1
16
+
17
+ # I dont want to stub Time.now to get a static header because I dont know
18
+ # where Time.now is used elsewere so just go with a very simple header
19
+ described_class.stubs(:header).returns "# HEADER: some simple\n# HEADER: header\n"
20
+ FileUtils.cp(my_fixture('crontab_user1'), crontab_user1)
21
+ FileUtils.cp(my_fixture('crontab_user2'), crontab_user2)
22
+ end
23
+
24
+ after :each do
25
+ described_class.clear
26
+ end
27
+
28
+ let :crontab_user1 do
29
+ tmpfile('cron_integration_specs')
30
+ end
31
+
32
+ let :crontab_user2 do
33
+ tmpfile('cron_integration_specs')
34
+ end
35
+
36
+ def run_in_catalog(*resources)
37
+ catalog = Puppet::Resource::Catalog.new
38
+ catalog.host_config = false
39
+ resources.each do |resource|
40
+ resource.expects(:err).never
41
+ catalog.add_resource(resource)
42
+ end
43
+ catalog.apply
44
+ end
45
+
46
+ def expect_output(fixture_name)
47
+ File.read(crontab_user1).should == File.read(my_fixture(fixture_name))
48
+ end
49
+
50
+ describe "when managing a cron entry" do
51
+ describe "with ensure absent" do
52
+ it "should do nothing if entry already absent" do
53
+ resource = Puppet::Type.type(:cron).new(
54
+ :name => 'no_such_entry',
55
+ :ensure => :absent,
56
+ :target => crontab_user1,
57
+ :user => crontab_user1
58
+ )
59
+ run_in_catalog(resource)
60
+ expect_output('crontab_user1')
61
+ end
62
+
63
+ it "should remove the resource from crontab if present" do
64
+ resource = Puppet::Type.type(:cron).new(
65
+ :name => 'My daily failure',
66
+ :ensure => :absent,
67
+ :target => crontab_user1,
68
+ :user => crontab_user1
69
+ )
70
+ run_in_catalog(resource)
71
+ expect_output('remove_named_resource')
72
+ end
73
+
74
+ it "should remove a matching cronentry if present" do
75
+ resource = Puppet::Type.type(:cron).new(
76
+ :name => 'no_such_named_resource_in_crontab',
77
+ :ensure => :absent,
78
+ :minute => [ '17-19', '22' ],
79
+ :hour => [ '0-23/2' ],
80
+ :weekday => 'Tue',
81
+ :command => '/bin/unnamed_regular_command',
82
+ :target => crontab_user1,
83
+ :user => crontab_user1
84
+ )
85
+ run_in_catalog(resource)
86
+ expect_output('remove_unnamed_resource')
87
+ end
88
+ end
89
+
90
+ describe "with ensure present" do
91
+ it "should do nothing if entry already present" do
92
+ resource = Puppet::Type.type(:cron).new(
93
+ :name => 'My daily failure',
94
+ :special => 'daily',
95
+ :command => '/bin/false',
96
+ :target => crontab_user1,
97
+ :user => crontab_user1
98
+ )
99
+ run_in_catalog(resource)
100
+ expect_output('crontab_user1')
101
+ end
102
+
103
+ it "should do nothing if a matching entry already present" do
104
+ resource = Puppet::Type.type(:cron).new(
105
+ :name => 'no_such_named_resource_in_crontab',
106
+ :ensure => :present,
107
+ :minute => [ '17-19', '22' ],
108
+ :hour => [ '0-23/2' ],
109
+ :command => '/bin/unnamed_regular_command',
110
+ :target => crontab_user1,
111
+ :user => crontab_user1
112
+ )
113
+ run_in_catalog(resource)
114
+ expect_output('crontab_user1')
115
+ end
116
+
117
+ it "should add a new normal entry if currently absent" do
118
+ resource = Puppet::Type.type(:cron).new(
119
+ :name => 'new entry',
120
+ :ensure => :present,
121
+ :minute => '12',
122
+ :weekday => 'Tue',
123
+ :command => '/bin/new',
124
+ :environment => [
125
+ 'MAILTO=""',
126
+ 'SHELL=/bin/bash'
127
+ ],
128
+ :target => crontab_user1,
129
+ :user => crontab_user1
130
+ )
131
+ run_in_catalog(resource)
132
+ expect_output('create_normal_entry')
133
+ end
134
+
135
+ it "should add a new special entry if currently absent" do
136
+ resource = Puppet::Type.type(:cron).new(
137
+ :name => 'new special entry',
138
+ :ensure => :present,
139
+ :special => 'reboot',
140
+ :command => 'echo "Booted" 1>&2',
141
+ :environment => 'MAILTO=bob@company.com',
142
+ :target => crontab_user1,
143
+ :user => crontab_user1
144
+ )
145
+ run_in_catalog(resource)
146
+ expect_output('create_special_entry')
147
+ end
148
+
149
+ it "should change existing entry if out of sync" do
150
+ resource = Puppet::Type.type(:cron).new(
151
+ :name => 'Monthly job',
152
+ :ensure => :present,
153
+ :special => 'monthly',
154
+ # :minute => ['22'],
155
+ :command => '/usr/bin/monthly',
156
+ :environment => [],
157
+ :target => crontab_user1,
158
+ :user => crontab_user1
159
+ )
160
+ run_in_catalog(resource)
161
+ expect_output('modify_entry')
162
+ end
163
+ it "should not try to move an entry from one file to another" do
164
+ # force the parsedfile provider to also parse user1's crontab
165
+ random_resource = Puppet::Type.type(:cron).new(
166
+ :name => 'foo',
167
+ :ensure => :absent,
168
+ :target => crontab_user1,
169
+ :user => crontab_user1
170
+ )
171
+ resource = Puppet::Type.type(:cron).new(
172
+ :name => 'My daily failure',
173
+ :special => 'daily',
174
+ :command => "/bin/false",
175
+ :target => crontab_user2,
176
+ :user => crontab_user2
177
+ )
178
+ run_in_catalog(resource)
179
+ File.read(crontab_user1).should == File.read(my_fixture('moved_cronjob_input1'))
180
+ File.read(crontab_user2).should == File.read(my_fixture('moved_cronjob_input2'))
181
+ end
182
+ end
183
+
184
+ it "should not add multiple headers"
185
+ end
186
+
187
+ end