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
@@ -11,14 +11,61 @@ describe provider_class do
11
11
  cracklib-dicts 0 2.8.9 3.3 x86_64
12
12
  basesystem 0 8.0 5.1.1.el5.centos noarch
13
13
  chkconfig 0 1.3.30.2 2.el5 x86_64
14
+ myresource 0 1.2.3.4 5.el4 noarch
14
15
  RPM_OUTPUT
15
16
  end
16
17
 
18
+ let(:resource) do
19
+ Puppet::Type.type(:package).new(
20
+ :name => 'myresource',
21
+ :ensure => :installed
22
+ )
23
+ end
24
+
25
+ let(:provider) do
26
+ provider = provider_class.new
27
+ provider.resource = resource
28
+ provider
29
+ end
30
+
31
+ let(:rpm_version) { "RPM version 5.0.0\n" }
32
+
33
+ before(:each) do
34
+ Puppet::Util.stubs(:which).with("rpm").returns("/bin/rpm")
35
+ subject.stubs(:which).with("rpm").returns("/bin/rpm")
36
+ subject.instance_variable_set("@current_version", nil)
37
+ Puppet::Type::Package::ProviderRpm.expects(:execute).with(["/bin/rpm", "--version"]).returns(rpm_version).at_most_once
38
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "--version"], {:failonfail => true, :combine => true, :custom_environment => {}}).returns(rpm_version).at_most_once
39
+ end
40
+
17
41
  describe "self.instances" do
42
+ describe "with a modern version of RPM" do
43
+ it "should include all the modern flags" do
44
+ Puppet::Util::Execution.expects(:execpipe).with("/bin/rpm -qa --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n'").yields(packages)
45
+
46
+ installed_packages = subject.instances
47
+ end
48
+ end
49
+
50
+ describe "with a version of RPM < 4.1" do
51
+ let(:rpm_version) { "RPM version 4.0.2\n" }
52
+ it "should exclude the --nosignature flag" do
53
+ Puppet::Util::Execution.expects(:execpipe).with("/bin/rpm -qa --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n'").yields(packages)
54
+
55
+ installed_packages = subject.instances
56
+ end
57
+ end
58
+
59
+ describe "with a version of RPM < 4.0.2" do
60
+ let(:rpm_version) { "RPM version 3.0.5\n" }
61
+ it "should exclude the --nodigest flag" do
62
+ Puppet::Util::Execution.expects(:execpipe).with("/bin/rpm -qa --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n'").yields(packages)
63
+
64
+ installed_packages = subject.instances
65
+ end
66
+ end
67
+
18
68
  it "returns an array of packages" do
19
- Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "--version"], {:failonfail => true, :combine => true, :custom_environment => {}}).returns("RPM version 5.x")
20
- Puppet::Util.stubs(:which).with("rpm").returns("/bin/rpm")
21
- subject.stubs(:which).with("rpm").returns("/bin/rpm")
22
69
  Puppet::Util::Execution.expects(:execpipe).with("/bin/rpm -qa --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n'").yields(packages)
23
70
 
24
71
  installed_packages = subject.instances
@@ -55,4 +102,103 @@ describe provider_class do
55
102
  }
56
103
  end
57
104
  end
