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
@@ -139,6 +139,17 @@ describe Puppet::Property do
139
139
  property.stubs(:path).returns "/my/param"
140
140
  property.event.source_description.should == "/my/param"
141
141
  end
142
+
143
+ it "should have the 'invalidate_refreshes' value set if set on a value" do
144
+ property.stubs(:event_name).returns :my_event
145
+ property.stubs(:should).returns "foo"
146
+ foo = mock()
147
+ foo.expects(:invalidate_refreshes).returns(true)
148
+ collection = mock()
149
+ collection.expects(:match?).with("foo").returns(foo)
150
+ property.class.stubs(:value_collection).returns(collection)
151
+ property.event.invalidate_refreshes.should be_true
152
+ end
142
153
  end
143
154
 
144
155
  describe "when shadowing metaparameters" do
@@ -744,6 +744,7 @@ describe provider_class do
744
744
  @resource[:context] = "/files/etc/test"
745
745
  @resource[:load_path] = my_fixture_dir
746
746
 
747
+ @provider.expects(:print_load_errors).with(:warning => true)
747
748
  aug = @provider.open_augeas
748
749
  aug.should_not == nil
749
750
  aug.match("/files/etc/fstab").should == []
@@ -754,6 +755,7 @@ describe provider_class do
754
755
  it "should load standard files if context isn't specific" do
755
756
  @resource[:context] = "/files/etc"
756
757
 
758
+ @provider.expects(:print_load_errors).with(:warning => false)
757
759
  aug = @provider.open_augeas
758
760
  aug.should_not == nil
759
761
  aug.match("/files/etc/fstab").should == ["/files/etc/fstab"]
@@ -763,6 +765,7 @@ describe provider_class do
763
765
  it "should not optimise if the context is a complex path" do
764
766
  @resource[:context] = "/files/*[label()='etc']"
765
767
 
768
+ @provider.expects(:print_load_errors).with(:warning => false)
766
769
  aug = @provider.open_augeas
767
770
  aug.should_not == nil
768
771
  aug.match("/files/etc/fstab").should == ["/files/etc/fstab"]
@@ -8,10 +8,15 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
8
8
  provider
9
9
  end
10
10
 
