puppet 0.24.6 → 0.24.7

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 (383) hide show
  1. data/CHANGELOG +115 -0
  2. data/Rakefile +43 -14
  3. data/bin/puppetca +6 -5
  4. data/bin/puppetdoc +109 -15
  5. data/bin/ralsh +3 -1
  6. data/conf/redhat/puppet.spec +74 -48
  7. data/examples/mcx_dock_absent.pp +4 -0
  8. data/examples/mcx_dock_default.pp +118 -0
  9. data/examples/mcx_dock_full.pp +125 -0
  10. data/examples/mcx_dock_invalid.pp +9 -0
  11. data/examples/mcx_nogroup.pp +118 -0
  12. data/examples/mcx_notexists_absent.pp +4 -0
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/lib/puppet.rb +1 -1
  15. data/lib/puppet/external/nagios/base.rb +114 -71
  16. data/lib/puppet/feature/base.rb +6 -0
  17. data/lib/puppet/indirector/yaml.rb +12 -3
  18. data/lib/puppet/module.rb +1 -1
  19. data/lib/puppet/network/client/master.rb +1 -1
  20. data/lib/puppet/network/xmlrpc/client.rb +3 -1
  21. data/lib/puppet/parameter.rb +1 -1
  22. data/lib/puppet/parser/ast.rb +15 -0
  23. data/lib/puppet/parser/ast/astarray.rb +1 -2
  24. data/lib/puppet/parser/ast/casestatement.rb +2 -0
  25. data/lib/puppet/parser/ast/collection.rb +2 -0
  26. data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
  27. data/lib/puppet/parser/ast/definition.rb +2 -0
  28. data/lib/puppet/parser/ast/else.rb +3 -0
  29. data/lib/puppet/parser/ast/function.rb +19 -12
  30. data/lib/puppet/parser/ast/hostclass.rb +9 -1
  31. data/lib/puppet/parser/ast/ifstatement.rb +3 -0
  32. data/lib/puppet/parser/ast/node.rb +3 -0
  33. data/lib/puppet/parser/ast/resource.rb +3 -0
  34. data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
  35. data/lib/puppet/parser/ast/resource_override.rb +3 -0
  36. data/lib/puppet/parser/ast/vardef.rb +3 -0
  37. data/lib/puppet/parser/functions.rb +14 -0
  38. data/lib/puppet/parser/functions/inline_template.rb +21 -0
  39. data/lib/puppet/parser/functions/template.rb +3 -2
  40. data/lib/puppet/parser/lexer.rb +56 -7
  41. data/lib/puppet/parser/parser.rb +114 -98
  42. data/lib/puppet/parser/parser_support.rb +24 -4
  43. data/lib/puppet/parser/resource/reference.rb +4 -3
  44. data/lib/puppet/parser/templatewrapper.rb +30 -22
  45. data/lib/puppet/property.rb +1 -1
  46. data/lib/puppet/property/list.rb +7 -2
  47. data/lib/puppet/property/ordered_list.rb +22 -0
  48. data/lib/puppet/provider/augeas/augeas.rb +189 -0
  49. data/lib/puppet/provider/computer/computer.rb +22 -0
  50. data/lib/puppet/provider/confine.rb +4 -1
  51. data/lib/puppet/provider/confine/variable.rb +13 -2
  52. data/lib/puppet/provider/confine_collection.rb +4 -1
  53. data/lib/puppet/provider/confiner.rb +1 -1
  54. data/lib/puppet/provider/group/directoryservice.rb +6 -3
  55. data/lib/puppet/provider/group/groupadd.rb +5 -2
  56. data/lib/puppet/provider/group/ldap.rb +11 -9
  57. data/lib/puppet/provider/group/netinfo.rb +8 -4
  58. data/lib/puppet/provider/group/pw.rb +5 -1
  59. data/lib/puppet/provider/host/netinfo.rb +5 -2
  60. data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
  61. data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
  62. data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
  63. data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
  64. data/lib/puppet/provider/package/appdmg.rb +0 -3
  65. data/lib/puppet/provider/package/apt.rb +6 -0
  66. data/lib/puppet/provider/package/rpm.rb +2 -0
  67. data/lib/puppet/provider/package/yum.rb +5 -1
  68. data/lib/puppet/provider/package/yumhelper.py +9 -0
  69. data/lib/puppet/provider/service/base.rb +9 -6
  70. data/lib/puppet/provider/service/daemontools.rb +25 -15
  71. data/lib/puppet/provider/service/debian.rb +6 -2
  72. data/lib/puppet/provider/service/freebsd.rb +5 -2
  73. data/lib/puppet/provider/service/gentoo.rb +6 -3
  74. data/lib/puppet/provider/service/init.rb +31 -21
  75. data/lib/puppet/provider/service/launchd.rb +195 -0
  76. data/lib/puppet/provider/service/redhat.rb +5 -2
  77. data/lib/puppet/provider/service/runit.rb +30 -20
  78. data/lib/puppet/provider/service/smf.rb +7 -4
  79. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
  80. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  81. data/lib/puppet/provider/user/netinfo.rb +9 -3
  82. data/lib/puppet/provider/user/user_role_add.rb +43 -6
  83. data/lib/puppet/provider/zfs/solaris.rb +45 -0
  84. data/lib/puppet/provider/zone/solaris.rb +8 -4
  85. data/lib/puppet/provider/zpool/solaris.rb +116 -0
  86. data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
  87. data/lib/puppet/rails/database/schema.rb +1 -0
  88. data/lib/puppet/rails/host.rb +4 -0
  89. data/lib/puppet/reference/configuration.rb +1 -1
  90. data/lib/puppet/reports/tagmail.rb +15 -6
  91. data/lib/puppet/transaction/change.rb +3 -5
  92. data/lib/puppet/transportable.rb +1 -0
  93. data/lib/puppet/type/augeas.rb +155 -0
  94. data/lib/puppet/type/computer.rb +62 -0
  95. data/lib/puppet/type/exec.rb +2 -1
  96. data/lib/puppet/type/file.rb +1 -1
  97. data/lib/puppet/type/file/ensure.rb +8 -5
  98. data/lib/puppet/type/file/mode.rb +0 -14
  99. data/lib/puppet/type/file/owner.rb +32 -64
  100. data/lib/puppet/type/file/selcontext.rb +3 -8
  101. data/lib/puppet/type/group.rb +27 -45
  102. data/lib/puppet/type/k5login.rb +1 -1
  103. data/lib/puppet/type/macauthorization.rb +141 -0
  104. data/lib/puppet/type/mcx.rb +115 -0
  105. data/lib/puppet/type/mount.rb +1 -1
  106. data/lib/puppet/type/nagios_hostdependency.rb +3 -0
  107. data/lib/puppet/type/ssh_authorized_key.rb +16 -0
  108. data/lib/puppet/type/tidy.rb +43 -14
  109. data/lib/puppet/type/user.rb +25 -1
  110. data/lib/puppet/type/zfs.rb +51 -0
  111. data/lib/puppet/type/zone.rb +8 -0
  112. data/lib/puppet/type/zpool.rb +93 -0
  113. data/lib/puppet/util.rb +17 -38
  114. data/lib/puppet/util/file_locking.rb +44 -0
  115. data/lib/puppet/util/filetype.rb +3 -3
  116. data/lib/puppet/util/log.rb +1 -16
  117. data/lib/puppet/util/metric.rb +0 -5
  118. data/lib/puppet/util/rdoc.rb +85 -0
  119. data/lib/puppet/util/rdoc/code_objects.rb +219 -0
  120. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
  121. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
  122. data/lib/puppet/util/rdoc/parser.rb +437 -0
  123. data/lib/puppet/util/selinux.rb +135 -63
  124. data/lib/puppet/util/settings.rb +136 -126
  125. data/lib/puppet/util/storage.rb +4 -2
  126. data/spec/Rakefile +91 -0
  127. data/spec/integration/checksum.rb +47 -0
  128. data/spec/integration/defaults.rb +47 -0
  129. data/spec/integration/file_serving/configuration.rb +43 -0
  130. data/spec/integration/file_serving/content.rb +18 -0
  131. data/spec/integration/file_serving/metadata.rb +18 -0
  132. data/spec/integration/indirector/direct_file_server.rb +80 -0
  133. data/spec/integration/indirector/file_content/file_server.rb +18 -0
  134. data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
  135. data/spec/integration/indirector/module_files.rb +57 -0
  136. data/spec/integration/indirector/node/ldap.rb +15 -0
  137. data/spec/integration/indirector/rest.rb +464 -0
  138. data/spec/integration/network/server/mongrel.rb +48 -0
  139. data/spec/integration/network/server/webrick.rb +48 -0
  140. data/spec/integration/node.rb +93 -0
  141. data/spec/integration/node/catalog.rb +54 -0
  142. data/spec/integration/node/facts.rb +45 -0
  143. data/spec/integration/provider/package.rb +26 -0
  144. data/spec/integration/provider/service/init.rb +32 -0
  145. data/spec/integration/reference/providers.rb +17 -0
  146. data/spec/integration/reports.rb +14 -0
  147. data/spec/integration/transaction/report.rb +26 -0
  148. data/spec/integration/type/package.rb +22 -0
  149. data/spec/integration/util/file_locking.rb +36 -0
  150. data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
  151. data/spec/monkey_patches/alias_should_to_must.rb +5 -0
  152. data/spec/shared_behaviours/file_server_terminus.rb +42 -0
  153. data/spec/shared_behaviours/file_serving.rb +64 -0
  154. data/spec/shared_behaviours/memory_terminus.rb +32 -0
  155. data/spec/spec.opts +5 -0
  156. data/spec/spec_helper.rb +36 -0
  157. data/spec/unit/executables/client/certhandler.rb +122 -0
  158. data/spec/unit/file_serving/configuration.rb +224 -0
  159. data/spec/unit/file_serving/configuration/parser.rb +135 -0
  160. data/spec/unit/file_serving/content.rb +71 -0
  161. data/spec/unit/file_serving/file_base.rb +124 -0
  162. data/spec/unit/file_serving/fileset.rb +239 -0
  163. data/spec/unit/file_serving/indirection_hooks.rb +124 -0
  164. data/spec/unit/file_serving/metadata.rb +187 -0
  165. data/spec/unit/file_serving/mount.rb +143 -0
  166. data/spec/unit/file_serving/terminus_helper.rb +76 -0
  167. data/spec/unit/indirector.rb +152 -0
  168. data/spec/unit/indirector/catalog/compiler.rb +156 -0
  169. data/spec/unit/indirector/catalog/yaml.rb +25 -0
  170. data/spec/unit/indirector/checksum/file.rb +139 -0
  171. data/spec/unit/indirector/code.rb +33 -0
  172. data/spec/unit/indirector/direct_file_server.rb +89 -0
  173. data/spec/unit/indirector/envelope.rb +47 -0
  174. data/spec/unit/indirector/exec.rb +51 -0
  175. data/spec/unit/indirector/facts/facter.rb +76 -0
  176. data/spec/unit/indirector/facts/yaml.rb +26 -0
  177. data/spec/unit/indirector/file.rb +154 -0
  178. data/spec/unit/indirector/file_content/file.rb +18 -0
  179. data/spec/unit/indirector/file_content/file_server.rb +18 -0
  180. data/spec/unit/indirector/file_content/modules.rb +18 -0
  181. data/spec/unit/indirector/file_content/rest.rb +11 -0
  182. data/spec/unit/indirector/file_metadata/file.rb +52 -0
  183. data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
  184. data/spec/unit/indirector/file_metadata/modules.rb +42 -0
  185. data/spec/unit/indirector/file_metadata/rest.rb +9 -0
  186. data/spec/unit/indirector/file_server.rb +184 -0
  187. data/spec/unit/indirector/indirection.rb +731 -0
  188. data/spec/unit/indirector/ldap.rb +143 -0
  189. data/spec/unit/indirector/memory.rb +29 -0
  190. data/spec/unit/indirector/module_files.rb +259 -0
  191. data/spec/unit/indirector/node/exec.rb +69 -0
  192. data/spec/unit/indirector/node/ldap.rb +424 -0
  193. data/spec/unit/indirector/node/memory.rb +19 -0
  194. data/spec/unit/indirector/node/plain.rb +19 -0
  195. data/spec/unit/indirector/node/rest.rb +13 -0
  196. data/spec/unit/indirector/node/yaml.rb +25 -0
  197. data/spec/unit/indirector/plain.rb +29 -0
  198. data/spec/unit/indirector/report/processor.rb +81 -0
  199. data/spec/unit/indirector/request.rb +87 -0
  200. data/spec/unit/indirector/rest.rb +372 -0
  201. data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
  202. data/spec/unit/indirector/terminus.rb +245 -0
  203. data/spec/unit/indirector/yaml.rb +145 -0
  204. data/spec/unit/module.rb +247 -0
  205. data/spec/unit/network/client.rb +45 -0
  206. data/spec/unit/network/client/master.rb +442 -0
  207. data/spec/unit/network/handler/fileserver.rb +179 -0
  208. data/spec/unit/network/http.rb +35 -0
  209. data/spec/unit/network/http/mongrel.rb +117 -0
  210. data/spec/unit/network/http/mongrel/rest.rb +377 -0
  211. data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
  212. data/spec/unit/network/http/webrick.rb +127 -0
  213. data/spec/unit/network/http/webrick/rest.rb +323 -0
  214. data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
  215. data/spec/unit/network/http_pool.rb +238 -0
  216. data/spec/unit/network/server.rb +316 -0
  217. data/spec/unit/network/xmlrpc/client.rb +13 -0
  218. data/spec/unit/node.rb +167 -0
  219. data/spec/unit/node/catalog.rb +864 -0
  220. data/spec/unit/node/environment.rb +37 -0
  221. data/spec/unit/node/facts.rb +44 -0
  222. data/spec/unit/other/checksum.rb +92 -0
  223. data/spec/unit/other/pgraph.rb +210 -0
  224. data/spec/unit/other/transaction.rb +33 -0
  225. data/spec/unit/other/transbucket.rb +172 -0
  226. data/spec/unit/other/transobject.rb +92 -0
  227. data/spec/unit/parameter.rb +24 -0
  228. data/spec/unit/parser/ast.rb +37 -0
  229. data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
  230. data/spec/unit/parser/ast/astarray.rb +66 -0
  231. data/spec/unit/parser/ast/boolean_operator.rb +53 -0
  232. data/spec/unit/parser/ast/collexpr.rb +92 -0
  233. data/spec/unit/parser/ast/comparison_operator.rb +92 -0
  234. data/spec/unit/parser/ast/definition.rb +195 -0
  235. data/spec/unit/parser/ast/function.rb +77 -0
  236. data/spec/unit/parser/ast/hostclass.rb +148 -0
  237. data/spec/unit/parser/ast/minus.rb +36 -0
  238. data/spec/unit/parser/ast/node.rb +125 -0
  239. data/spec/unit/parser/ast/nop.rb +20 -0
  240. data/spec/unit/parser/ast/not.rb +30 -0
  241. data/spec/unit/parser/ast/resource_override.rb +51 -0
  242. data/spec/unit/parser/ast/resource_reference.rb +63 -0
  243. data/spec/unit/parser/ast/vardef.rb +47 -0
  244. data/spec/unit/parser/collector.rb +426 -0
  245. data/spec/unit/parser/compiler.rb +561 -0
  246. data/spec/unit/parser/functions.rb +83 -0
  247. data/spec/unit/parser/functions/inline_template.rb +59 -0
  248. data/spec/unit/parser/functions/template.rb +62 -0
  249. data/spec/unit/parser/interpreter.rb +138 -0
  250. data/spec/unit/parser/lexer.rb +646 -0
  251. data/spec/unit/parser/parser.rb +228 -0
  252. data/spec/unit/parser/resource.rb +336 -0
  253. data/spec/unit/parser/resource/reference.rb +95 -0
  254. data/spec/unit/parser/scope.rb +87 -0
  255. data/spec/unit/parser/templatewrapper.rb +129 -0
  256. data/spec/unit/property.rb +35 -0
  257. data/spec/unit/property/keyvalue.rb +168 -0
  258. data/spec/unit/property/list.rb +156 -0
  259. data/spec/unit/property/ordered_list.rb +64 -0
  260. data/spec/unit/provider/augeas/augeas.rb +238 -0
  261. data/spec/unit/provider/confine.rb +78 -0
  262. data/spec/unit/provider/confine/exists.rb +81 -0
  263. data/spec/unit/provider/confine/false.rb +53 -0
  264. data/spec/unit/provider/confine/feature.rb +60 -0
  265. data/spec/unit/provider/confine/true.rb +53 -0
  266. data/spec/unit/provider/confine/variable.rb +107 -0
  267. data/spec/unit/provider/confine_collection.rb +134 -0
  268. data/spec/unit/provider/confiner.rb +63 -0
  269. data/spec/unit/provider/group/groupadd.rb +31 -0
  270. data/spec/unit/provider/group/ldap.rb +105 -0
  271. data/spec/unit/provider/ldap.rb +248 -0
  272. data/spec/unit/provider/macauthorization.rb +147 -0
  273. data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
  274. data/spec/unit/provider/mount.rb +130 -0
  275. data/spec/unit/provider/mount/parsed.rb +185 -0
  276. data/spec/unit/provider/package/apt.rb +138 -0
  277. data/spec/unit/provider/package/dpkg.rb +163 -0
  278. data/spec/unit/provider/package/gem.rb +87 -0
  279. data/spec/unit/provider/package/hpux.rb +52 -0
  280. data/spec/unit/provider/selboolean.rb +37 -0
  281. data/spec/unit/provider/selmodule-example.pp +0 -0
  282. data/spec/unit/provider/selmodule.rb +66 -0
  283. data/spec/unit/provider/service/daemontools.rb +124 -0
  284. data/spec/unit/provider/service/launchd.rb +134 -0
  285. data/spec/unit/provider/service/runit.rb +117 -0
  286. data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
  287. data/spec/unit/provider/user/hpux.rb +25 -0
  288. data/spec/unit/provider/user/ldap.rb +279 -0
  289. data/spec/unit/provider/user/user_role_add.rb +249 -0
  290. data/spec/unit/provider/user/useradd.rb +115 -0
  291. data/spec/unit/provider/zfs/solaris.rb +87 -0
  292. data/spec/unit/provider/zone/solaris.rb +42 -0
  293. data/spec/unit/provider/zpool/solaris.rb +179 -0
  294. data/spec/unit/rails.rb +125 -0
  295. data/spec/unit/relationship.rb +149 -0
  296. data/spec/unit/reports.rb +61 -0
  297. data/spec/unit/resource_reference.rb +73 -0
  298. data/spec/unit/simple_graph.rb +280 -0
  299. data/spec/unit/transaction/change.rb +187 -0
  300. data/spec/unit/transaction/event.rb +25 -0
  301. data/spec/unit/transaction/report.rb +40 -0
  302. data/spec/unit/type.rb +64 -0
  303. data/spec/unit/type/augeas.rb +113 -0
  304. data/spec/unit/type/computer.rb +82 -0
  305. data/spec/unit/type/exec.rb +91 -0
  306. data/spec/unit/type/file.rb +155 -0
  307. data/spec/unit/type/file/ensure.rb +21 -0
  308. data/spec/unit/type/file/group.rb +118 -0
  309. data/spec/unit/type/file/owner.rb +132 -0
  310. data/spec/unit/type/file/selinux.rb +82 -0
  311. data/spec/unit/type/group.rb +40 -0
  312. data/spec/unit/type/macauthorization.rb +78 -0
  313. data/spec/unit/type/mcx.rb +108 -0
  314. data/spec/unit/type/mount.rb +219 -0
  315. data/spec/unit/type/nagios.rb +63 -0
  316. data/spec/unit/type/noop_metaparam.rb +38 -0
  317. data/spec/unit/type/package.rb +246 -0
  318. data/spec/unit/type/resources.rb +27 -0
  319. data/spec/unit/type/schedule.rb +339 -0
  320. data/spec/unit/type/selboolean.rb +47 -0
  321. data/spec/unit/type/selmodule.rb +18 -0
  322. data/spec/unit/type/service.rb +254 -0
  323. data/spec/unit/type/ssh_authorized_key.rb +106 -0
  324. data/spec/unit/type/tidy.rb +68 -0
  325. data/spec/unit/type/user.rb +260 -0
  326. data/spec/unit/type/zfs.rb +45 -0
  327. data/spec/unit/type/zone.rb +20 -0
  328. data/spec/unit/type/zpool.rb +110 -0
  329. data/spec/unit/util/checksums.rb +99 -0
  330. data/spec/unit/util/constant_inflector.rb +70 -0
  331. data/spec/unit/util/file_locking.rb +115 -0
  332. data/spec/unit/util/ldap/connection.rb +169 -0
  333. data/spec/unit/util/ldap/generator.rb +54 -0
  334. data/spec/unit/util/ldap/manager.rb +654 -0
  335. data/spec/unit/util/loadedfile.rb +65 -0
  336. data/spec/unit/util/log.rb +107 -0
  337. data/spec/unit/util/metric.rb +95 -0
  338. data/spec/unit/util/nagios_maker.rb +128 -0
  339. data/spec/unit/util/posix.rb +256 -0
  340. data/spec/unit/util/resource_template.rb +58 -0
  341. data/spec/unit/util/selinux.rb +219 -0
  342. data/spec/unit/util/settings.rb +847 -0
  343. data/spec/unit/util/storage.rb +248 -0
  344. data/spec/unit/util/tagging.rb +92 -0
  345. data/spec/unit/util/uri_helper.rb +41 -0
  346. data/spec/unit/util/user_attr.rb +47 -0
  347. data/spec/unit/util/warnings.rb +35 -0
  348. data/test/certmgr/support.rb +0 -6
  349. data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
  350. data/test/data/snippets/multilinecomments.pp +6 -0
  351. data/test/data/snippets/multipleclass.pp +9 -0
  352. data/test/language/functions.rb +11 -1
  353. data/test/language/snippets.rb +16 -0
  354. data/test/lib/puppettest/runnable_test.rb +1 -1
  355. data/test/network/handler/fileserver.rb +5 -0
  356. data/test/other/report.rb +0 -4
  357. data/test/ral/type/resources.rb +2 -19
  358. data/test/util/settings.rb +4 -4
  359. data/test/util/storage.rb +0 -24
  360. data/test/util/utiltest.rb +0 -33
  361. metadata +319 -26
  362. data/conf/debian/README.source +0 -2
  363. data/conf/debian/TODO.Debian +0 -1
  364. data/conf/debian/changelog +0 -257
  365. data/conf/debian/compat +0 -1
  366. data/conf/debian/control +0 -45
  367. data/conf/debian/copyright +0 -17
  368. data/conf/debian/docs +0 -1
  369. data/conf/debian/fileserver.conf +0 -12
  370. data/conf/debian/puppet.NEWS +0 -63
  371. data/conf/debian/puppet.conf +0 -8
  372. data/conf/debian/puppet.dirs +0 -7
  373. data/conf/debian/puppet.files +0 -6
  374. data/conf/debian/puppet.init +0 -64
  375. data/conf/debian/puppet.logrotate +0 -11
  376. data/conf/debian/puppet.postinst +0 -9
  377. data/conf/debian/puppet.postrm +0 -21
  378. data/conf/debian/puppet.preinst +0 -25
  379. data/conf/debian/puppetmaster.files +0 -4
  380. data/conf/debian/puppetmaster.init +0 -58
  381. data/conf/debian/rules +0 -115
  382. data/conf/debian/watch +0 -2
  383. data/lib/puppet/type/nagios_hostgroupescalation.rb +0 -3
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-18.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_content/file'
9
+
10
+ describe Puppet::Indirector::FileContent::File do
11
+ it "should be registered with the file_content indirection" do
12
+ Puppet::Indirector::Terminus.terminus_class(:file_content, :file).should equal(Puppet::Indirector::FileContent::File)
13
+ end
14
+
15
+ it "should be a subclass of the DirectFileServer terminus" do
16
+ Puppet::Indirector::FileContent::File.superclass.should equal(Puppet::Indirector::DirectFileServer)
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-18.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_content/file_server'
9
+
10
+ describe Puppet::Indirector::FileContent::FileServer do
11
+ it "should be registered with the file_content indirection" do
12
+ Puppet::Indirector::Terminus.terminus_class(:file_content, :file_server).should equal(Puppet::Indirector::FileContent::FileServer)
13
+ end
14
+
15
+ it "should be a subclass of the FileServer terminus" do
16
+ Puppet::Indirector::FileContent::FileServer.superclass.should equal(Puppet::Indirector::FileServer)
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-18.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_content/modules'
9
+
10
+ describe Puppet::Indirector::FileContent::Modules do
11
+ it "should be registered with the file_content indirection" do
12
+ Puppet::Indirector::Terminus.terminus_class(:file_content, :modules).should equal(Puppet::Indirector::FileContent::Modules)
13
+ end
14
+
15
+ it "should be a subclass of the ModuleFiles terminus" do
16
+ Puppet::Indirector::FileContent::Modules.superclass.should equal(Puppet::Indirector::ModuleFiles)
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../../../spec_helper'
4
+
5
+ require 'puppet/indirector/file_content'
6
+
7
+ describe "Puppet::Indirector::Content::Rest" do
8
+ it "should add the node's cert name to the arguments"
9
+
10
+ it "should set the content type to text/plain"
11
+ end
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-18.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_metadata/file'
9
+
10
+ describe Puppet::Indirector::FileMetadata::File do
11
+ it "should be registered with the file_metadata indirection" do
12
+ Puppet::Indirector::Terminus.terminus_class(:file_metadata, :file).should equal(Puppet::Indirector::FileMetadata::File)
13
+ end
14
+
15
+ it "should be a subclass of the DirectFileServer terminus" do
16
+ Puppet::Indirector::FileMetadata::File.superclass.should equal(Puppet::Indirector::DirectFileServer)
17
+ end
18
+
19
+ describe "when creating the instance for a single found file" do
20
+ before do
21
+ @metadata = Puppet::Indirector::FileMetadata::File.new
22
+ @uri = "file:///my/local"
23
+ @data = mock 'metadata'
24
+ @data.stubs(:collect_attributes)
25
+ FileTest.expects(:exists?).with("/my/local").returns true
26
+
27
+ @request = stub 'request', :key => @uri, :options => {}
28
+ end
29
+
30
+ it "should collect its attributes when a file is found" do
31
+ @data.expects(:collect_attributes)
32
+
33
+ Puppet::FileServing::Metadata.expects(:new).returns(@data)
34
+ @metadata.find(@request).should == @data
35
+ end
36
+ end
37
+
38
+ describe "when searching for multiple files" do
39
+ before do
40
+ @metadata = Puppet::Indirector::FileMetadata::File.new
41
+ @uri = "file:///my/local"
42
+
43
+ @request = stub 'request', :key => @uri, :options => {}
44
+ end
45
+
46
+ it "should collect the attributes of the instances returned" do
47
+ FileTest.expects(:exists?).with("/my/local").returns true
48
+ @metadata.expects(:path2instances).returns( [mock("one", :collect_attributes => nil), mock("two", :collect_attributes => nil)] )
49
+ @metadata.search(@request)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-18.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_metadata/file_server'
9
+
10
+ describe Puppet::Indirector::FileMetadata::FileServer do
11
+ it "should be registered with the file_metadata indirection" do
12
+ Puppet::Indirector::Terminus.terminus_class(:file_metadata, :file_server).should equal(Puppet::Indirector::FileMetadata::FileServer)
13
+ end
14
+
15
+ it "should be a subclass of the FileServer terminus" do
16
+ Puppet::Indirector::FileMetadata::FileServer.superclass.should equal(Puppet::Indirector::FileServer)
17
+ end
18
+ end
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-18.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_metadata/modules'
9
+
10
+ describe Puppet::Indirector::FileMetadata::Modules do
11
+ it "should be registered with the file_metadata indirection" do
12
+ Puppet::Indirector::Terminus.terminus_class(:file_metadata, :modules).should equal(Puppet::Indirector::FileMetadata::Modules)
13
+ end
14
+
15
+ it "should be a subclass of the ModuleFiles terminus" do
16
+ Puppet::Indirector::FileMetadata::Modules.superclass.should equal(Puppet::Indirector::ModuleFiles)
17
+ end
18
+ end
19
+
20
+ describe Puppet::Indirector::FileMetadata::Modules, " when finding metadata" do
21
+ before do
22
+ @finder = Puppet::Indirector::FileMetadata::Modules.new
23
+ @finder.stubs(:environment).returns(nil)
24
+ @module = Puppet::Module.new("mymod", "/path/to")
25
+ @finder.stubs(:find_module).returns(@module)
26
+
27
+ @request = Puppet::Indirector::Request.new(:metadata, :find, "puppetmounts://hostname/modules/mymod/my/file")
28
+ end
29
+
30
+ it "should return nil if the file is not found" do
31
+ FileTest.expects(:exists?).with("/path/to/files/my/file").returns false
32
+ @finder.find(@request).should be_nil
33
+ end
34
+
35
+ it "should retrieve the instance's attributes if the file is found" do
36
+ FileTest.expects(:exists?).with("/path/to/files/my/file").returns true
37
+ instance = mock 'metadta'
38
+ Puppet::FileServing::Metadata.expects(:new).returns instance
39
+ instance.expects :collect_attributes
40
+ @finder.find(@request)
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../../../spec_helper'
4
+
5
+ require 'puppet/indirector/file_metadata'
6
+
7
+ describe "Puppet::Indirector::Metadata::Rest" do
8
+ it "should add the node's cert name to the arguments"
9
+ end
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2007-10-19.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../spec_helper'
7
+
8
+ require 'puppet/indirector/file_server'
9
+ require 'puppet/file_serving/configuration'
10
+
11
+ describe Puppet::Indirector::FileServer do
12
+
13
+ before :each do
14
+ Puppet::Indirector::Terminus.stubs(:register_terminus_class)
15
+ @model = mock 'model'
16
+ @indirection = stub 'indirection', :name => :mystuff, :register_terminus_type => nil, :model => @model
17
+ Puppet::Indirector::Indirection.stubs(:instance).returns(@indirection)
18
+
19
+ @file_server_class = Class.new(Puppet::Indirector::FileServer) do
20
+ def self.to_s
21
+ "Testing::Mytype"
22
+ end
23
+ end
24
+
25
+ @file_server = @file_server_class.new
26
+
27
+ @uri = "puppetmounts://host/my/local/file"
28
+ @configuration = mock 'configuration'
29
+ Puppet::FileServing::Configuration.stubs(:create).returns(@configuration)
30
+
31
+ @request = Puppet::Indirector::Request.new(:myind, :mymethod, @uri)
32
+ end
33
+
34
+ describe Puppet::Indirector::FileServer, " when finding files" do
35
+
36
+ it "should use the path portion of the URI as the file name" do
37
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil)
38
+ @file_server.find(@request)
39
+ end
40
+
41
+ it "should use the FileServing configuration to convert the file name to a fully qualified path" do
42
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil)
43
+ @file_server.find(@request)
44
+ end
45
+
46
+ it "should pass the node name to the FileServing configuration if one is provided" do
47
+ @configuration.expects(:file_path).with("/my/local/file", :node => "testing")
48
+ @request.node = "testing"
49
+ @file_server.find(@request)
50
+ end
51
+
52
+ it "should return nil if no fully qualified path is found" do
53
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns(nil)
54
+ @file_server.find(@request).should be_nil
55
+ end
56
+
57
+ it "should return an instance of the model created with the full path if a file is found" do
58
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/some/file")
59
+ @model.expects(:new).returns(:myinstance)
60
+ @file_server.find(@request).should == :myinstance
61
+ end
62
+ end
63
+
64
+ describe Puppet::Indirector::FileServer, " when returning instances" do
65
+ before :each do
66
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/some/file")
67
+ @instance = mock 'instance'
68
+ end
69
+
70
+ it "should create the instance with the key used to find the instance" do
71
+ @model.expects(:new).with { |key, *options| key == @uri }
72
+ @file_server.find(@request)
73
+ end
74
+
75
+ it "should create the instance with the path at which the instance was found" do
76
+ @model.expects(:new).with { |key, options| options[:path] == "/some/file" }
77
+ @file_server.find(@request)
78
+ end
79
+
80
+ it "should set the provided :links setting on to the instance if one is provided" do
81
+ @model.expects(:new).returns(@instance)
82
+ @instance.expects(:links=).with(:mytest)
83
+ @request.options[:links] = :mytest
84
+ @file_server.find(@request)
85
+ end
86
+
87
+ it "should not set a :links value if no :links parameter is provided" do
88
+ @model.expects(:new).returns(@instance)
89
+ @file_server.find(@request)
90
+ end
91
+ end
92
+
93
+ describe Puppet::Indirector::FileServer, " when checking authorization" do
94
+
95
+ it "should have an authorization hook" do
96
+ @file_server.should respond_to(:authorized?)
97
+ end
98
+
99
+ it "should deny the :destroy method" do
100
+ @request.method = :destroy
101
+ @file_server.authorized?(@request).should be_false
102
+ end
103
+
104
+ it "should deny the :save method" do
105
+ @request.method = :save
106
+ @file_server.authorized?(@request).should be_false
107
+ end
108
+
109
+ describe "and finding file information" do
110
+ before do
111
+ @request.key = "puppetmounts://host/my/file"
112
+ @request.method = :find
113
+ end
114
+
115
+ it "should use the file server configuration to determine authorization" do
116
+ @configuration.expects(:authorized?)
117
+ @file_server.authorized?(@request)
118
+ end
119
+
120
+ it "should pass the file path from the URI to the file server configuration" do
121
+ @configuration.expects(:authorized?).with { |uri, *args| uri == "/my/file" }
122
+ @file_server.authorized?(@request)
123
+ end
124
+
125
+ it "should pass the node name to the file server configuration" do
126
+ @configuration.expects(:authorized?).with { |key, options| options[:node] == "mynode" }
127
+ @request.node = "mynode"
128
+ @file_server.authorized?(@request)
129
+ end
130
+
131
+ it "should pass the IP address to the file server configuration" do
132
+ @configuration.expects(:authorized?).with { |key, options| options[:ipaddress] == "myip" }
133
+ @request.ip = "myip"
134
+ @file_server.authorized?(@request)
135
+ end
136
+
137
+ it "should return false if the file server configuration denies authorization" do
138
+ @configuration.expects(:authorized?).returns(false)
139
+ @file_server.authorized?(@request)
140
+ end
141
+
142
+ it "should return true if the file server configuration approves authorization" do
143
+ @configuration.expects(:authorized?).returns(true)
144
+ @file_server.authorized?(@request)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe Puppet::Indirector::FileServer, " when searching for files" do
150
+
151
+ it "should use the path portion of the URI as the file name" do
152
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil)
153
+ @file_server.search(@request)
154
+ end
155
+
156
+ it "should use the FileServing configuration to convert the file name to a fully qualified path" do
157
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil)
158
+ @file_server.search(@request)
159
+ end
160
+
161
+ it "should pass the node name to the FileServing configuration if one is provided" do
162
+ @configuration.expects(:file_path).with("/my/local/file", :node => "testing")
163
+ @request.node = "testing"
164
+ @file_server.search(@request)
165
+ end
166
+
167
+ it "should return nil if no fully qualified path is found" do
168
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns(nil)
169
+ @file_server.search(@request).should be_nil
170
+ end
171
+
172
+ it "should use :path2instances from the terminus_helper to return instances if a module is found and the file exists" do
173
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/my/file")
174
+ @file_server.expects(:path2instances)
175
+ @file_server.search(@request)
176
+ end
177
+
178
+ it "should pass the request on to :path2instances" do
179
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/my/file")
180
+ @file_server.expects(:path2instances).with(@request, "/my/file")
181
+ @file_server.search(@request)
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,731 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../../spec_helper'
4
+
5
+ require 'puppet/indirector/indirection'
6
+
7
+ describe "Indirection Delegator", :shared => true do
8
+ it "should create a request object with the appropriate method name and all of the passed arguments" do
9
+ request = stub 'request', :node => nil
10
+
11
+ @indirection.expects(:request).with(@method, "mystuff", :one => :two).returns request
12
+
13
+ @terminus.stubs(@method)
14
+
15
+ @indirection.send(@method, "mystuff", :one => :two)
16
+ end
17
+
18
+ it "should let the :select_terminus method choose the terminus using the created request if the :select_terminus method is available" do
19
+ # Define the method, so our respond_to? hook matches.
20
+ class << @indirection
21
+ def select_terminus(request)
22
+ end
23
+ end
24
+
25
+ request = stub 'request', :key => "me", :options => {}
26
+
27
+ @indirection.stubs(:request).returns request
28
+
29
+ @indirection.expects(:select_terminus).with(request).returns :test_terminus
30
+
31
+ @indirection.stubs(:check_authorization)
32
+ @terminus.expects(@method)
33
+
34
+ @indirection.send(@method, "me")
35
+ end
36
+
37
+ it "should choose the terminus returned by the :terminus_class method if no :select_terminus method is available" do
38
+ @indirection.expects(:terminus_class).returns :test_terminus
39
+
40
+ @terminus.expects(@method)
41
+
42
+ @indirection.send(@method, "me")
43
+ end
44
+
45
+ it "should let the appropriate terminus perform the lookup" do
46
+ @terminus.expects(@method).with { |r| r.is_a?(Puppet::Indirector::Request) }
47
+ @indirection.send(@method, "me")
48
+ end
49
+ end
50
+
51
+ describe "Delegation Authorizer", :shared => true do
52
+ before do
53
+ # So the :respond_to? turns out correctly.
54
+ class << @terminus
55
+ def authorized?
56
+ end
57
+ end
58
+ end
59
+
60
+ it "should not check authorization if a node name is not provided" do
61
+ @terminus.expects(:authorized?).never
62
+ @terminus.stubs(@method)
63
+
64
+ # The quotes are necessary here, else it looks like a block.
65
+ @request.stubs(:options).returns({})
66
+ @indirection.send(@method, "/my/key")
67
+ end
68
+
69
+ it "should pass the request to the terminus's authorization method" do
70
+ @terminus.expects(:authorized?).with { |r| r.is_a?(Puppet::Indirector::Request) }.returns(true)
71
+ @terminus.stubs(@method)
72
+
73
+ @indirection.send(@method, "/my/key", :node => "mynode")
74
+ end
75
+
76
+ it "should fail if authorization returns false" do
77
+ @terminus.expects(:authorized?).returns(false)
78
+ @terminus.stubs(@method)
79
+ proc { @indirection.send(@method, "/my/key", :node => "mynode") }.should raise_error(ArgumentError)
80
+ end
81
+
82
+ it "should continue if authorization returns true" do
83
+ @terminus.expects(:authorized?).returns(true)
84
+ @terminus.stubs(@method)
85
+ @indirection.send(@method, "/my/key", :node => "mynode")
86
+ end
87
+ end
88
+
89
+ describe Puppet::Indirector::Indirection do
90
+ describe "when initializing" do
91
+ # (LAK) I've no idea how to test this, really.
92
+ it "should store a reference to itself before it consumes its options" do
93
+ proc { @indirection = Puppet::Indirector::Indirection.new(Object.new, :testingness, :not_valid_option) }.should raise_error
94
+ Puppet::Indirector::Indirection.instance(:testingness).should be_instance_of(Puppet::Indirector::Indirection)
95
+ Puppet::Indirector::Indirection.instance(:testingness).delete
96
+ end
97
+
98
+ it "should keep a reference to the indirecting model" do
99
+ model = mock 'model'
100
+ @indirection = Puppet::Indirector::Indirection.new(model, :myind)
101
+ @indirection.model.should equal(model)
102
+ end
103
+
104
+ it "should set the name" do
105
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :myind)
106
+ @indirection.name.should == :myind
107
+ end
108
+
109
+ it "should require indirections to have unique names" do
110
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
111
+ proc { Puppet::Indirector::Indirection.new(:test) }.should raise_error(ArgumentError)
112
+ end
113
+
114
+ it "should extend itself with any specified module" do
115
+ mod = Module.new
116
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test, :extend => mod)
117
+ @indirection.metaclass.included_modules.should include(mod)
118
+ end
119
+
120
+ after do
121
+ @indirection.delete if defined? @indirection
122
+ end
123
+ end
124
+
125
+ describe "when an instance" do
126
+ before :each do
127
+ @terminus_class = mock 'terminus_class'
128
+ @terminus = mock 'terminus'
129
+ @terminus_class.stubs(:new).returns(@terminus)
130
+ @cache = mock 'cache'
131
+ @cache_class = mock 'cache_class'
132
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :cache_terminus).returns(@cache_class)
133
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :test_terminus).returns(@terminus_class)
134
+
135
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
136
+ @indirection.terminus_class = :test_terminus
137
+
138
+ @instance = stub 'instance', :expiration => nil, :expiration= => nil, :name => "whatever"
139
+ @name = :mything
140
+
141
+ #@request = stub 'instance', :key => "/my/key", :instance => @instance, :options => {}
142
+ @request = mock 'instance'
143
+ end
144
+
145
+ it "should allow setting the ttl" do
146
+ @indirection.ttl = 300
147
+ @indirection.ttl.should == 300
148
+ end
149
+
150
+ it "should default to the :runinterval setting, converted to an integer, for its ttl" do
151
+ Puppet.settings.expects(:value).returns "1800"
152
+ @indirection.ttl.should == 1800
153
+ end
154
+
155
+ it "should calculate the current expiration by adding the TTL to the current time" do
156
+ @indirection.stubs(:ttl).returns(100)
157
+ now = Time.now
158
+ Time.stubs(:now).returns now
159
+ @indirection.expiration.should == (Time.now + 100)
160
+ end
161
+
162
+ it "should have a method for creating an indirection request instance" do
163
+ @indirection.should respond_to(:request)
164
+ end
165
+
166
+ describe "creates a request" do
167
+ it "should create it with its name as the request's indirection name" do
168
+ Puppet::Indirector::Request.expects(:new).with { |name, *other| @indirection.name == name }
169
+ @indirection.request(:funtest, "yayness")
170
+ end
171
+
172
+ it "should require a method and key" do
173
+ Puppet::Indirector::Request.expects(:new).with { |name, method, key, *other| method == :funtest and key == "yayness" }
174
+ @indirection.request(:funtest, "yayness")
175
+ end
176
+
177
+ it "should support optional arguments" do
178
+ Puppet::Indirector::Request.expects(:new).with { |name, method, key, other| other == {:one => :two} }
179
+ @indirection.request(:funtest, "yayness", :one => :two)
180
+ end
181
+
182
+ it "should default to the arguments being nil" do
183
+ Puppet::Indirector::Request.expects(:new).with { |name, method, key, args| args.nil? }
184
+ @indirection.request(:funtest, "yayness")
185
+ end
186
+
187
+ it "should return the request" do
188
+ request = mock 'request'
189
+ Puppet::Indirector::Request.expects(:new).returns request
190
+ @indirection.request(:funtest, "yayness").should equal(request)
191
+ end
192
+ end
193
+
194
+ describe "and looking for a model instance" do
195
+ before { @method = :find }
196
+
197
+ it_should_behave_like "Indirection Delegator"
198
+ it_should_behave_like "Delegation Authorizer"
199
+
200
+ it "should return the results of the delegation" do
201
+ @terminus.expects(:find).returns(@instance)
202
+ @indirection.find("me").should equal(@instance)
203
+ end
204
+
205
+ it "should set the expiration date on any instances without one set" do
206
+ @terminus.stubs(:find).returns(@instance)
207
+
208
+ @indirection.expects(:expiration).returns :yay
209
+
210
+ @instance.expects(:expiration).returns(nil)
211
+ @instance.expects(:expiration=).with(:yay)
212
+
213
+ @indirection.find("/my/key")
214
+ end
215
+
216
+ it "should not override an already-set expiration date on returned instances" do
217
+ @terminus.stubs(:find).returns(@instance)
218
+
219
+ @indirection.expects(:expiration).never
220
+
221
+ @instance.expects(:expiration).returns(:yay)
222
+ @instance.expects(:expiration=).never
223
+
224
+ @indirection.find("/my/key")
225
+ end
226
+
227
+ describe "when caching is enabled" do
228
+ before do
229
+ @indirection.cache_class = :cache_terminus
230
+ @cache_class.expects(:new).returns(@cache)
231
+
232
+ @instance.stubs(:expired?).returns false
233
+ end
234
+
235
+ it "should first look in the cache for an instance" do
236
+ @terminus.stubs(:find).never
237
+ @cache.expects(:find).returns @instance
238
+
239
+ @indirection.find("/my/key")
240
+ end
241
+
242
+ it "should use a request to look in the cache for cached objects" do
243
+ @cache.expects(:find).with { |r| r.method == :find and r.key == "/my/key" }.returns @instance
244
+
245
+ @cache.stubs(:save)
246
+
247
+ @indirection.find("/my/key")
248
+ end
249
+
250
+ it "should return the cached object if it is not expired" do
251
+ @instance.stubs(:expired?).returns false
252
+
253
+ @cache.stubs(:find).returns @instance
254
+ @indirection.find("/my/key").should equal(@instance)
255
+ end
256
+
257
+ it "should send a debug log if it is using the cached object" do
258
+ Puppet.expects(:debug)
259
+ @cache.stubs(:find).returns @instance
260
+
261
+ @indirection.find("/my/key")
262
+ end
263
+
264
+ it "should not return the cached object if it is expired" do
265
+ @instance.stubs(:expired?).returns true
266
+
267
+ @cache.stubs(:find).returns @instance
268
+ @terminus.stubs(:find).returns nil
269
+ @indirection.find("/my/key").should be_nil
270
+ end
271
+
272
+ it "should send an info log if it is using the cached object" do
273
+ Puppet.expects(:info)
274
+ @instance.stubs(:expired?).returns true
275
+
276
+ @cache.stubs(:find).returns @instance
277
+ @terminus.stubs(:find).returns nil
278
+ @indirection.find("/my/key")
279
+ end
280
+
281
+ it "should cache any objects not retrieved from the cache" do
282
+ @cache.expects(:find).returns nil
283
+
284
+ @terminus.expects(:find).returns(@instance)
285
+ @cache.expects(:save)
286
+
287
+ @indirection.find("/my/key")
288
+ end
289
+
290
+ it "should use a request to look in the cache for cached objects" do
291
+ @cache.expects(:find).with { |r| r.method == :find and r.key == "/my/key" }.returns nil
292
+
293
+ @terminus.stubs(:find).returns(@instance)
294
+ @cache.stubs(:save)
295
+
296
+ @indirection.find("/my/key")
297
+ end
298
+
299
+ it "should cache the instance using a request with the instance set to the cached object" do
300
+ @cache.stubs(:find).returns nil
301
+
302
+ @terminus.stubs(:find).returns(@instance)
303
+
304
+ @cache.expects(:save).with { |r| r.method == :save and r.instance == @instance }
305
+
306
+ @indirection.find("/my/key")
307
+ end
308
+
309
+ it "should send an info log that the object is being cached" do
310
+ @cache.stubs(:find).returns nil
311
+
312
+ @terminus.stubs(:find).returns(@instance)
313
+ @cache.stubs(:save)
314
+
315
+ Puppet.expects(:info)
316
+
317
+ @indirection.find("/my/key")
318
+ end
319
+ end
320
+ end
321
+
322
+ describe "and storing a model instance" do
323
+ before { @method = :save }
324
+
325
+ it_should_behave_like "Indirection Delegator"
326
+ it_should_behave_like "Delegation Authorizer"
327
+
328
+ it "should return nil" do
329
+ @terminus.stubs(:save)
330
+ @indirection.save(@instance).should be_nil
331
+ end
332
+
333
+ describe "when caching is enabled" do
334
+ before do
335
+ @indirection.cache_class = :cache_terminus
336
+ @cache_class.expects(:new).returns(@cache)
337
+
338
+ @instance.stubs(:expired?).returns false
339
+ end
340
+
341
+ it "should use a request to save the object to the cache" do
342
+ request = stub 'request', :instance => @instance, :node => nil
343
+
344
+ @indirection.expects(:request).returns request
345
+
346
+ @cache.expects(:save).with(request)
347
+ @terminus.stubs(:save)
348
+ @indirection.save(@instance)
349
+ end
350
+ end
351
+ end
352
+
353
+ describe "and removing a model instance" do
354
+ before { @method = :destroy }
355
+
356
+ it_should_behave_like "Indirection Delegator"
357
+ it_should_behave_like "Delegation Authorizer"
358
+
359
+ it "should return the result of removing the instance" do
360
+ @terminus.stubs(:destroy).returns "yayness"
361
+ @indirection.destroy("/my/key").should == "yayness"
362
+ end
363
+
364
+ describe "when caching is enabled" do
365
+ before do
366
+ @indirection.cache_class = :cache_terminus
367
+ @cache_class.expects(:new).returns(@cache)
368
+
369
+ @instance.stubs(:expired?).returns false
370
+ end
371
+
372
+ it "should use a request instance to search in and remove objects from the cache" do
373
+ destroy = stub 'destroy_request', :key => "/my/key", :node => nil
374
+ find = stub 'destroy_request', :key => "/my/key", :node => nil
375
+
376
+ @indirection.expects(:request).with(:destroy, "/my/key").returns destroy
377
+ @indirection.expects(:request).with(:find, "/my/key").returns find
378
+
379
+ cached = mock 'cache'
380
+
381
+ @cache.expects(:find).with(find).returns cached
382
+ @cache.expects(:destroy).with(destroy)
383
+
384
+ @terminus.stubs(:destroy)
385
+
386
+ @indirection.destroy("/my/key")
387
+ end
388
+ end
389
+ end
390
+
391
+ describe "and searching for multiple model instances" do
392
+ before { @method = :search }
393
+
394
+ it_should_behave_like "Indirection Delegator"
395
+ it_should_behave_like "Delegation Authorizer"
396
+
397
+ it "should set the expiration date on any instances without one set" do
398
+ @terminus.stubs(:search).returns([@instance])
399
+
400
+ @indirection.expects(:expiration).returns :yay
401
+
402
+ @instance.expects(:expiration).returns(nil)
403
+ @instance.expects(:expiration=).with(:yay)
404
+
405
+ @indirection.search("/my/key")
406
+ end
407
+
408
+ it "should not override an already-set expiration date on returned instances" do
409
+ @terminus.stubs(:search).returns([@instance])
410
+
411
+ @indirection.expects(:expiration).never
412
+
413
+ @instance.expects(:expiration).returns(:yay)
414
+ @instance.expects(:expiration=).never
415
+
416
+ @indirection.search("/my/key")
417
+ end
418
+
419
+ it "should return the results of searching in the terminus" do
420
+ @terminus.expects(:search).returns([@instance])
421
+ @indirection.search("/my/key").should == [@instance]
422
+ end
423
+ end
424
+
425
+ describe "and expiring a model instance" do
426
+ describe "when caching is not enabled" do
427
+ it "should do nothing" do
428
+ @cache_class.expects(:new).never
429
+
430
+ @indirection.expire("/my/key")
431
+ end
432
+ end
433
+
434
+ describe "when caching is enabled" do
435
+ before do
436
+ @indirection.cache_class = :cache_terminus
437
+ @cache_class.expects(:new).returns(@cache)
438
+
439
+ @instance.stubs(:expired?).returns false
440
+
441
+ @cached = stub 'cached', :expiration= => nil, :name => "/my/key"
442
+ end
443
+
444
+ it "should use a request to find within the cache" do
445
+ @cache.expects(:find).with { |r| r.is_a?(Puppet::Indirector::Request) and r.method == :find }
446
+ @indirection.expire("/my/key")
447
+ end
448
+
449
+ it "should do nothing if no such instance is cached" do
450
+ @cache.expects(:find).returns nil
451
+
452
+ @indirection.expire("/my/key")
453
+ end
454
+
455
+ it "should log that it is expiring any found instance" do
456
+ @cache.expects(:find).returns @cached
457
+ @cache.stubs(:save)
458
+
459
+ Puppet.expects(:info)
460
+
461
+ @indirection.expire("/my/key")
462
+ end
463
+
464
+ it "should set the cached instance's expiration to a time in the past" do
465
+ @cache.expects(:find).returns @cached
466
+ @cache.stubs(:save)
467
+
468
+ @cached.expects(:expiration=).with { |t| t < Time.now }
469
+
470
+ @indirection.expire("/my/key")
471
+ end
472
+
473
+ it "should save the now expired instance back into the cache" do
474
+ @cache.expects(:find).returns @cached
475
+
476
+ @cached.expects(:expiration=).with { |t| t < Time.now }
477
+
478
+ @cache.expects(:save)
479
+
480
+ @indirection.expire("/my/key")
481
+ end
482
+
483
+ it "should use a request to save the expired resource to the cache" do
484
+ @cache.expects(:find).returns @cached
485
+
486
+ @cached.expects(:expiration=).with { |t| t < Time.now }
487
+
488
+ @cache.expects(:save).with { |r| r.is_a?(Puppet::Indirector::Request) and r.instance == @cached and r.method == :save }.returns(@cached)
489
+
490
+ @indirection.expire("/my/key")
491
+ end
492
+ end
493
+ end
494
+
495
+ after :each do
496
+ @indirection.delete
497
+ Puppet::Indirector::Indirection.clear_cache
498
+ end
499
+ end
500
+
501
+
502
+ describe "when managing indirection instances" do
503
+ it "should allow an indirection to be retrieved by name" do
504
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
505
+ Puppet::Indirector::Indirection.instance(:test).should equal(@indirection)
506
+ end
507
+
508
+ it "should return nil when the named indirection has not been created" do
509
+ Puppet::Indirector::Indirection.instance(:test).should be_nil
510
+ end
511
+
512
+ it "should allow an indirection's model to be retrieved by name" do
513
+ mock_model = mock('model')
514
+ @indirection = Puppet::Indirector::Indirection.new(mock_model, :test)
515
+ Puppet::Indirector::Indirection.model(:test).should equal(mock_model)
516
+ end
517
+
518
+ it "should return nil when no model matches the requested name" do
519
+ Puppet::Indirector::Indirection.model(:test).should be_nil
520
+ end
521
+
522
+ after do
523
+ @indirection.delete if defined? @indirection
524
+ end
525
+ end
526
+
527
+ describe "when routing to the correct the terminus class" do
528
+ before do
529
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
530
+ @terminus = mock 'terminus'
531
+ @terminus_class = stub 'terminus class', :new => @terminus
532
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :default).returns(@terminus_class)
533
+ end
534
+
535
+ it "should fail if no terminus class can be picked" do
536
+ proc { @indirection.terminus_class }.should raise_error(Puppet::DevError)
537
+ end
538
+
539
+ it "should choose the default terminus class if one is specified" do
540
+ @indirection.terminus_class = :default
541
+ @indirection.terminus_class.should equal(:default)
542
+ end
543
+
544
+ it "should use the provided Puppet setting if told to do so" do
545
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :my_terminus).returns(mock("terminus_class2"))
546
+ Puppet.settings.expects(:value).with(:my_setting).returns("my_terminus")
547
+ @indirection.terminus_setting = :my_setting
548
+ @indirection.terminus_class.should equal(:my_terminus)
549
+ end
550
+
551
+ it "should fail if the provided terminus class is not valid" do
552
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :nosuchclass).returns(nil)
553
+ proc { @indirection.terminus_class = :nosuchclass }.should raise_error(ArgumentError)
554
+ end
555
+
556
+ after do
557
+ @indirection.delete if defined? @indirection
558
+ end
559
+ end
560
+
561
+ describe "when specifying the terminus class to use" do
562
+ before do
563
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
564
+ @terminus = mock 'terminus'
565
+ @terminus_class = stub 'terminus class', :new => @terminus
566
+ end
567
+
568
+ it "should allow specification of a terminus type" do
569
+ @indirection.should respond_to(:terminus_class=)
570
+ end
571
+
572
+ it "should fail to redirect if no terminus type has been specified" do
573
+ proc { @indirection.find("blah") }.should raise_error(Puppet::DevError)
574
+ end
575
+
576
+ it "should fail when the terminus class name is an empty string" do
577
+ proc { @indirection.terminus_class = "" }.should raise_error(ArgumentError)
578
+ end
579
+
580
+ it "should fail when the terminus class name is nil" do
581
+ proc { @indirection.terminus_class = nil }.should raise_error(ArgumentError)
582
+ end
583
+
584
+ it "should fail when the specified terminus class cannot be found" do
585
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(nil)
586
+ proc { @indirection.terminus_class = :foo }.should raise_error(ArgumentError)
587
+ end
588
+
589
+ it "should select the specified terminus class if a terminus class name is provided" do
590
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(@terminus_class)
591
+ @indirection.terminus(:foo).should equal(@terminus)
592
+ end
593
+
594
+ it "should use the configured terminus class if no terminus name is specified" do
595
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :foo).returns(@terminus_class)
596
+ @indirection.terminus_class = :foo
597
+ @indirection.terminus().should equal(@terminus)
598
+ end
599
+
600
+ after do
601
+ @indirection.delete if defined? @indirection
602
+ end
603
+ end
604
+
605
+ describe "when managing terminus instances" do
606
+ before do
607
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
608
+ @terminus = mock 'terminus'
609
+ @terminus_class = mock 'terminus class'
610
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :foo).returns(@terminus_class)
611
+ end
612
+
613
+ it "should create an instance of the chosen terminus class" do
614
+ @terminus_class.stubs(:new).returns(@terminus)
615
+ @indirection.terminus(:foo).should equal(@terminus)
616
+ end
617
+
618
+ it "should allow the clearance of cached terminus instances" do
619
+ terminus1 = mock 'terminus1'
620
+ terminus2 = mock 'terminus2'
621
+ @terminus_class.stubs(:new).returns(terminus1, terminus2, ArgumentError)
622
+ @indirection.terminus(:foo).should equal(terminus1)
623
+ @indirection.class.clear_cache
624
+ @indirection.terminus(:foo).should equal(terminus2)
625
+ end
626
+
627
+ # Make sure it caches the terminus.
628
+ it "should return the same terminus instance each time for a given name" do
629
+ @terminus_class.stubs(:new).returns(@terminus)
630
+ @indirection.terminus(:foo).should equal(@terminus)
631
+ @indirection.terminus(:foo).should equal(@terminus)
632
+ end
633
+
634
+ it "should not create a terminus instance until one is actually needed" do
635
+ Puppet::Indirector.expects(:terminus).never
636
+ indirection = Puppet::Indirector::Indirection.new(mock('model'), :lazytest)
637
+ end
638
+
639
+ after do
640
+ @indirection.delete
641
+ Puppet::Indirector::Indirection.clear_cache
642
+ end
643
+ end
644
+
645
+ describe "when deciding whether to cache" do
646
+ before do
647
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
648
+ @terminus = mock 'terminus'
649
+ @terminus_class = mock 'terminus class'
650
+ @terminus_class.stubs(:new).returns(@terminus)
651
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :foo).returns(@terminus_class)
652
+ @indirection.terminus_class = :foo
653
+ end
654
+
655
+ it "should provide a method for setting the cache terminus class" do
656
+ @indirection.should respond_to(:cache_class=)
657
+ end
658
+
659
+ it "should fail to cache if no cache type has been specified" do
660
+ proc { @indirection.cache }.should raise_error(Puppet::DevError)
661
+ end
662
+
663
+ it "should fail to set the cache class when the cache class name is an empty string" do
664
+ proc { @indirection.cache_class = "" }.should raise_error(ArgumentError)
665
+ end
666
+
667
+ it "should fail to set the cache class when the cache class name is nil" do
668
+ proc { @indirection.cache_class = nil }.should raise_error(ArgumentError)
669
+ end
670
+
671
+ it "should fail to set the cache class when the specified cache class cannot be found" do
672
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(nil)
673
+ proc { @indirection.cache_class = :foo }.should raise_error(ArgumentError)
674
+ end
675
+
676
+ after do
677
+ @indirection.delete
678
+ Puppet::Indirector::Indirection.clear_cache
679
+ end
680
+ end
681
+
682
+ describe "when using a cache" do
683
+ before :each do
684
+ Puppet.settings.stubs(:value).with("test_terminus").returns("test_terminus")
685
+ @terminus_class = mock 'terminus_class'
686
+ @terminus = mock 'terminus'
687
+ @terminus_class.stubs(:new).returns(@terminus)
688
+ @cache = mock 'cache'
689
+ @cache_class = mock 'cache_class'
690
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :cache_terminus).returns(@cache_class)
691
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :test_terminus).returns(@terminus_class)
692
+ @indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
693
+ @indirection.terminus_class = :test_terminus
694
+ end
695
+
696
+ describe "and managing the cache terminus" do
697
+ it "should not create a cache terminus at initialization" do
698
+ # This is weird, because all of the code is in the setup. If we got
699
+ # new() called on the cache class, we'd get an exception here.
700
+ end
701
+
702
+ it "should reuse the cache terminus" do
703
+ @cache_class.expects(:new).returns(@cache)
704
+ Puppet.settings.stubs(:value).with("test_cache").returns("cache_terminus")
705
+ @indirection.cache_class = :cache_terminus
706
+ @indirection.cache.should equal(@cache)
707
+ @indirection.cache.should equal(@cache)
708
+ end
709
+
710
+ it "should remove the cache terminus when all other terminus instances are cleared" do
711
+ cache2 = mock 'cache2'
712
+ @cache_class.stubs(:new).returns(@cache, cache2)
713
+ @indirection.cache_class = :cache_terminus
714
+ @indirection.cache.should equal(@cache)
715
+ @indirection.clear_cache
716
+ @indirection.cache.should equal(cache2)
717
+ end
718
+ end
719
+
720
+ describe "and saving" do
721
+ end
722
+
723
+ describe "and finding" do
724
+ end
725
+
726
+ after :each do
727
+ @indirection.delete
728
+ Puppet::Indirector::Indirection.clear_cache
729
+ end
730
+ end
731
+ end