105
+
106
+ describe "#install" do
107
+ let(:resource) do
108
+ Puppet::Type.type(:package).new(
109
+ :name => 'myresource',
110
+ :ensure => :installed,
111
+ :source => '/path/to/package'
112
+ )
113
+ end
114
+
115
+ describe "when not already installed" do
116
+ it "should only include the '-i' flag" do
117
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "-i", '/path/to/package'], {:failonfail => true, :combine => true, :custom_environment => {}})
118
+ provider.install
119
+ end
120
+ end
121
+
122
+ describe "when an older version is installed" do
123
+ before(:each) do
124
+ # Force the provider to think a version of the package is already installed
125
+ # This is real hacky. I'm sorry. --jeffweiss 25 Jan 2013
126
+ provider.instance_variable_get('@property_hash')[:ensure] = '1.2.3.3'
127
+ end
128
+
129
+ it "should include the '-U --oldpackage' flags" do
130
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", ["-U", "--oldpackage"], '/path/to/package'], {:failonfail => true, :combine => true, :custom_environment => {}})
131
+ provider.install
132
+ end
133
+ end
134
+ end
135
+
136
+ describe "#uninstall" do
137
+ let(:resource) do
138
+ Puppet::Type.type(:package).new(
139
+ :name => 'myresource',
140
+ :ensure => :installed
141
+ )
142
+ end
143
+
144
+ describe "on a modern RPM" do
145
+ before(:each) do
146
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "-q", "myresource", '--nosignature', '--nodigest', "--qf", "%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n"], {:failonfail => true, :combine => true, :custom_environment => {}}).returns("myresource 0 1.2.3.4 5.el4 noarch\n")
147
+ end
148
+
149
+ let(:rpm_version) { "RPM version 4.10.0\n" }
150
+
151
+ it "should include the architecture in the package name" do
152
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "-e", 'myresource-1.2.3.4-5.el4.noarch'], {:failonfail => true, :combine => true, :custom_environment => {}}).returns('').at_most_once
153
+ provider.uninstall
154
+ end
155
+ end
156
+
157
+ describe "on an ancient RPM" do
158
+ before(:each) do
159
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "-q", "myresource", '', '', "--qf", "%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n"], {:failonfail => true, :combine => true, :custom_environment => {}}).returns("myresource 0 1.2.3.4 5.el4 noarch\n")
160
+ end
161
+
162
+ let(:rpm_version) { "RPM version 3.0.6\n" }
163
+
164
+ it "should exclude the architecture from the package name" do
165
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "-e", 'myresource-1.2.3.4-5.el4'], {:failonfail => true, :combine => true, :custom_environment => {}}).returns('').at_most_once
166
+ provider.uninstall
167
+ end
168
+ end
169
+
170
+ end
171
+
172
+ describe ".nodigest" do
173
+ { '4.0' => nil,
174
+ '4.0.1' => nil,
175
+ '4.0.2' => '--nodigest',
176
+ '4.0.3' => '--nodigest',
177
+ '4.1' => '--nodigest',
178
+ '5' => '--nodigest',
179
+ }.each do |version, expected|
180
+ describe "when current version is #{version}" do
181
+ it "should return #{expected.inspect}" do
182
+ subject.stubs(:current_version).returns(version)
183
+ subject.nodigest.should == expected
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ describe ".nosignature" do
190
+ { '4.0.3' => nil,
191
+ '4.1' => '--nosignature',
192
+ '4.1.1' => '--nosignature',
193
+ '4.2' => '--nosignature',
194
+ '5' => '--nosignature',
195
+ }.each do |version, expected|
196
+ describe "when current version is #{version}" do
197
+ it "should return #{expected.inspect}" do
198
+ subject.stubs(:current_version).returns(version)
199
+ subject.nosignature.should == expected
200
+ end
201
+ end
202
+ end
203
+ end
58
204
  end
@@ -25,6 +25,12 @@ describe provider do
25
25
  end
26
26
 
27
27
  describe 'when installing' do
28
+ before(:each) do
29
+ Puppet::Util.stubs(:which).with("rpm").returns("/bin/rpm")
30
+ provider.stubs(:which).with("rpm").returns("/bin/rpm")
31
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "--version"], {:combine => true, :custom_environment => {}, :failonfail => true}).returns("4.10.1\n").at_most_once
32
+ end
33
+
28
34
  it 'should call yum install for :installed' do
29
35
  @resource.stubs(:should).with(:ensure).returns :installed
30
36
  @provider.expects(:yum).with('-d', '0', '-e', '0', '-y', :install, 'mypackage')
@@ -56,11 +62,6 @@ describe provider do
56
62
  @provider.expects(:yum).with('-y', :erase, 'mypackage')
57
63
  @provider.purge
58
64
  end