11
+ def compare_crontab_text(have, want)
12
+ # We should have four header lines, and then the text...
13
+ have.lines.to_a[0..3].should be_all {|x| x =~ /^# / }
14
+ have.lines.to_a[4..-1].join('').should == want
15
+ end
16
+
11
17
  context "with the simple samples" do
12
18
  FIELDS = {
13
19
  :crontab => %w{command minute hour month monthday weekday}.collect { |o| o.intern },
14
- :freebsd_special => %w{special command}.collect { |o| o.intern },
15
20
  :environment => [:line],
16
21
  :blank => [:line],
17
22
  :comment => [:line],
@@ -28,12 +33,6 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
28
33
  end
29
34
  end
30
35
 
31
- def compare_crontab_text(have, want)
32
- # We should have four header lines, and then the text...
33
- have.lines.to_a[0..3].should be_all {|x| x =~ /^# / }
34
- have.lines.to_a[4..-1].join('').should == want
35
- end
36
-
37
36
  ########################################################################
38
37
  # Simple input fixtures for testing.
39
38
  samples = YAML.load(File.read(my_fixture('single_line.yaml')))
@@ -113,4 +112,95 @@ describe Puppet::Type.type(:cron).provider(:crontab) do
113
112
  end
114
113
  end
115
114
  end
115
+
116
+ context "when receiving a vixie cron header from the cron interface" do
117
+ it "should not write that header back to disk" do
118
+ vixie_header = File.read(my_fixture('vixie_header.txt'))
119
+ vixie_records = subject.parse(vixie_header)
120
+ compare_crontab_text subject.to_file(vixie_records), ""
121
+ end
122
+ end
123
+
124
+ context "when adding a cronjob with the same command as an existing job" do
125
+ let(:record) { {:name => "existing", :user => "root", :command => "/bin/true", :record_type => :crontab} }
126
+ let(:resource) { Puppet::Type::Cron.new(:name => "test", :user => "root", :command => "/bin/true") }
127
+ let(:resources) { { "test" => resource } }
128
+
129
+ before :each do
130
+ subject.stubs(:prefetch_all_targets).returns([record])
131
+ end
132
+
133
+ # this would be a more fitting test, but I haven't yet
134
+ # figured out how to get it working
135
+ # it "should include both jobs in the output" do
136
+ # subject.prefetch(resources)
137
+ # class Puppet::Provider::ParsedFile
138
+ # def self.records
139
+ # @records
140
+ # end
141
+ # end
142
+ # subject.to_file(subject.records).should match /Puppet name: test/
143
+ # end
144
+
145
+ it "should not base the new resource's provider on the existing record" do
146
+ subject.expects(:new).with(record).never
147
+ subject.stubs(:new)
148
+ subject.prefetch(resources)
149
+ end
150
+ end
151
+
152
+ context "when prefetching an entry now managed for another user" do
153
+ let(:resource) do
154
+ s = stub(:resource)
155
+ s.stubs(:[]).with(:user).returns 'root'
156
+ s
157
+ end
158
+
159
+ let(:record) { {:name => "test", :user => "nobody", :command => "/bin/true", :record_type => :crontab} }
160
+ let(:resources) { { "test" => resource } }
161
+
162
+ before :each do
163
+ subject.stubs(:prefetch_all_targets).returns([record])
164
+ end
165
+
166
+ it "should try and use the match method to find a more fitting record" do
167
+ subject.expects(:match).with(record, resources)
168
+ subject.prefetch(resources)
169
+ end
170
+
171
+ it "should not match a provider to the resource" do
172
+ resource.expects(:provider=).never
173
+ subject.prefetch(resources)
174
+ end
175
+
176
+ it "should not find the resource when looking up the on-disk record" do
177
+ subject.prefetch(resources)
178
+ subject.resource_for_record(record, resources).should be_nil
179
+ end
180
+ end
181
+
182
+ context "when matching resources to existing crontab entries" do
183
+ let(:first_resource) { Puppet::Type::Cron.new(:name => :one, :user => 'root', :command => '/bin/true') }
184
+ let(:second_resource) { Puppet::Type::Cron.new(:name => :two, :user => 'nobody', :command => '/bin/false') }
185
+
186
+ let(:resources) {{:one => first_resource, :two => second_resource}}
187
+
188
+ describe "with a record with a matching name and mismatching user (#2251)" do
189
+ # Puppet::Resource objects have #should defined on them, so in these
190
+ # examples we have to use the monkey patched `must` alias for the rspec
191
+ # `should` method.
192
+
193
+ it "doesn't match the record to the resource" do
194
+ record = {:name => :one, :user => 'notroot', :record_type => :crontab}
195
+ subject.resource_for_record(record, resources).must be_nil
196
+ end
197
+ end
198
+
199
+ describe "with a record with a matching name and matching user" do
200
+ it "matches the record to the resource" do
201
+ record = {:name => :two, :target => 'nobody', :command => '/bin/false'}
202
+ subject.resource_for_record(record, resources).must == second_resource
203
+ end
204
+ end
205
+ end
116
206
  end
@@ -0,0 +1,325 @@
1
+ #!/usr/bin/env rspec
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Puppet::Type.type(:cron).provider(:crontab) do
6
+
7
+ let :provider do
8
+ described_class.new(:command => '/bin/true')
9
+ end
10
+
11
+ let :resource do
12
+ Puppet::Type.type(:cron).new(
13
+ :minute => %w{0 15 30 45},
14
+ :hour => %w{8-18 20-22},
15
+ :monthday => %w{31},
16
+ :month => %w{12},
17
+ :weekday => %w{7},
18
+ :name => 'basic',
19
+ :command => '/bin/true',
20
+ :target => 'root',
21
+ :provider => provider
22
+ )
23
+ end
24
+
25
+ let :resource_special do
26
+ Puppet::Type.type(:cron).new(
27
+ :special => 'reboot',
28
+ :name => 'special',
29
+ :command => '/bin/true',
30
+ :target => 'nobody'
31
+ )
32
+ end
33
+
34
+ let :record_special do
35
+ {
36
+ :record_type => :crontab,
37
+ :special => 'reboot',
38
+ :command => '/bin/true',
39
+ :on_disk => true,
40
+ :target => 'nobody'
41
+ }
42
+ end
43
+
44
+ let :record do
45
+ {
46
+ :record_type => :crontab,
47
+ :minute => %w{0 15 30 45},
48
+ :hour => %w{8-18 20-22},
49
+ :monthday => %w{31},
50
+ :month => %w{12},
51
+ :weekday => %w{7},
52
+ :special => :absent,
53
+ :command => '/bin/true',
54
+ :on_disk => true,
55
+ :target => 'root'
56
+ }
57
+ end
58
+
59
+ describe "when determining the correct filetype" do
60
+ it "should use the suntab filetype on Solaris" do
61
+ Facter.stubs(:value).with(:osfamily).returns 'Solaris'
62
+ described_class.filetype.should == Puppet::Util::FileType::FileTypeSuntab
63
+ end
64
+
65
+ it "should use the aixtab filetype on AIX" do
66
+ Facter.stubs(:value).with(:osfamily).returns 'AIX'
67
+ described_class.filetype.should == Puppet::Util::FileType::FileTypeAixtab
68
+ end
69
+
70
+ it "should use the crontab filetype on other platforms" do
71
+ Facter.stubs(:value).with(:osfamily).returns 'Not a real operating system family'
72
+ described_class.filetype.should == Puppet::Util::FileType::FileTypeCrontab
73
+ end
74
+ end
75
+
76
+ # I'd use ENV.expects(:[]).with('USER') but this does not work because
77
+ # ENV["USER"] is evaluated at load time.
78
+ describe "when determining the default target" do
79
+ it "should use the current user #{ENV['USER']}", :if => ENV['USER'] do
80
+ described_class.default_target.should == ENV['USER']
81
+ end
82
+
83
+ it "should fallback to root", :unless => ENV['USER'] do
84
+ described_class.default_target.should == "root"
85
+ end
86
+ end
87
+
88
+ describe "when parsing a record" do
89
+ it "should parse a comment" do
90
+ described_class.parse_line("# This is a test").should == {
91
+ :record_type => :comment,
92
+ :line => "# This is a test",
93
+ }
94
+ end
95
+
96
+ it "should get the resource name of a PUPPET NAME comment" do
97
+ described_class.parse_line('# Puppet Name: My Fancy Cronjob').should == {
98
+ :record_type => :comment,
99
+ :name => 'My Fancy Cronjob',
100
+ :line => '# Puppet Name: My Fancy Cronjob',
101
+ }
102
+ end
103
+
104
+ it "should ignore blank lines" do
105
+ described_class.parse_line('').should == {:record_type => :blank, :line => ''}
106
+ described_class.parse_line(' ').should == {:record_type => :blank, :line => ' '}
107
+ described_class.parse_line("\t").should == {:record_type => :blank, :line => "\t"}
108
+ described_class.parse_line(" \t ").should == {:record_type => :blank, :line => " \t "}
109
+ end
110
+
111
+ it "should extract environment assignments" do
112
+ # man 5 crontab: MAILTO="" with no value can be used to surpress sending
113
+ # mails at all
114
+ described_class.parse_line('MAILTO=""').should == {:record_type => :environment, :line => 'MAILTO=""'}
115
+ described_class.parse_line('FOO=BAR').should == {:record_type => :environment, :line => 'FOO=BAR'}
116
+ described_class.parse_line('FOO_BAR=BAR').should == {:record_type => :environment, :line => 'FOO_BAR=BAR'}
117
+ end
118
+
119
+ it "should extract a cron entry" do
120
+ described_class.parse_line('* * * * * /bin/true').should == {
121
+ :record_type => :crontab,
122
+ :hour => :absent,
123
+ :minute => :absent,
124
+ :month => :absent,
125
+ :weekday => :absent,
126
+ :monthday => :absent,
127
+ :special => :absent,
128
+ :command => '/bin/true'
129
+ }
130
+ described_class.parse_line('0,15,30,45 8-18,20-22 31 12 7 /bin/true').should == {
131
+ :record_type => :crontab,
132
+ :minute => %w{0 15 30 45},
133
+ :hour => %w{8-18 20-22},
134
+ :monthday => %w{31},
135
+ :month => %w{12},
136
+ :weekday => %w{7},
137
+ :special => :absent,
138
+ :command => '/bin/true'
139
+ }
140
+ # A percent sign will cause the rest of the string to be passed as
141
+ # standard input and will also act as a newline character. Not sure
142
+ # if puppet should convert % to a \n as the command property so the
143
+ # test covers the current behaviour: Do not do any conversions
144
+ described_class.parse_line('0 22 * * 1-5 mail -s "It\'s 10pm" joe%Joe,%%Where are your kids?%').should == {
145
+ :record_type => :crontab,
146
+ :minute => %w{0},
147
+ :hour => %w{22},
148
+ :monthday => :absent,
149
+ :month => :absent,
150
+ :weekday => %w{1-5},
151
+ :special => :absent,
152
+ :command => 'mail -s "It\'s 10pm" joe%Joe,%%Where are your kids?%'
153
+ }
154
+ end
155
+
156
+ describe "it should support special strings" do
157
+ ['reboot','yearly','anually','monthly', 'weekly', 'daily', 'midnight', 'hourly'].each do |special|
158
+ it "should support @#{special}" do
159
+ described_class.parse_line("@#{special} /bin/true").should == {
160
+ :record_type => :crontab,
161
+ :hour => :absent,
162
+ :minute => :absent,
163
+ :month => :absent,
164
+ :weekday => :absent,
165
+ :monthday => :absent,
166
+ :special => special,
167
+ :command => '/bin/true'
168
+ }
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ describe ".instances" do
175
+ before :each do
176
+ described_class.stubs(:default_target).returns 'foobar'
177
+ end
178
+
179
+ describe "on linux" do
180
+ before do
181
+ Facter.stubs(:value).with(:osfamily).returns 'Linux'
182
+ Facter.stubs(:value).with(:operatingsystem)
183
+ end
184
+
185
+ it "should be empty if user has no crontab" do
186
+ # `crontab...` does only capture stdout here. On vixie-cron-4.1
187
+ # STDERR shows "no crontab for foobar" but stderr is ignored as
188
+ # well as the exitcode.
189
+ described_class.target_object('foobar').expects(:`).with('crontab -u foobar -l 2>/dev/null').returns ""
190
+ described_class.instances.should be_empty
191
+ end
192
+
193
+ it "should be empty if user is not present" do
194
+ # `crontab...` does only capture stdout. On vixie-cron-4.1
195
+ # STDERR shows "crontab: user `foobar' unknown" but stderr is
196
+ # ignored as well as the exitcode
197
+ described_class.target_object('foobar').expects(:`).with('crontab -u foobar -l 2>/dev/null').returns ""
198
+ described_class.instances.should be_empty
199
+ end
200
+
201
+ it "should be able to create records from not-managed records" do
202
+ described_class.expects(:target_object).returns File.new(my_fixture('simple'))
203
+ described_class.instances.map do |p|
204
+ h = {:name => p.get(:name)}
205
+ Puppet::Type.type(:cron).validproperties.each do |property|
206
+ h[property] = p.get(property)
207
+ end
208
+ h
209
+ end.should == [
210
+ {
211
+ :name => :absent,
212
+ :minute => ['5'],
213
+ :hour => ['0'],
214
+ :weekday => :absent,
215
+ :month => :absent,
216
+ :monthday => :absent,
217
+ :special => :absent,
218
+ :command => '$HOME/bin/daily.job >> $HOME/tmp/out 2>&1',
219
+ :ensure => :present,
220
+ :environment => :absent,
221
+ :user => :absent,
222
+ :target => 'foobar'
223
+ },
224
+ {
225
+ :name => :absent,
226
+ :minute => ['15'],
227
+ :hour => ['14'],
228
+ :weekday => :absent,
229
+ :month => :absent,
230
+ :monthday => ['1'],
231
+ :special => :absent,
232
+ :command => '$HOME/bin/monthly',
233
+ :ensure => :present,
234
+ :environment => :absent,
235
+ :user => :absent,
236
+ :target => 'foobar'
237
+ }
238
+ ]
239
+ end
240
+
241
+ it "should be able to parse puppet manged cronjobs" do
242
+ described_class.expects(:target_object).returns File.new(my_fixture('managed'))
243
+ described_class.instances.map do |p|
244
+ h = {:name => p.get(:name)}
245
+ Puppet::Type.type(:cron).validproperties.each do |property|
246
+ h[property] = p.get(property)
247
+ end
248
+ h
249
+ end.should == [
250
+ {
251
+ :name => 'real_job',
252
+ :minute => :absent,
253
+ :hour => :absent,
254
+ :weekday => :absent,
255
+ :month => :absent,
256
+ :monthday => :absent,
257
+ :special => :absent,
258
+ :command => '/bin/true',
259
+ :ensure => :present,
260
+ :environment => :absent,
261
+ :user => :absent,
262
+ :target => 'foobar'
263
+ },
264
+ {
265
+ :name => 'complex_job',
266
+ :minute => :absent,
267
+ :hour => :absent,
268
+ :weekday => :absent,
269
+ :month => :absent,
270
+ :monthday => :absent,
271
+ :special => 'reboot',
272
+ :command => '/bin/true >> /dev/null 2>&1',
273
+ :ensure => :present,
274
+ :environment => [
275
+ 'MAILTO=foo@example.com',
276
+ 'SHELL=/bin/sh'
277
+ ],
278
+ :user => :absent,
279
+ :target => 'foobar'
280
+ }
281
+ ]
282
+ end
283
+ end
284
+ end
285
+
286
+ describe ".match" do
287
+ describe "normal records" do
288
+ it "should match when all fields are the same" do
289
+ described_class.match(record,{resource[:name] => resource}).must == resource
290
+ end
291
+
292
+ {
293
+ :minute => %w{0 15 31 45},
294
+ :hour => %w{8-18},
295
+ :monthday => %w{30 31},
296
+ :month => %w{12 23},
297
+ :weekday => %w{4},
298
+ :command => '/bin/false',
299
+ :target => 'nobody'
300
+ }.each_pair do |field, new_value|
301
+ it "should not match a record when #{field} does not match" do
302
+ record[field] = new_value
303
+ described_class.match(record,{resource[:name] => resource}).must be_false
304
+ end
305
+ end
306
+ end
307
+
308
+ describe "special records" do
309
+ it "should match when all fields are the same" do
310
+ described_class.match(record_special,{resource_special[:name] => resource_special}).must == resource_special
311
+ end
312
+
313
+ {
314
+ :special => 'monthly',
315
+ :command => '/bin/false',
316
+ :target => 'root'
317
+ }.each_pair do |field, new_value|
318
+ it "should not match a record when #{field} does not match" do
319
+ record_special[field] = new_value
320
+ described_class.match(record_special,{resource_special[:name] => resource_special}).must be_false
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end