puppet 3.1.1 → 3.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -10,6 +10,12 @@ describe Puppet::Type.type(:package).provider(:aptrpm) do
10
10
  it { should be_versionable }
11
11
 
12
12
  context "when retrieving ensure" do
13
+ before(:each) do
14
+ Puppet::Util.stubs(:which).with("rpm").returns("/bin/rpm")
15
+ pkg.provider.stubs(:which).with("rpm").returns("/bin/rpm")
16
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "--version"], {:combine => true, :custom_environment => {}, :failonfail => true}).returns("4.10.1\n").at_most_once
17
+ end
18
+
13
19
  def rpm
14
20
  pkg.provider.expects(:rpm).
15
21
  with('-q', 'faff', '--nosignature', '--nodigest', '--qf',
@@ -29,23 +29,18 @@ describe provider_class do
29
29
  provider.install
30
30
  end
31
31
 
32
- it "should specify that dependencies should be included" do
33
- provider.expects(:execute).with { |args| args[2] == "--include-dependencies" }.returns ""
34
- provider.install
35
- end
36
-
37
32
  it "should specify that documentation should not be included" do
38
- provider.expects(:execute).with { |args| args[3] == "--no-rdoc" }.returns ""
33
+ provider.expects(:execute).with { |args| args[2] == "--no-rdoc" }.returns ""
39
34
  provider.install
40
35
  end
41
36
 
42
37
  it "should specify that RI should not be included" do
43
- provider.expects(:execute).with { |args| args[4] == "--no-ri" }.returns ""
38
+ provider.expects(:execute).with { |args| args[3] == "--no-ri" }.returns ""
44
39
  provider.install
45
40
  end
46
41
 
47
42
  it "should specify the package name" do
48
- provider.expects(:execute).with { |args| args[5] == "myresource" }.returns ""
43
+ provider.expects(:execute).with { |args| args[4] == "myresource" }.returns ""
49
44
  provider.install
50
45
  end
51
46
 
@@ -53,14 +48,14 @@ describe provider_class do
53
48
  describe "as a normal file" do
54
49
  it "should use the file name instead of the gem name" do
55
50
  resource[:source] = "/my/file"
56
- provider.expects(:execute).with { |args| args[3] == "/my/file" }.returns ""
51
+ provider.expects(:execute).with { |args| args[2] == "/my/file" }.returns ""
57
52
  provider.install
58
53
  end
59
54
  end
60
55
  describe "as a file url" do
61
56
  it "should use the file name instead of the gem name" do
62
57
  resource[:source] = "file:///my/file"
63
- provider.expects(:execute).with { |args| args[3] == "/my/file" }.returns ""
58
+ provider.expects(:execute).with { |args| args[2] == "/my/file" }.returns ""
64
59
  provider.install
65
60
  end
66
61
  end
@@ -73,7 +68,7 @@ describe provider_class do
73
68
  describe "as a non-file and non-puppet url" do
74
69
  it "should treat the source as a gem repository" do
75
70
  resource[:source] = "http://host/my/file"
76
- provider.expects(:execute).with { |args| args[3..5] == ["--source", "http://host/my/file", "myresource"] }.returns ""
71
+ provider.expects(:execute).with { |args| args[2..4] == ["--source", "http://host/my/file", "myresource"] }.returns ""
77
72
  provider.install
78
73
  end
79
74
  end
@@ -4,6 +4,7 @@ require 'spec_helper'
4
4
  provider_class = Puppet::Type.type(:package).provider(:nim)
5
5
 
6
6
  describe provider_class do
7
+
7
8
  before(:each) do
8
9
  # Create a mock resource
9
10
  @resource = stub 'resource'
@@ -12,7 +13,7 @@ describe provider_class do
12
13
  @resource.stubs(:[]).returns(nil)
13
14
 
14
15
  # But set name and source
15
- @resource.stubs(:[]).with(:name).returns "mypackage"
16
+ @resource.stubs(:[]).with(:name).returns "mypackage.foo"
16
17
  @resource.stubs(:[]).with(:source).returns "mysource"
17
18
  @resource.stubs(:[]).with(:ensure).returns :installed
18
19
 
@@ -25,17 +26,225 @@ describe provider_class do
25
26
  @provider.should respond_to(:install)
26
27
  end
27
28
 
28
- describe "when installing" do
29
+ let(:bff_showres_output) {
30
+ <<END
31
+ mypackage.foo ALL @@I:mypackage.foo _all_filesets
32
+ @ 1.2.3.1 MyPackage Runtime Environment @@I:mypackage.foo 1.2.3.1
33
+ + 1.2.3.4 MyPackage Runtime Environment @@I:mypackage.foo 1.2.3.4
34
+ + 1.2.3.8 MyPackage Runtime Environment @@I:mypackage.foo 1.2.3.8
35
+
36
+ END
37
+ }
38
+
39
+ let(:rpm_showres_output) {
40
+ <<END
41
+ mypackage.foo ALL @@R:mypackage.foo _all_filesets
42
+ @@R:mypackage.foo-1.2.3-1 1.2.3-1
43
+ @@R:mypackage.foo-1.2.3-4 1.2.3-4
44
+ @@R:mypackage.foo-1.2.3-8 1.2.3-8
45
+
46
+ END
47
+ }
48
+
49
+ context "when installing" do
29
50
  it "should install a package" do
51
+
30
52
  @resource.stubs(:should).with(:ensure).returns(:installed)
31
- @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets='mypackage'")
53
+ Puppet::Util.expects(:execute).with("/usr/sbin/nimclient -o showres -a resource=mysource |/usr/bin/grep -p -E 'mypackage\\.foo'").returns(bff_showres_output)
54
+ @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets=mypackage.foo 1.2.3.8")
32
55
  @provider.install
33
56
  end
34
57
 
35
- it "should install a versioned package" do
36
- @resource.stubs(:should).with(:ensure).returns("1.2.3.4")
37
- @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets='mypackage 1.2.3.4'")
38
- @provider.install
58
+ context "when installing versioned packages" do
59
+
60
+ it "should fail if the package is not available on the lpp source" do
61
+ nimclient_showres_output = ""
62
+
63
+ @resource.stubs(:should).with(:ensure).returns("1.2.3.4")
64
+ Puppet::Util.expects(:execute).with("/usr/sbin/nimclient -o showres -a resource=mysource |/usr/bin/grep -p -E 'mypackage\\.foo( |-)1\\.2\\.3\\.4'").returns(nimclient_showres_output)
65
+ expect {
66
+ @provider.install
67
+ }.to raise_error(Puppet::Error, "Unable to find package 'mypackage.foo' with version '1.2.3.4' on lpp_source 'mysource'")
68
+ end
69
+
70
+ it "should succeed if a BFF/installp package is available on the lpp source" do
71
+ nimclient_sequence = sequence('nimclient')
72
+
73
+ @resource.stubs(:should).with(:ensure).returns("1.2.3.4")
74
+ Puppet::Util.expects(:execute).with("/usr/sbin/nimclient -o showres -a resource=mysource |/usr/bin/grep -p -E 'mypackage\\.foo( |-)1\\.2\\.3\\.4'").returns(bff_showres_output).in_sequence(nimclient_sequence)
75
+ @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets=mypackage.foo 1.2.3.4").in_sequence(nimclient_sequence)
76
+ @provider.install
77
+ end
78
+
79
+ it "should fail if the specified version of a BFF package is superseded" do
80
+ nimclient_sequence = sequence('nimclient')
81
+
82
+ install_output = <<OUTPUT
83
+ +-----------------------------------------------------------------------------+
84
+ Pre-installation Verification...
85
+ +-----------------------------------------------------------------------------+
86
+ Verifying selections...done
87
+ Verifying requisites...done
88
+ Results...
89
+
90
+ WARNINGS
91
+ --------
92
+ Problems described in this section are not likely to be the source of any
93
+ immediate or serious failures, but further actions may be necessary or
94
+ desired.
95
+
96
+ Already Installed
97
+ -----------------
98
+ The number of selected filesets that are either already installed
99
+ or effectively installed through superseding filesets is 1. See
100
+ the summaries at the end of this installation for details.
101
+
102
+ NOTE: Base level filesets may be reinstalled using the "Force"
103
+ option (-F flag), or they may be removed, using the deinstall or
104
+ "Remove Software Products" facility (-u flag), and then reinstalled.
105
+
106
+ << End of Warning Section >>
107
+
108
+ +-----------------------------------------------------------------------------+
109
+ BUILDDATE Verification ...
110
+ +-----------------------------------------------------------------------------+
111
+ Verifying build dates...done
112
+ FILESET STATISTICS
113
+ ------------------
114
+ 1 Selected to be installed, of which:
115
+ 1 Already installed (directly or via superseding filesets)
116
+ ----
117
+ 0 Total to be installed
118
+
119
+
120
+ Pre-installation Failure/Warning Summary
121
+ ----------------------------------------
122
+ Name Level Pre-installation Failure/Warning
123
+ -------------------------------------------------------------------------------
124
+ mypackage.foo 1.2.3.1 Already superseded by 1.2.3.4
125
+ OUTPUT
126
+
127
+ @resource.stubs(:should).with(:ensure).returns("1.2.3.1")
128
+ Puppet::Util.expects(:execute).with("/usr/sbin/nimclient -o showres -a resource=mysource |/usr/bin/grep -p -E 'mypackage\\.foo( |-)1\\.2\\.3\\.1'").returns(bff_showres_output).in_sequence(nimclient_sequence)
129
+ @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets=mypackage.foo 1.2.3.1").in_sequence(nimclient_sequence).returns(install_output)
130
+
131
+ expect { @provider.install }.to raise_error(Puppet::Error, "NIM package provider is unable to downgrade packages")
132
+ end
133
+
134
+
135
+ it "should succeed if an RPM package is available on the lpp source" do
136
+ nimclient_sequence = sequence('nimclient')
137
+
138
+ @resource.stubs(:should).with(:ensure).returns("1.2.3-4")
139
+ Puppet::Util.expects(:execute).with("/usr/sbin/nimclient -o showres -a resource=mysource |/usr/bin/grep -p -E 'mypackage\\.foo( |-)1\\.2\\.3\\-4'").returns(rpm_showres_output).in_sequence(nimclient_sequence)
140
+ @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets=mypackage.foo-1.2.3-4").in_sequence(nimclient_sequence)
141
+ @provider.install
142
+ end
143
+ end
144
+
145
+ it "should fail if the specified version of a RPM package is superseded" do
146
+ nimclient_sequence = sequence('nimclient')
147
+
148
+ install_output = <<OUTPUT
149
+
150
+
151
+ Validating RPM package selections ...
152
+
153
+ Please wait...
154
+ +-----------------------------------------------------------------------------+
155
+ RPM Error Summary:
156
+ +-----------------------------------------------------------------------------+
157
+ The following RPM packages were requested for installation
158
+ but they are already installed or superseded by a package installed
159
+ at a higher level:
160
+ mypackage.foo-1.2.3-1 is superseded by mypackage.foo-1.2.3-4
161
+
162
+
163
+ OUTPUT
164
+
165
+ @resource.stubs(:should).with(:ensure).returns("1.2.3-1")
166
+ Puppet::Util.expects(:execute).with("/usr/sbin/nimclient -o showres -a resource=mysource |/usr/bin/grep -p -E 'mypackage\\.foo( |-)1\\.2\\.3\\-1'").returns(rpm_showres_output).in_sequence(nimclient_sequence)
167
+ @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets=mypackage.foo-1.2.3-1").in_sequence(nimclient_sequence).returns(install_output)
168
+
169
+ expect { @provider.install }.to raise_error(Puppet::Error, "NIM package provider is unable to downgrade packages")
170
+ end
171
+
172
+
173
+
174
+ end
175
+
176
+ context "when uninstalling" do
177
+ it "should call installp to uninstall a bff package" do
178
+ @provider.expects(:lslpp).with("-qLc", "mypackage.foo").returns("#bos.atm:bos.atm.atmle:7.1.2.0: : :C: :ATM LAN Emulation Client Support : : : : : : :0:0:/:1241")
179
+ @provider.expects(:installp).with("-gu", "mypackage.foo")
180
+ @provider.class.expects(:pkglist).with(:pkgname => 'mypackage.foo').returns(nil)
181
+ @provider.uninstall
182
+ end
183
+
184
+ it "should call rpm to uninstall an rpm package" do
185
+ @provider.expects(:lslpp).with("-qLc", "mypackage.foo").returns("cdrecord:cdrecord-1.9-6:1.9-6: : :C:R:A command line CD/DVD recording program.: :/bin/rpm -e cdrecord: : : : :0: :/opt/freeware:Wed Jun 29 09:41:32 PDT 2005")
186
+ @provider.expects(:rpm).with("-e", "mypackage.foo")
187
+ @provider.class.expects(:pkglist).with(:pkgname => 'mypackage.foo').returns(nil)
188
+ @provider.uninstall
189
+ end
190
+
191
+ end
192
+
193
+
194
+ context "when parsing nimclient showres output" do
195
+ describe "#parse_showres_output" do
196
+ it "should be able to parse installp/BFF package listings" do
197
+ packages = subject.send(:parse_showres_output, bff_showres_output)
198
+ Set.new(packages.keys).should == Set.new(['mypackage.foo'])
199
+ versions = packages['mypackage.foo']
200
+ ['1.2.3.1', '1.2.3.4', '1.2.3.8'].each do |version|
201
+ versions.has_key?(version).should == true
202
+ versions[version].should == :installp
203
+ end
204
+ end
205
+
206
+ it "should be able to parse RPM package listings" do
207
+ packages = subject.send(:parse_showres_output, rpm_showres_output)
208
+ Set.new(packages.keys).should == Set.new(['mypackage.foo'])
209
+ versions = packages['mypackage.foo']
210
+ ['1.2.3-1', '1.2.3-4', '1.2.3-8'].each do |version|
211
+ versions.has_key?(version).should == true
212
+ versions[version].should == :rpm
213
+ end
214
+ end
215
+ end
216
+
217
+ describe "#determine_latest_version" do
218
+ context "when there are multiple versions" do
219
+ it "should return the latest version" do
220
+ subject.send(:determine_latest_version, rpm_showres_output, 'mypackage.foo').should == [:rpm, '1.2.3-8']
221
+ end
222
+ end
223
+
224
+ context "when there is only one version" do
225
+ it "should return the type specifier and `nil` for the version number" do
226
+ nimclient_showres_output = <<END
227
+ mypackage.foo ALL @@R:mypackage.foo _all_filesets
228
+ @@R:mypackage.foo-1.2.3-4 1.2.3-4
229
+
230
+ END
231
+ subject.send(:determine_latest_version, nimclient_showres_output, 'mypackage.foo').should == [:rpm, nil]
232
+ end
233
+ end
234
+
235
+ end
236
+
237
+ describe "#determine_package_type" do
238
+ it "should return :rpm for rpm packages" do
239
+ subject.send(:determine_package_type, rpm_showres_output, 'mypackage.foo', '1.2.3-4').should == :rpm
240
+ end
241
+
242
+ it "should return :installp for installp/bff packages" do
243
+ subject.send(:determine_package_type, bff_showres_output, 'mypackage.foo', '1.2.3.4').should == :installp
244
+ end
39
245
  end
40
246
  end
247
+
248
+
249
+
41
250
  end
@@ -0,0 +1,180 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+
4
+ describe Puppet::Type.type(:package).provider(:opkg) do
5
+
6
+ let(:resource) do
7
+ Puppet::Type.type(:package).new(:name => 'package')
8
+ end
9
+
10
+ let(:provider) { described_class.new(resource) }
11
+
12
+ before do
13
+ Puppet::Util::Execution.stubs(:execute).never
14
+ Puppet::Util.stubs(:which).with("opkg").returns("/bin/opkg")
15
+ Dir.stubs(:entries).with('/var/opkg-lists/').returns ['.', '..', 'packages']
16
+ end
17
+
18
+ describe "when installing" do
19
+ before do
20
+ provider.stubs(:query).returns({ :ensure => '1.0' })
21
+ end
22
+
23
+ context "when the package list is absent" do
24
+ before do
25
+ Dir.stubs(:entries).with('/var/opkg-lists/').returns ['.', '..'] #empty, no package list
26
+ end
27
+
28
+ it "fetches the package list when installing" do
29
+ provider.expects(:opkg).with('update')
30
+ provider.expects(:opkg).with("--force-overwrite", "install", resource[:name])
31
+
32
+ provider.install
33
+ end
34
+ end
35
+
36
+ context "when the package list is present" do
37
+ before do
38
+ Dir.stubs(:entries).with('/var/opkg-lists/').returns ['.', '..', 'lists'] # With a pre-downloaded package list
39
+ end
40
+
41
+ it "fetches the package list when installing" do
42
+ provider.expects(:opkg).with('update').never
43
+ provider.expects(:opkg).with("--force-overwrite", "install", resource[:name])
44
+
45
+ provider.install
46
+ end
47
+ end
48
+
49
+ it "should call opkg install" do
50
+ Puppet::Util::Execution.expects(:execute).with(["/bin/opkg", "--force-overwrite", "install", resource[:name]], {:failonfail => true, :combine => true, :custom_environment => {}})
51
+ provider.install
52
+ end
53
+
54
+ context "when :source is specified" do
55
+ context "works on valid urls" do
56
+ %w{
57
+ /some/package/file
58
+ http://some.package.in/the/air
59
+ ftp://some.package.in/the/air
60
+ }.each do |source|
61
+ it "should install #{source} directly" do
62
+ resource[:source] = source
63
+ Puppet::Util::Execution.expects(:execute).with(["/bin/opkg", "--force-overwrite", "install", resource[:source]], {:failonfail => true, :combine => true, :custom_environment => {}})
64
+ provider.install
65
+ end
66
+ end
67
+ end
68
+
69
+ context "as a file:// URL" do
70
+ before do
71
+ @package_file = "file:///some/package/file"
72
+ @actual_file_path = "/some/package/file"
73
+ resource[:source] = @package_file
74
+ end
75
+
76
+ it "should install from the path segment of the URL" do
77
+ Puppet::Util::Execution.expects(:execute).returns("")
78
+ provider.install
79
+ end
80
+ end
81
+
82
+ context "with invalid URL for opkg" do
83
+ before do
84
+ # Emulate the `opkg` command returning a non-zero exit value
85
+ Puppet::Util::Execution.stubs(:execute).raises Puppet::ExecutionFailure
86
+ end
87
+
88
+ context "puppet://server/whatever" do
89
+ before do
90
+ resource[:source] = "puppet://server/whatever"
91
+ end
92
+
93
+ it "should fail" do
94
+ expect { provider.install }.to raise_error, Puppet::ExecutionFailure
95
+ end
96
+ end
97
+
98
+ context "as a malformed URL" do
99
+ before do
100
+ resource[:source] = "blah://"
101
+ end
102
+
103
+ it "should fail" do
104
+ expect { provider.install }.to raise_error, Puppet::ExecutionFailure
105
+ end
106
+ end
107
+ end
108
+ end # end when source is specified
109
+ end # end when installing
110
+
111
+ describe "when updating" do
112
+ it "should call install" do
113
+ provider.expects(:install).returns("install return value")
114
+ provider.update.should == "install return value"
115
+ end
116
+ end
117
+
118
+ describe "when uninstalling" do
119
+ it "should run opkg remove bla" do
120
+ Puppet::Util::Execution.expects(:execute).with(["/bin/opkg", "remove", resource[:name]], {:failonfail => true, :combine => true, :custom_environment => {}})
121
+ provider.uninstall
122
+ end
123
+ end
124
+
125
+ describe "when querying" do
126
+
127
+ describe "self.instances" do
128
+ let (:packages) do
129
+ <<-OPKG_OUTPUT
130
+ dropbear - 2011.54-2
131
+ kernel - 3.3.8-1-ba5cdb2523b4fc7722698b4a7ece6702
132
+ uhttpd - 2012-10-30-e57bf6d8bfa465a50eea2c30269acdfe751a46fd
133
+ OPKG_OUTPUT
134
+ end
135
+ it "returns an array of packages" do
136
+ Puppet::Util.stubs(:which).with("opkg").returns("/bin/opkg")
137
+ described_class.stubs(:which).with("opkg").returns("/bin/opkg")
138
+ described_class.expects(:execpipe).with("/bin/opkg list-installed").yields(packages)
139
+
140
+ installed_packages = described_class.instances
141
+ installed_packages.length.should == 3
142
+
143
+ installed_packages[0].properties.should ==
144
+ {
145
+ :provider => :opkg,
146
+ :name => "dropbear",
147
+ :ensure => "2011.54-2"
148
+ }
149
+ installed_packages[1].properties.should ==
150
+ {
151
+ :provider => :opkg,
152
+ :name => "kernel",
153
+ :ensure => "3.3.8-1-ba5cdb2523b4fc7722698b4a7ece6702"
154
+ }
155
+ installed_packages[2].properties.should ==
156
+ {
157
+ :provider => :opkg,
158
+ :name => "uhttpd",
159
+ :ensure => "2012-10-30-e57bf6d8bfa465a50eea2c30269acdfe751a46fd"
160
+ }
161
+ end
162
+ end
163
+
164
+ it "should return a nil if the package isn't found" do
165
+ Puppet::Util::Execution.expects(:execute).returns("")
166
+ provider.query.should be_nil
167
+ end
168
+
169
+ it "should return a hash indicating that the package is missing on error" do
170
+ Puppet::Util::Execution.expects(:execute).raises(Puppet::ExecutionFailure.new("ERROR!"))
171
+ provider.query.should == {
172
+ :ensure => :purged,
173
+ :status => 'missing',
174
+ :name => resource[:name],
175
+ :error => 'ok',
176
+ }
177
+ end
178
+ end #end when querying
179
+
180
+ end # end describe provider