59
-
60
- it 'should use rpm to uninstall' do
61
- @provider.expects(:rpm).with('-e', 'mypackage-1-1.i386')
62
- @provider.uninstall
63
- end
64
65
  end
65
66
 
66
67
  it 'should be versionable' do
@@ -5,55 +5,97 @@ require 'puppet/provider/parsedfile'
5
5
 
6
6
  # Most of the tests for this are still in test/ral/provider/parsedfile.rb.
7
7
  describe Puppet::Provider::ParsedFile do
8
- before do
9
- @class = Class.new(Puppet::Provider::ParsedFile)
10
- end
8
+
9
+ # The ParsedFile provider class is meant to be used as an abstract base class
10
+ # but also stores a lot of state within the singleton class. To avoid
11
+ # sharing data between classes we construct an anonymous class that inherits
12
+ # the ParsedFile provider instead of directly working with the ParsedFile
13
+ # provider itself.
14
+ subject { Puppet::Type.newtype(:parsedfile_type).provide(:parsedfile_provider, :parent => described_class) }
11
15
 
12
16
  describe "when looking up records loaded from disk" do
13
17
  it "should return nil if no records have been loaded" do
14
- @class.record?("foo").should be_nil
18
+ subject.record?("foo").should be_nil
15
19
  end
16
20
  end
17
21
 
18
22
  describe "when generating a list of instances" do
19
23
  it "should return an instance for each record parsed from all of the registered targets" do
20
- @class.expects(:targets).returns %w{/one /two}
21
- @class.stubs(:skip_record?).returns false
24
+ subject.expects(:targets).returns %w{/one /two}
25
+ subject.stubs(:skip_record?).returns false
22
26
  one = [:uno1, :uno2]
23
27
  two = [:dos1, :dos2]
24
- @class.expects(:prefetch_target).with("/one").returns one
25
- @class.expects(:prefetch_target).with("/two").returns two
28
+ subject.expects(:prefetch_target).with("/one").returns one
29
+ subject.expects(:prefetch_target).with("/two").returns two
26
30
 
27
31
  results = []
28
32
  (one + two).each do |inst|
29
33
  results << inst.to_s + "_instance"
30
- @class.expects(:new).with(inst).returns(results[-1])
34
+ subject.expects(:new).with(inst).returns(results[-1])
31
35
  end
32
36
 
33
- @class.instances.should == results
37
+ subject.instances.should == results
38
+ end
39
+
40
+ it "should ignore target when retrieve fails" do
41
+ subject.expects(:targets).returns %w{/one /two /three}
42
+ subject.stubs(:skip_record?).returns false
43
+ subject.expects(:retrieve).with("/one").returns [
44
+ {:name => 'target1_record1'},
45
+ {:name => 'target1_record2'}
46
+ ]
47
+ subject.expects(:retrieve).with("/two").raises Puppet::Util::FileType::FileReadError, "some error"
48
+ subject.expects(:retrieve).with("/three").returns [
49
+ {:name => 'target3_record1'},
50
+ {:name => 'target3_record2'}
51
+ ]
52
+ Puppet.expects(:err).with('Could not prefetch parsedfile_type provider \'parsedfile_provider\' target \'/two\': some error. Treating as empty')
53
+ subject.expects(:new).with(:name => 'target1_record1', :on_disk => true, :target => '/one', :ensure => :present).returns 'r1'
54
+ subject.expects(:new).with(:name => 'target1_record2', :on_disk => true, :target => '/one', :ensure => :present).returns 'r2'
55
+ subject.expects(:new).with(:name => 'target3_record1', :on_disk => true, :target => '/three', :ensure => :present).returns 'r3'
56
+ subject.expects(:new).with(:name => 'target3_record2', :on_disk => true, :target => '/three', :ensure => :present).returns 'r4'
57
+
58
+ subject.instances.should == %w{r1 r2 r3 r4}
34
59
  end
35
60
 
36
61
  it "should skip specified records" do
37
- @class.expects(:targets).returns %w{/one}
38
- @class.expects(:skip_record?).with(:uno).returns false
39
- @class.expects(:skip_record?).with(:dos).returns true
62
+ subject.expects(:targets).returns %w{/one}
63
+ subject.expects(:skip_record?).with(:uno).returns false
64
+ subject.expects(:skip_record?).with(:dos).returns true
40
65
  one = [:uno, :dos]
41
- @class.expects(:prefetch_target).returns one
66
+ subject.expects(:prefetch_target).returns one
67
+
68
+ subject.expects(:new).with(:uno).returns "eh"
69
+ subject.expects(:new).with(:dos).never
70
+
71
+ subject.instances
72
+ end
73
+ end
42
74
 
43
- @class.expects(:new).with(:uno).returns "eh"
44
- @class.expects(:new).with(:dos).never
75
+ describe "when matching resources to existing records" do
76
+ let(:first_resource) { stub(:one, :name => :one) }
77
+ let(:second_resource) { stub(:two, :name => :two) }
45
78
 
46
- @class.instances
79
+ let(:resources) {{:one => first_resource, :two => second_resource}}
80
+
81
+ it "returns a resource if the record name matches the resource name" do
82
+ record = {:name => :one}
83
+ subject.resource_for_record(record, resources).should be first_resource
84
+ end
85
+
86
+ it "doesn't return a resource if the record name doesn't match any resource names" do
87
+ record = {:name => :three}
88
+ subject.resource_for_record(record, resources).should be_nil
47
89
  end
48
90
  end
49
91
 
50
92
  describe "when flushing a file's records to disk" do
51
93
  before do
52
94
  # This way we start with some @records, like we would in real life.
53
- @class.stubs(:retrieve).returns []
54
- @class.default_target = "/foo/bar"
55
- @class.initvars
56
- @class.prefetch
95
+ subject.stubs(:retrieve).returns []
96
+ subject.default_target = "/foo/bar"
97
+ subject.initvars
98
+ subject.prefetch
57
99
 
58
100
  @filetype = Puppet::Util::FileType.filetype(:flat).new("/my/file")
59
101
  Puppet::Util::FileType.filetype(:flat).stubs(:new).with("/my/file").returns @filetype
@@ -64,7 +106,7 @@ describe Puppet::Provider::ParsedFile do
64
106
  it "should back up the file being written if the filetype can be backed up" do
65
107
  @filetype.expects(:backup)
66
108
 
67
- @class.flush_target("/my/file")
109
+ subject.flush_target("/my/file")
68
110
  end
69
111
 
70
112
  it "should not try to back up the file if the filetype cannot be backed up" do
@@ -73,22 +115,74 @@ describe Puppet::Provider::ParsedFile do
73
115
 
74
116
  @filetype.stubs(:write)
75
117
 
76
- @class.flush_target("/my/file")
118
+ subject.flush_target("/my/file")
77
119
  end
78
120
 
79
121
  it "should not back up the file more than once between calls to 'prefetch'" do
80
122
  @filetype.expects(:backup).once
81
123
 
82
- @class.flush_target("/my/file")
83
- @class.flush_target("/my/file")
124
+ subject.flush_target("/my/file")
125
+ subject.flush_target("/my/file")
84
126
  end
85
127
 
86
128
  it "should back the file up again once the file has been reread" do
87
129
  @filetype.expects(:backup).times(2)
88
130
 
89
- @class.flush_target("/my/file")
90
- @class.prefetch
91
- @class.flush_target("/my/file")
131
+ subject.flush_target("/my/file")
132
+ subject.prefetch
133
+ subject.flush_target("/my/file")
134
+ end
135
+ end
136
+ end
137
+
138
+ describe "A very basic provider based on ParsedFile" do
139
+
140
+ let(:input_text) { File.read(my_fixture('simple.txt')) }
141
+ let(:target) { File.expand_path("/tmp/test") }
142
+
143
+ subject do
144
+ example_provider_class = Class.new(Puppet::Provider::ParsedFile)
145
+ example_provider_class.default_target = target
146
+ # Setup some record rules
147
+ example_provider_class.instance_eval do
148
+ text_line :text, :match => %r{.}
149
+ end
150
+ example_provider_class.initvars
151
+ example_provider_class.prefetch
152
+ # evade a race between multiple invocations of the header method
153
+ example_provider_class.stubs(:header).
154
+ returns("# HEADER As added by puppet.\n")
155
+ example_provider_class
156
+ end
157
+
158
+ context "writing file contents back to disk" do
159
+ it "should not change anything except from adding a header" do
160
+ input_records = subject.parse(input_text)
161
+ subject.to_file(input_records).
162
+ should match subject.header + input_text
163
+ end
164
+ end
165
+
166
+ context "rewriting a file containing a native header" do
167
+ let(:regex) { %r/^# HEADER.*third party\.\n/ }
168
+ let(:input_records) { subject.parse(input_text) }
169
+
170
+ before :each do
171
+ subject.stubs(:native_header_regex).returns(regex)
172
+ end
173
+
174
+ it "should move the native header to the top" do
175
+ subject.to_file(input_records).should_not match /\A#{subject.header}/
176
+ end
177
+
178
+ context "and dropping native headers found in input" do
179
+ before :each do
180
+ subject.stubs(:drop_native_header).returns(true)
181
+ end
182
+
183
+ it "should not include the native header in the output" do
184
+ subject.to_file(input_records).should_not match regex
185
+ end
92
186
  end
93
187
  end
94
188
  end
@@ -54,4 +54,22 @@ OUTPUT
54
54
 
55
55
  @provider.rcvar_value.should == "YES"
56
56
  end
57
+
58
+ it "should find the right rcvar_name" do
59
+ @provider.stubs(:rcvar).returns(['# ntpd', 'ntpd_enable="YES"'])
60
+
61
+ @provider.rcvar_name.should == "ntpd"
62
+ end
63
+
64
+ it "should enable only the selected service" do
65
+ File.stubs(:exists?).with('/etc/rc.conf').returns(true)
66
+ File.stubs(:read).with('/etc/rc.conf').returns("openntpd_enable=\"NO\"\nntpd_enable=\"NO\"\n")
67
+ fh = stub 'fh'
68
+ File.stubs(:open).with('/etc/rc.conf', File::WRONLY).yields(fh)
69
+ fh.expects(:<<).with("openntpd_enable=\"NO\"\nntpd_enable=\"YES\"\n")
70
+ File.stubs(:exists?).with('/etc/rc.conf.local').returns(false)
71
+ File.stubs(:exists?).with('/etc/rc.conf.d/ntpd').returns(false)
72
+
73
+ @provider.rc_replace('ntpd', 'ntpd', 'YES')
74
+ end
57
75
  end
@@ -5,141 +5,155 @@
5
5
 
6
6
  require 'spec_helper'
7
7
 
8
- provider_class = Puppet::Type.type(:service).provider(:init)
8
+ describe Puppet::Type.type(:service).provider(:init) do
9
9
 
10
- describe provider_class do
10
+ let :provider do
11
+ provider = described_class.new(:name => 'myservice')
12
+ provider.resource = resource
13
+ provider
14
+ end
11
15
 
12
- before :each do
13
- @class = Puppet::Type.type(:service).provider(:init)
14
- @resource = stub 'resource'
15
- @resource.stubs(:[]).returns(nil)
16
- @resource.stubs(:[]).with(:name).returns "myservice"
17
- @resource.stubs(:[]).with(:path).returns ["/service/path","/alt/service/path"]
18
- File.stubs(:directory?).returns(true)
16
+ let :resource do
17
+ Puppet::Type.type(:service).new(
18
+ :name => 'myservice',
19
+ :ensure => :running,
20
+ :path => paths
21
+ )
22
+ end
19
23
 
20
- @provider = provider_class.new
21
- @provider.resource = @resource
24
+ let :paths do
25
+ ["/service/path","/alt/service/path"]
26
+ end
27
+
28
+ let :excludes do
29
+ # Taken from redhat, gentoo, and debian
30
+ %w{functions.sh reboot.sh shutdown.sh functions halt killall single linuxconf reboot boot wait-for-state}
22
31
  end
23
32
 
24
33
  describe "when getting all service instances" do
25
34
  before :each do
35
+ described_class.stubs(:defpath).returns('tmp')
36
+
26
37
  @services = ['one', 'two', 'three', 'four']
27
- Dir.stubs(:entries).returns @services
28
- FileTest.stubs(:directory?).returns(true)
38
+ Dir.stubs(:entries).with('tmp').returns @services
39
+ FileTest.expects(:directory?).with('tmp').returns(true)
29
40
  FileTest.stubs(:executable?).returns(true)
30
- @class.stubs(:defpath).returns('tmp')
31
41
  end
32
42
 
33
43
  it "should return instances for all services" do
34
- @services.each do |inst|
35
- @class.expects(:new).with{|hash| hash[:name] == inst}.returns("#{inst}_instance")
36
- end
37
- results = @services.collect {|x| "#{x}_instance"}
38
-
39
- @class.instances.should == results
44
+ described_class.instances.map(&:name).should == @services
40
45
  end
41
46
 
42
47
  it "should omit an array of services from exclude list" do
43
48
  exclude = ['two', 'four']
44
- (@services - exclude).each do |inst|
45
- @class.expects(:new).with{|hash| hash[:name] == inst}.returns("#{inst}_instance")
46
- end
47
- results = (@services-exclude).collect {|x| "#{x}_instance"}
48
-
49
- @class.get_services(@class.defpath, exclude).should == results
49
+ described_class.get_services(described_class.defpath, exclude).map(&:name).should == (@services - exclude)
50
50
  end
51
51
 
52
52
  it "should omit a single service from the exclude list" do
53
53
  exclude = 'two'
54
- (@services - [exclude]).each do |inst|
55
- @class.expects(:new).with{|hash| hash[:name] == inst}.returns("#{inst}_instance")
56
- end
57
- results = @services.reject{|x| x == exclude }.collect {|x| "#{x}_instance"}
58
-
59
- @class.get_services(@class.defpath, exclude).should == results
54
+ described_class.get_services(described_class.defpath, exclude).map(&:name).should == @services - [exclude]
60
55
  end
61
56
 
62
57
  it "should use defpath" do
63
- @services.each do |inst|
64
- @class.expects(:new).with{|hash| hash[:path] == @class.defpath}.returns("#{inst}_instance")
65
- end
66
- results = @services.sort.collect {|x| "#{x}_instance"}
67
-
68
- @class.instances.sort.should == results
58
+ described_class.instances.should be_all { |provider| provider.get(:path) == described_class.defpath }
69
59
  end
70
60
 
71
61
  it "should set hasstatus to true for providers" do
72
- @services.each do |inst|
73
- @class.expects(:new).with{|hash| hash[:name] == inst && hash[:hasstatus] == true}.returns("#{inst}_instance")
74
- end
75
- results = @services.collect {|x| "#{x}_instance"}
76
-
77
- @class.instances.should == results
62
+ described_class.instances.should be_all { |provider| provider.get(:hasstatus) == true }
78
63
  end
79
64
 
80
65
  it "should discard upstart jobs" do
81
66
  not_init_service, *valid_services = @services
82
- valid_services.each do |inst|
83
- @class.expects(:new).with{|hash| hash[:name] == inst && hash[:hasstatus] == true}.returns("#{inst}_instance")
84
- end
85
- File.stubs(:symlink?).returns(false)
67
+ File.stubs(:symlink?).returns false
86
68
  File.stubs(:symlink?).with("tmp/#{not_init_service}").returns(true)
87
69
  File.stubs(:readlink).with("tmp/#{not_init_service}").returns("/lib/init/upstart-job")
88
70
 
89
- results = valid_services.collect {|x| "#{x}_instance"}
90
- @class.instances.should == results
71
+ described_class.instances.map(&:name).should == valid_services
72
+ end
73
+
74
+ it "should discard non-initscript scripts" do
75
+ valid_services = @services
76
+ all_services = valid_services + excludes
77
+ Dir.expects(:entries).with('tmp').returns all_services
78
+ described_class.instances.map(&:name).should =~ valid_services
91
79
  end
92
80
  end
93
81
 
94
- describe "when searching for the init script" do
82
+ describe "when checking valid paths" do
95
83
  it "should discard paths that do not exist" do
96
- File.stubs(:exist?).returns(false)
97
- File.stubs(:directory?).returns(false)
98
- @provider.paths.should be_empty
84
+ File.expects(:directory?).with(paths[0]).returns false
85
+ File.expects(:exist?).with(paths[0]).returns false
86
+ File.expects(:directory?).with(paths[1]).returns true
87
+
88
+ provider.paths.should == [paths[1]]
99
89
  end
100
90
 
101
91
  it "should discard paths that are not directories" do
102
- File.stubs(:exist?).returns(true)
103
- File.stubs(:directory?).returns(false)
104
- @provider.paths.should be_empty
92
+ paths.each do |path|
93
+ File.expects(:exist?).with(path).returns true
94
+ File.expects(:directory?).with(path).returns false
95
+ end
96
+ provider.paths.should be_empty
105
97
  end
98
+ end
106
99
 
107
- it "should be able to find the init script in the service path" do
108
- File.stubs(:stat).raises(Errno::ENOENT.new('No such file or directory'))
109
- File.expects(:stat).with("/service/path/myservice").returns true
110
- @provider.initscript.should == "/service/path/myservice"
100
+ describe "when searching for the init script" do
101
+ before :each do
102
+ paths.each {|path| File.expects(:directory?).with(path).returns true }
111
103
  end
104
+
112
105
  it "should be able to find the init script in the service path" do
113
- File.stubs(:stat).raises(Errno::ENOENT.new('No such file or directory'))
114
- File.expects(:stat).with("/alt/service/path/myservice").returns true
115
- @provider.initscript.should == "/alt/service/path/myservice"
106
+ File.expects(:stat).with("#{paths[0]}/myservice").returns true
107
+ File.expects(:stat).with("#{paths[1]}/myservice").never # first one wins
108
+ provider.initscript.should == "/service/path/myservice"
116
109
  end
110
+
111
+ it "should be able to find the init script in an alternate service path" do
112
+ File.expects(:stat).with("#{paths[0]}/myservice").raises Errno::ENOENT, "No such file or directory - #{paths[0]}/myservice"
113
+ File.expects(:stat).with("#{paths[1]}/myservice").returns true
114
+ provider.initscript.should == "/alt/service/path/myservice"
115
+ end
116
+
117
+ it "should be able to find the init script if it ends with .sh" do
118
+ File.expects(:stat).with("#{paths[0]}/myservice").raises Errno::ENOENT, "No such file or directory - #{paths[0]}/myservice"
119
+ File.expects(:stat).with("#{paths[1]}/myservice").raises Errno::ENOENT, "No such file or directory - #{paths[1]}/myservice"
120
+ File.expects(:stat).with("#{paths[0]}/myservice.sh").returns true
121
+ provider.initscript.should == "/service/path/myservice.sh"
122
+ end
123
+
117
124
  it "should fail if the service isn't there" do
118
- lambda { @provider.initscript }.should raise_error(Puppet::Error, "Could not find init script for 'myservice'")
125
+ paths.each do |path|
126
+ File.expects(:stat).with("#{path}/myservice").raises Errno::ENOENT, "No such file or directory - #{path}/myservice"
127
+ File.expects(:stat).with("#{path}/myservice.sh").raises Errno::ENOENT, "No such file or directory - #{path}/myservice.sh"
128
+ end
129
+ expect { provider.initscript }.to raise_error(Puppet::Error, "Could not find init script for 'myservice'")
119
130
  end
120
131
  end
121
132
 
122
133
  describe "if the init script is present" do
123
134
  before :each do
135
+ File.stubs(:directory?).with("/service/path").returns true
136
+ File.stubs(:directory?).with("/alt/service/path").returns true
124
137
  File.stubs(:stat).with("/service/path/myservice").returns true
125
138
  end
126
139
 
127
140
  [:start, :stop, :status, :restart].each do |method|
128
141
  it "should have a #{method} method" do
129
- @provider.should respond_to(method)
142
+ provider.should respond_to(method)
130
143
  end
131
144
  describe "when running #{method}" do
132
145
 
133
146
  it "should use any provided explicit command" do
134
- @resource.stubs(:[]).with(method).returns "/user/specified/command"
135
- @provider.expects(:execute).with { |command, *args| command == ["/user/specified/command"] }
136
- @provider.send(method)
147
+ resource[method] = "/user/specified/command"
148
+ provider.expects(:execute).with { |command, *args| command == ["/user/specified/command"] }
149
+ provider.send(method)
137
150
  end
138
151
 
139
152
  it "should pass #{method} to the init script when no explicit command is provided" do
140
- @resource.stubs(:[]).with("has#{method}".intern).returns :true
141
- @provider.expects(:execute).with { |command, *args| command == ["/service/path/myservice",method]}
142
- @provider.send(method)
153
+ resource[:hasrestart] = :true
154
+ resource[:hasstatus] = :true
155
+ provider.expects(:execute).with { |command, *args| command == ["/service/path/myservice",method]}
156
+ provider.send(method)
143
157
  end
144
158
  end
145
159
  end
@@ -147,45 +161,52 @@ describe provider_class do
147
161
  describe "when checking status" do
148
162
  describe "when hasstatus is :true" do
149
163
  before :each do
150
- @resource.stubs(:[]).with(:hasstatus).returns :true
164
+ resource[:hasstatus] = :true
151
165
  end
152
166
  it "should execute the command" do
153
- @provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("")
154
- @provider.status
167
+ provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("")
168
+ provider.status
155
169
  end
156
170
  it "should consider the process running if the command returns 0" do
157
- @provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("")
171
+ provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("")
158
172
  $CHILD_STATUS.stubs(:exitstatus).returns(0)
159
- @provider.status.should == :running
173
+ provider.status.should == :running
160
174
  end
161
175
  [-10,-1,1,10].each { |ec|
162
176
  it "should consider the process stopped if the command returns something non-0" do
163
- @provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("")
177
+ provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("")
164
178
  $CHILD_STATUS.stubs(:exitstatus).returns(ec)
165
- @provider.status.should == :stopped
179
+ provider.status.should == :stopped
166
180
  end
167
181
  }
168
182
  end
169
183
  describe "when hasstatus is not :true" do
184
+ before :each do
185
+ resource[:hasstatus] = :false
186
+ end
187
+
170
188
  it "should consider the service :running if it has a pid" do
171
- @provider.expects(:getpid).returns "1234"
172
- @provider.status.should == :running
189
+ provider.expects(:getpid).returns "1234"
190
+ provider.status.should == :running
173
191
  end
174
192
  it "should consider the service :stopped if it doesn't have a pid" do
175
- @provider.expects(:getpid).returns nil
176
- @provider.status.should == :stopped
193
+ provider.expects(:getpid).returns nil
194
+ provider.status.should == :stopped
177
195
  end
178
196
  end
179
197
  end
180
198
 
181
199
  describe "when restarting and hasrestart is not :true" do
200
+ before :each do
201
+ resource[:hasrestart] = :false
202
+ end
203
+
182
204
  it "should stop and restart the process" do
183
- @provider.expects(:texecute).with(:stop, ['/service/path/myservice', :stop ], true).returns("")
184
- @provider.expects(:texecute).with(:start,['/service/path/myservice', :start], true).returns("")
205
+ provider.expects(:texecute).with(:stop, ['/service/path/myservice', :stop ], true).returns("")
206
+ provider.expects(:texecute).with(:start,['/service/path/myservice', :start], true).returns("")
185
207
  $CHILD_STATUS.stubs(:exitstatus).returns(0)
186
- @provider.restart
208
+ provider.restart
187
209
  end
188
210
  end
189
-
190
211
  end
191
212
  end