puppet 0.18.4 → 0.22.4

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 (673) hide show
  1. data/CHANGELOG +288 -0
  2. data/README +2 -2
  3. data/Rakefile +78 -5
  4. data/bin/puppet +28 -36
  5. data/bin/puppetca +81 -38
  6. data/bin/puppetd +65 -62
  7. data/bin/puppetdoc +409 -140
  8. data/bin/puppetmasterd +59 -47
  9. data/bin/puppetrun +38 -23
  10. data/conf/freebsd/puppetd +26 -0
  11. data/conf/freebsd/puppetmasterd +26 -0
  12. data/conf/gentoo/conf.d/puppet +5 -0
  13. data/conf/gentoo/conf.d/puppetmaster +12 -0
  14. data/conf/gentoo/init.d/puppet +38 -0
  15. data/conf/gentoo/init.d/puppetmaster +50 -0
  16. data/conf/gentoo/puppet/fileserver.conf +12 -0
  17. data/conf/gentoo/puppet/puppetca.conf +29 -0
  18. data/conf/gentoo/puppet/puppetd.conf +29 -0
  19. data/conf/gentoo/puppet/puppetmasterd.conf +29 -0
  20. data/conf/redhat/client.init +10 -5
  21. data/conf/redhat/client.sysconfig +1 -1
  22. data/conf/redhat/fileserver.conf +2 -2
  23. data/conf/redhat/logrotate +1 -1
  24. data/conf/redhat/no-lockdir.patch +13 -0
  25. data/conf/redhat/puppet.spec +65 -8
  26. data/conf/redhat/puppetd.conf +0 -4
  27. data/conf/redhat/server.init +3 -6
  28. data/conf/solaris/pkginfo +1 -1
  29. data/conf/solaris/smf/svc-puppetd +2 -2
  30. data/conf/suse/client.init +142 -0
  31. data/conf/suse/puppet.spec +221 -0
  32. data/conf/suse/server.init +162 -0
  33. data/examples/code/mac_automount.pp +16 -0
  34. data/examples/root/bin/sleeper +3 -5
  35. data/examples/root/etc/init.d/sleeper +8 -2
  36. data/examples/root/etc/puppet/fileserver.conf +12 -2
  37. data/examples/root/etc/puppet/namespaceauth.conf +20 -0
  38. data/examples/root/etc/puppet/puppetd.conf +4 -0
  39. data/examples/root/etc/puppet/puppetmasterd.conf +6 -9
  40. data/examples/root/etc/puppet/tagmail.conf +1 -0
  41. data/ext/emacs/puppet-mode.el +46 -1
  42. data/ext/logcheck/puppet +15 -0
  43. data/ext/module_puppet +15 -23
  44. data/ext/vim/puppet.vim +4 -2
  45. data/install.rb +2 -1
  46. data/lib/puppet.rb +76 -207
  47. data/lib/puppet/configuration.rb +331 -0
  48. data/lib/puppet/daemon.rb +63 -246
  49. data/lib/puppet/dsl.rb +371 -0
  50. data/lib/puppet/element.rb +8 -26
  51. data/lib/puppet/error.rb +54 -0
  52. data/lib/puppet/event.rb +8 -243
  53. data/lib/puppet/{base64.rb → external/base64.rb} +0 -0
  54. data/lib/puppet/external/event-loop.rb +1 -0
  55. data/lib/puppet/{event-loop → external/event-loop}/better-definers.rb +0 -0
  56. data/lib/puppet/{event-loop → external/event-loop}/event-loop.rb +2 -2
  57. data/lib/puppet/{event-loop → external/event-loop}/signal-system.rb +1 -1
  58. data/lib/puppet/external/gratr.rb +33 -0
  59. data/lib/puppet/external/gratr/adjacency_graph.rb +257 -0
  60. data/lib/puppet/external/gratr/base.rb +34 -0
  61. data/lib/puppet/external/gratr/biconnected.rb +116 -0
  62. data/lib/puppet/external/gratr/chinese_postman.rb +123 -0
  63. data/lib/puppet/external/gratr/common.rb +73 -0
  64. data/lib/puppet/external/gratr/comparability.rb +92 -0
  65. data/lib/puppet/external/gratr/digraph.rb +116 -0
  66. data/lib/puppet/external/gratr/digraph_distance.rb +185 -0
  67. data/lib/puppet/external/gratr/dot.rb +90 -0
  68. data/lib/puppet/external/gratr/edge.rb +145 -0
  69. data/lib/puppet/external/gratr/graph.rb +303 -0
  70. data/lib/puppet/external/gratr/graph_api.rb +83 -0
  71. data/lib/puppet/external/gratr/import.rb +44 -0
  72. data/lib/puppet/external/gratr/labels.rb +90 -0
  73. data/lib/puppet/external/gratr/maximum_flow.rb +64 -0
  74. data/lib/puppet/external/gratr/rdot.rb +327 -0
  75. data/lib/puppet/external/gratr/search.rb +409 -0
  76. data/lib/puppet/external/gratr/strong_components.rb +127 -0
  77. data/lib/puppet/external/gratr/undirected_graph.rb +153 -0
  78. data/lib/puppet/{lock.rb → external/lock.rb} +1 -1
  79. data/lib/puppet/feature/base.rb +20 -0
  80. data/lib/puppet/feature/rails.rb +52 -0
  81. data/lib/puppet/metatype/attributes.rb +719 -0
  82. data/lib/puppet/metatype/closure.rb +111 -0
  83. data/lib/puppet/metatype/container.rb +94 -0
  84. data/lib/puppet/metatype/evaluation.rb +118 -0
  85. data/lib/puppet/metatype/instances.rb +261 -0
  86. data/lib/puppet/metatype/manager.rb +169 -0
  87. data/lib/puppet/metatype/metaparams.rb +409 -0
  88. data/lib/puppet/metatype/providers.rb +260 -0
  89. data/lib/puppet/metatype/relationships.rb +116 -0
  90. data/lib/puppet/metatype/schedules.rb +39 -0
  91. data/lib/puppet/metatype/tags.rb +39 -0
  92. data/lib/puppet/modules.rb +113 -0
  93. data/lib/puppet/network/authconfig.rb +168 -0
  94. data/lib/puppet/network/authorization.rb +84 -0
  95. data/lib/puppet/network/authstore.rb +293 -0
  96. data/lib/puppet/network/client.rb +187 -0
  97. data/lib/puppet/network/client/ca.rb +56 -0
  98. data/lib/puppet/network/client/dipper.rb +81 -0
  99. data/lib/puppet/network/client/file.rb +7 -0
  100. data/lib/puppet/network/client/logger.rb +6 -0
  101. data/lib/puppet/network/client/master.rb +644 -0
  102. data/lib/puppet/{client → network/client}/proxy.rb +3 -3
  103. data/lib/puppet/{client/reporter.rb → network/client/report.rb} +4 -7
  104. data/lib/puppet/{client/pelement.rb → network/client/resource.rb} +6 -19
  105. data/lib/puppet/network/client/runner.rb +13 -0
  106. data/lib/puppet/network/client/status.rb +5 -0
  107. data/lib/puppet/network/client_request.rb +32 -0
  108. data/lib/puppet/network/handler.rb +33 -0
  109. data/lib/puppet/{server → network/handler}/ca.rb +5 -6
  110. data/lib/puppet/network/handler/filebucket.rb +180 -0
  111. data/lib/puppet/{server → network/handler}/fileserver.rb +277 -219
  112. data/lib/puppet/{server → network/handler}/logger.rb +3 -5
  113. data/lib/puppet/{server → network/handler}/master.rb +42 -8
  114. data/lib/puppet/network/handler/report.rb +158 -0
  115. data/lib/puppet/network/handler/resource.rb +190 -0
  116. data/lib/puppet/{server → network/handler}/runner.rb +17 -18
  117. data/lib/puppet/network/handler/status.rb +13 -0
  118. data/lib/puppet/network/rights.rb +74 -0
  119. data/lib/puppet/network/server.rb +5 -0
  120. data/lib/puppet/network/server/mongrel.rb +138 -0
  121. data/lib/puppet/network/server/webrick.rb +153 -0
  122. data/lib/puppet/network/xmlrpc/client.rb +129 -0
  123. data/lib/puppet/network/xmlrpc/processor.rb +91 -0
  124. data/lib/puppet/network/xmlrpc/server.rb +20 -0
  125. data/lib/puppet/network/xmlrpc/webrick_servlet.rb +121 -0
  126. data/lib/puppet/parameter.rb +390 -346
  127. data/lib/puppet/parser/ast.rb +116 -147
  128. data/lib/puppet/parser/ast/astarray.rb +17 -33
  129. data/lib/puppet/parser/ast/branch.rb +2 -0
  130. data/lib/puppet/parser/ast/caseopt.rb +7 -12
  131. data/lib/puppet/parser/ast/casestatement.rb +23 -32
  132. data/lib/puppet/parser/ast/collection.rb +19 -80
  133. data/lib/puppet/parser/ast/collexpr.rb +81 -0
  134. data/lib/puppet/parser/ast/component.rb +160 -89
  135. data/lib/puppet/parser/ast/else.rb +30 -0
  136. data/lib/puppet/parser/ast/function.rb +9 -2
  137. data/lib/puppet/parser/ast/hostclass.rb +47 -131
  138. data/lib/puppet/parser/ast/ifstatement.rb +43 -0
  139. data/lib/puppet/parser/ast/leaf.rb +10 -21
  140. data/lib/puppet/parser/ast/node.rb +32 -79
  141. data/lib/puppet/parser/ast/resourcedef.rb +222 -0
  142. data/lib/puppet/parser/ast/{typedefaults.rb → resourcedefaults.rb} +10 -16
  143. data/lib/puppet/parser/ast/resourceoverride.rb +62 -0
  144. data/lib/puppet/parser/ast/{objectparam.rb → resourceparam.rb} +12 -6
  145. data/lib/puppet/parser/ast/resourceref.rb +44 -0
  146. data/lib/puppet/parser/ast/selector.rb +16 -8
  147. data/lib/puppet/parser/ast/tag.rb +3 -1
  148. data/lib/puppet/parser/ast/vardef.rb +8 -12
  149. data/lib/puppet/parser/collector.rb +181 -0
  150. data/lib/puppet/parser/functions.rb +191 -36
  151. data/lib/puppet/parser/interpreter.rb +802 -380
  152. data/lib/puppet/parser/lexer.rb +86 -19
  153. data/lib/puppet/parser/parser.rb +1123 -960
  154. data/lib/puppet/parser/resource.rb +353 -0
  155. data/lib/puppet/parser/resource/param.rb +57 -0
  156. data/lib/puppet/parser/resource/reference.rb +71 -0
  157. data/lib/puppet/parser/scope.rb +573 -1000
  158. data/lib/puppet/parser/templatewrapper.rb +54 -0
  159. data/lib/puppet/pgraph.rb +208 -0
  160. data/lib/puppet/propertychange.rb +143 -0
  161. data/lib/puppet/provider.rb +302 -0
  162. data/lib/puppet/provider/cron/crontab.rb +187 -0
  163. data/lib/puppet/provider/group/groupadd.rb +29 -0
  164. data/lib/puppet/provider/group/netinfo.rb +12 -0
  165. data/lib/puppet/provider/group/pw.rb +31 -0
  166. data/lib/puppet/provider/host/netinfo.rb +18 -0
  167. data/lib/puppet/provider/host/parsed.rb +73 -0
  168. data/lib/puppet/provider/mount.rb +57 -0
  169. data/lib/puppet/provider/mount/netinfo.rb +38 -0
  170. data/lib/puppet/provider/mount/parsed.rb +37 -0
  171. data/lib/puppet/provider/nameservice.rb +344 -0
  172. data/lib/puppet/provider/nameservice/netinfo.rb +210 -0
  173. data/lib/puppet/provider/nameservice/objectadd.rb +45 -0
  174. data/lib/puppet/provider/nameservice/pw.rb +22 -0
  175. data/lib/puppet/provider/package/apple.rb +53 -0
  176. data/lib/puppet/provider/package/apt.rb +119 -0
  177. data/lib/puppet/provider/package/aptitude.rb +30 -0
  178. data/lib/puppet/provider/package/aptrpm.rb +79 -0
  179. data/lib/puppet/provider/package/blastwave.rb +114 -0
  180. data/lib/puppet/provider/package/darwinport.rb +88 -0
  181. data/lib/puppet/provider/package/dpkg.rb +109 -0
  182. data/lib/puppet/provider/package/freebsd.rb +43 -0
  183. data/lib/puppet/provider/package/gem.rb +104 -0
  184. data/lib/puppet/provider/package/openbsd.rb +93 -0
  185. data/lib/puppet/provider/package/pkgdmg.rb +119 -0
  186. data/lib/puppet/provider/package/portage.rb +112 -0
  187. data/lib/puppet/provider/package/ports.rb +94 -0
  188. data/lib/puppet/provider/package/rpm.rb +125 -0
  189. data/lib/puppet/provider/package/rug.rb +53 -0
  190. data/lib/puppet/provider/package/sun.rb +168 -0
  191. data/lib/puppet/provider/package/sunfreeware.rb +9 -0
  192. data/lib/puppet/provider/package/up2date.rb +45 -0
  193. data/lib/puppet/provider/package/yum.rb +54 -0
  194. data/lib/puppet/provider/parsedfile.rb +342 -0
  195. data/lib/puppet/provider/port/parsed.rb +174 -0
  196. data/lib/puppet/provider/service/base.rb +136 -0
  197. data/lib/puppet/provider/service/debian.rb +32 -0
  198. data/lib/puppet/provider/service/gentoo.rb +49 -0
  199. data/lib/puppet/{type → provider}/service/init.rb +42 -40
  200. data/lib/puppet/provider/service/redhat.rb +59 -0
  201. data/lib/puppet/{type → provider}/service/smf.rb +24 -13
  202. data/lib/puppet/provider/sshkey/parsed.rb +36 -0
  203. data/lib/puppet/provider/user/netinfo.rb +106 -0
  204. data/lib/puppet/provider/user/pw.rb +41 -0
  205. data/lib/puppet/provider/user/useradd.rb +67 -0
  206. data/lib/puppet/provider/zone/solaris.rb +208 -0
  207. data/lib/puppet/rails.rb +102 -66
  208. data/lib/puppet/rails/database/001_add_indexes.rb +38 -0
  209. data/lib/puppet/rails/database/schema.rb +89 -0
  210. data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +62 -0
  211. data/lib/puppet/rails/external/tagging/init.rb +5 -0
  212. data/lib/puppet/rails/external/tagging/tag.rb +50 -0
  213. data/lib/puppet/rails/external/tagging/tagging.rb +12 -0
  214. data/lib/puppet/rails/fact_name.rb +7 -0
  215. data/lib/puppet/rails/fact_value.rb +5 -0
  216. data/lib/puppet/rails/host.rb +95 -46
  217. data/lib/puppet/rails/param_name.rb +28 -0
  218. data/lib/puppet/rails/param_value.rb +5 -0
  219. data/lib/puppet/rails/puppet_class.rb +9 -0
  220. data/lib/puppet/rails/resource.rb +95 -0
  221. data/lib/puppet/rails/source_file.rb +5 -0
  222. data/lib/puppet/relationship.rb +63 -0
  223. data/lib/puppet/reports/log.rb +14 -0
  224. data/lib/puppet/reports/rrdgraph.rb +114 -10
  225. data/lib/puppet/reports/store.rb +64 -0
  226. data/lib/puppet/reports/tagmail.rb +144 -71
  227. data/lib/puppet/sslcertificates.rb +38 -5
  228. data/lib/puppet/sslcertificates/ca.rb +142 -37
  229. data/lib/puppet/sslcertificates/certificate.rb +3 -3
  230. data/lib/puppet/sslcertificates/inventory.rb +53 -0
  231. data/lib/puppet/sslcertificates/support.rb +128 -0
  232. data/lib/puppet/transaction.rb +568 -189
  233. data/lib/puppet/transaction/report.rb +14 -3
  234. data/lib/puppet/transportable.rb +18 -10
  235. data/lib/puppet/type.rb +279 -2299
  236. data/lib/puppet/type/component.rb +63 -63
  237. data/lib/puppet/type/cron.rb +294 -710
  238. data/lib/puppet/type/exec.rb +185 -129
  239. data/lib/puppet/type/group.rb +38 -89
  240. data/lib/puppet/type/host.rb +110 -0
  241. data/lib/puppet/type/mount.rb +189 -0
  242. data/lib/puppet/type/notify.rb +47 -0
  243. data/lib/puppet/type/package.rb +129 -257
  244. data/lib/puppet/type/parsedtype.rb +172 -297
  245. data/lib/puppet/type/pfile.rb +540 -319
  246. data/lib/puppet/type/pfile/checksum.rb +103 -76
  247. data/lib/puppet/type/pfile/content.rb +16 -10
  248. data/lib/puppet/type/pfile/ensure.rb +52 -34
  249. data/lib/puppet/type/pfile/group.rb +25 -18
  250. data/lib/puppet/type/pfile/mode.rb +7 -4
  251. data/lib/puppet/type/pfile/{uid.rb → owner.rb} +21 -17
  252. data/lib/puppet/type/pfile/source.rb +119 -124
  253. data/lib/puppet/type/pfile/target.rb +29 -45
  254. data/lib/puppet/type/pfile/type.rb +2 -2
  255. data/lib/puppet/type/pfilebucket.rb +18 -14
  256. data/lib/puppet/type/port.rb +121 -0
  257. data/lib/puppet/type/property.rb +530 -0
  258. data/lib/puppet/type/resources.rb +150 -0
  259. data/lib/puppet/type/schedule.rb +38 -22
  260. data/lib/puppet/type/service.rb +70 -326
  261. data/lib/puppet/type/sshkey.rb +76 -0
  262. data/lib/puppet/type/tidy.rb +197 -97
  263. data/lib/puppet/type/user.rb +107 -183
  264. data/lib/puppet/type/yumrepo.rb +53 -34
  265. data/lib/puppet/type/zone.rb +55 -208
  266. data/lib/puppet/util.rb +239 -201
  267. data/lib/puppet/util/autoload.rb +107 -0
  268. data/lib/puppet/util/classgen.rb +208 -0
  269. data/lib/puppet/{config.rb → util/config.rb} +102 -54
  270. data/lib/puppet/util/docs.rb +104 -0
  271. data/lib/puppet/util/errors.rb +55 -0
  272. data/lib/puppet/util/execution.rb +22 -0
  273. data/lib/puppet/util/feature.rb +76 -0
  274. data/lib/puppet/util/fileparsing.rb +380 -0
  275. data/lib/puppet/util/filetype.rb +300 -0
  276. data/lib/puppet/util/graph.rb +39 -0
  277. data/lib/puppet/util/inifile.rb +209 -0
  278. data/lib/puppet/util/loadedfile.rb +71 -0
  279. data/lib/puppet/util/log.rb +549 -0
  280. data/lib/puppet/util/logging.rb +20 -0
  281. data/lib/puppet/util/metaid.rb +22 -0
  282. data/lib/puppet/util/methodhelper.rb +37 -0
  283. data/lib/puppet/util/metric.rb +160 -0
  284. data/lib/puppet/util/package.rb +31 -0
  285. data/lib/puppet/util/pidlock.rb +68 -0
  286. data/lib/puppet/util/plist.rb +24 -0
  287. data/lib/puppet/util/plist/generator.rb +226 -0
  288. data/lib/puppet/util/plist/parser.rb +227 -0
  289. data/lib/puppet/util/posix.rb +87 -0
  290. data/lib/puppet/util/provider_features.rb +170 -0
  291. data/lib/puppet/util/rails/collection_merger.rb +42 -0
  292. data/lib/puppet/util/storage.rb +103 -0
  293. data/lib/puppet/util/subclass_loader.rb +83 -0
  294. data/lib/puppet/util/suidmanager.rb +86 -0
  295. data/lib/puppet/util/variables.rb +39 -0
  296. data/lib/puppet/util/warnings.rb +15 -0
  297. data/test/Rakefile +97 -0
  298. data/test/certmgr/ca.rb +81 -0
  299. data/test/certmgr/certmgr.rb +77 -50
  300. data/test/certmgr/inventory.rb +79 -0
  301. data/test/certmgr/support.rb +81 -0
  302. data/test/executables/filebucket.rb +49 -0
  303. data/test/executables/puppetbin.rb +28 -12
  304. data/test/executables/puppetca.rb +75 -54
  305. data/test/executables/puppetd.rb +10 -13
  306. data/test/executables/puppetmasterd.rb +12 -17
  307. data/test/executables/puppetmodule.rb +18 -17
  308. data/test/language/ast.rb +242 -798
  309. data/test/language/ast/casestatement.rb +104 -0
  310. data/test/language/ast/component.rb +133 -0
  311. data/test/language/ast/hostclass.rb +162 -0
  312. data/test/language/ast/selector.rb +62 -0
  313. data/test/language/ast/variable.rb +31 -0
  314. data/test/language/collector.rb +369 -0
  315. data/test/language/functions.rb +305 -18
  316. data/test/language/interpreter.rb +894 -125
  317. data/test/language/lexer.rb +98 -12
  318. data/test/language/node.rb +37 -53
  319. data/test/language/parser.rb +455 -148
  320. data/test/language/resource.rb +535 -0
  321. data/test/language/scope.rb +451 -561
  322. data/test/language/snippets.rb +101 -111
  323. data/test/language/transportable.rb +6 -8
  324. data/test/lib/mocha.rb +19 -0
  325. data/test/lib/mocha/any_instance_method.rb +35 -0
  326. data/test/lib/mocha/auto_verify.rb +113 -0
  327. data/test/lib/mocha/central.rb +35 -0
  328. data/test/lib/mocha/class_method.rb +62 -0
  329. data/test/lib/mocha/expectation.rb +295 -0
  330. data/test/lib/mocha/expectation_error.rb +6 -0
  331. data/test/lib/mocha/infinite_range.rb +27 -0
  332. data/test/lib/mocha/inspect.rb +37 -0
  333. data/test/lib/mocha/instance_method.rb +8 -0
  334. data/test/lib/mocha/metaclass.rb +7 -0
  335. data/test/lib/mocha/mock.rb +20 -0
  336. data/test/lib/mocha/mock_methods.rb +122 -0
  337. data/test/lib/mocha/object.rb +100 -0
  338. data/test/lib/mocha/pretty_parameters.rb +28 -0
  339. data/test/lib/mocha/setup_and_teardown.rb +23 -0
  340. data/test/lib/mocha/standalone.rb +30 -0
  341. data/test/lib/mocha/test_case_adapter.rb +49 -0
  342. data/test/lib/mocha_standalone.rb +2 -0
  343. data/test/lib/puppettest.rb +294 -0
  344. data/test/lib/puppettest/certificates.rb +61 -0
  345. data/test/lib/puppettest/exetest.rb +123 -0
  346. data/test/lib/puppettest/fakes.rb +194 -0
  347. data/test/lib/puppettest/fileparsing.rb +33 -0
  348. data/test/lib/puppettest/filetesting.rb +231 -0
  349. data/test/lib/puppettest/graph.rb +41 -0
  350. data/test/lib/puppettest/parsertesting.rb +392 -0
  351. data/test/lib/puppettest/railstesting.rb +56 -0
  352. data/test/lib/puppettest/reporttesting.rb +19 -0
  353. data/test/lib/puppettest/resourcetesting.rb +73 -0
  354. data/test/lib/puppettest/servertest.rb +72 -0
  355. data/test/lib/puppettest/support.rb +8 -0
  356. data/test/lib/puppettest/support/assertions.rb +101 -0
  357. data/test/lib/puppettest/support/helpers.rb +23 -0
  358. data/test/lib/puppettest/support/resources.rb +37 -0
  359. data/test/lib/puppettest/support/utils.rb +160 -0
  360. data/test/lib/puppettest/testcase.rb +48 -0
  361. data/test/lib/rake/puppet_test_loader.rb +17 -0
  362. data/test/lib/rake/puppet_testtask.rb +17 -0
  363. data/test/lib/spec.rb +8 -0
  364. data/test/lib/spec/callback.rb +11 -0
  365. data/test/lib/spec/callback/callback_container.rb +60 -0
  366. data/test/lib/spec/callback/extensions/module.rb +24 -0
  367. data/test/lib/spec/callback/extensions/object.rb +37 -0
  368. data/test/lib/spec/deprecated.rb +3 -0
  369. data/test/lib/spec/expectations.rb +59 -0
  370. data/test/lib/spec/expectations/differs/default.rb +62 -0
  371. data/test/lib/spec/expectations/errors.rb +6 -0
  372. data/test/lib/spec/expectations/extensions.rb +3 -0
  373. data/test/lib/spec/expectations/extensions/object.rb +109 -0
  374. data/test/lib/spec/expectations/extensions/proc.rb +57 -0
  375. data/test/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  376. data/test/lib/spec/expectations/handler.rb +47 -0
  377. data/test/lib/spec/expectations/should.rb +5 -0
  378. data/test/lib/spec/expectations/should/base.rb +64 -0
  379. data/test/lib/spec/expectations/should/change.rb +69 -0
  380. data/test/lib/spec/expectations/should/have.rb +128 -0
  381. data/test/lib/spec/expectations/should/not.rb +74 -0
  382. data/test/lib/spec/expectations/should/should.rb +81 -0
  383. data/test/lib/spec/expectations/sugar.rb +47 -0
  384. data/test/lib/spec/matchers.rb +160 -0
  385. data/test/lib/spec/matchers/be.rb +161 -0
  386. data/test/lib/spec/matchers/be_close.rb +37 -0
  387. data/test/lib/spec/matchers/change.rb +120 -0
  388. data/test/lib/spec/matchers/eql.rb +43 -0
  389. data/test/lib/spec/matchers/equal.rb +43 -0
  390. data/test/lib/spec/matchers/has.rb +44 -0
  391. data/test/lib/spec/matchers/have.rb +140 -0
  392. data/test/lib/spec/matchers/include.rb +50 -0
  393. data/test/lib/spec/matchers/match.rb +41 -0
  394. data/test/lib/spec/matchers/raise_error.rb +100 -0
  395. data/test/lib/spec/matchers/respond_to.rb +35 -0
  396. data/test/lib/spec/matchers/satisfy.rb +47 -0
  397. data/test/lib/spec/matchers/throw_symbol.rb +75 -0
  398. data/test/lib/spec/mocks.rb +232 -0
  399. data/test/lib/spec/mocks/argument_expectation.rb +132 -0
  400. data/test/lib/spec/mocks/error_generator.rb +85 -0
  401. data/test/lib/spec/mocks/errors.rb +10 -0
  402. data/test/lib/spec/mocks/extensions/object.rb +3 -0
  403. data/test/lib/spec/mocks/message_expectation.rb +231 -0
  404. data/test/lib/spec/mocks/methods.rb +40 -0
  405. data/test/lib/spec/mocks/mock.rb +26 -0
  406. data/test/lib/spec/mocks/mock_handler.rb +166 -0
  407. data/test/lib/spec/mocks/order_group.rb +29 -0
  408. data/test/lib/spec/rake/spectask.rb +173 -0
  409. data/test/lib/spec/rake/verify_rcov.rb +47 -0
  410. data/test/lib/spec/runner.rb +132 -0
  411. data/test/lib/spec/runner/backtrace_tweaker.rb +55 -0
  412. data/test/lib/spec/runner/command_line.rb +34 -0
  413. data/test/lib/spec/runner/context.rb +154 -0
  414. data/test/lib/spec/runner/context_eval.rb +142 -0
  415. data/test/lib/spec/runner/context_runner.rb +55 -0
  416. data/test/lib/spec/runner/drb_command_line.rb +21 -0
  417. data/test/lib/spec/runner/execution_context.rb +17 -0
  418. data/test/lib/spec/runner/extensions/kernel.rb +17 -0
  419. data/test/lib/spec/runner/extensions/object.rb +32 -0
  420. data/test/lib/spec/runner/formatter.rb +5 -0
  421. data/test/lib/spec/runner/formatter/base_text_formatter.rb +118 -0
  422. data/test/lib/spec/runner/formatter/html_formatter.rb +219 -0
  423. data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +27 -0
  424. data/test/lib/spec/runner/formatter/rdoc_formatter.rb +22 -0
  425. data/test/lib/spec/runner/formatter/specdoc_formatter.rb +23 -0
  426. data/test/lib/spec/runner/heckle_runner.rb +71 -0
  427. data/test/lib/spec/runner/heckle_runner_win.rb +10 -0
  428. data/test/lib/spec/runner/option_parser.rb +224 -0
  429. data/test/lib/spec/runner/reporter.rb +105 -0
  430. data/test/lib/spec/runner/spec_matcher.rb +25 -0
  431. data/test/lib/spec/runner/spec_parser.rb +41 -0
  432. data/test/lib/spec/runner/spec_should_raise_handler.rb +74 -0
  433. data/test/lib/spec/runner/specification.rb +114 -0
  434. data/test/lib/spec/translator.rb +87 -0
  435. data/test/lib/spec/version.rb +30 -0
  436. data/test/lib/stubba.rb +2 -0
  437. data/test/network/authconfig.rb +72 -0
  438. data/test/network/authorization.rb +138 -0
  439. data/test/network/authstore.rb +450 -0
  440. data/test/network/client/ca.rb +38 -0
  441. data/test/{client → network/client}/client.rb +107 -24
  442. data/test/network/client/dipper.rb +35 -0
  443. data/test/network/client/master.rb +627 -0
  444. data/test/{client/pelement.rb → network/client/resource.rb} +13 -29
  445. data/test/network/client_request.rb +39 -0
  446. data/test/network/daemon.rb +71 -0
  447. data/test/{server → network/handler}/bucket.rb +103 -27
  448. data/test/{server → network/handler}/ca.rb +14 -19
  449. data/test/{server → network/handler}/fileserver.rb +443 -68
  450. data/test/network/handler/handler.rb +64 -0
  451. data/test/{server → network/handler}/logger.rb +26 -26
  452. data/test/network/handler/master.rb +352 -0
  453. data/test/network/handler/report.rb +185 -0
  454. data/test/{server/pelement.rb → network/handler/resource.rb} +25 -38
  455. data/test/{server → network/handler}/runner.rb +17 -16
  456. data/test/network/rights.rb +38 -0
  457. data/test/network/server/webrick.rb +140 -0
  458. data/test/network/xmlrpc/client.rb +68 -0
  459. data/test/network/xmlrpc/processor.rb +80 -0
  460. data/test/network/xmlrpc/server.rb +28 -0
  461. data/test/network/xmlrpc/webrick_servlet.rb +26 -0
  462. data/test/other/dsl.rb +218 -0
  463. data/test/other/events.rb +22 -15
  464. data/test/other/overrides.rb +9 -14
  465. data/test/other/pgraph.rb +289 -0
  466. data/test/other/propertychange.rb +142 -0
  467. data/test/other/provider.rb +162 -0
  468. data/test/other/puppet.rb +63 -10
  469. data/test/other/relationship.rb +74 -0
  470. data/test/other/relationships.rb +199 -123
  471. data/test/other/report.rb +152 -23
  472. data/test/other/transactions.rb +824 -78
  473. data/test/puppet/conffiles.rb +16 -11
  474. data/test/puppet/defaults.rb +7 -10
  475. data/test/puppet/{error.rb → errortest.rb} +5 -8
  476. data/test/puppet/modules.rb +58 -0
  477. data/test/puppet/tc_suidmanager.rb +107 -0
  478. data/test/rails/host.rb +177 -0
  479. data/test/rails/rails.rb +27 -0
  480. data/test/rails/railsparameter.rb +62 -0
  481. data/test/rails/railsresource.rb +100 -0
  482. data/test/ral/manager/attributes.rb +296 -0
  483. data/test/ral/manager/manager.rb +55 -0
  484. data/test/ral/manager/provider.rb +54 -0
  485. data/test/ral/manager/type.rb +837 -0
  486. data/test/ral/providers/cron/crontab.rb +346 -0
  487. data/test/ral/providers/group.rb +252 -0
  488. data/test/ral/providers/host/netinfo.rb +58 -0
  489. data/test/ral/providers/host/parsed.rb +226 -0
  490. data/test/ral/providers/mount/netinfo.rb +80 -0
  491. data/test/ral/providers/mount/parsed.rb +223 -0
  492. data/test/ral/providers/nameservice.rb +33 -0
  493. data/test/ral/providers/package.rb +253 -0
  494. data/test/ral/providers/package/apt.rb +89 -0
  495. data/test/ral/providers/package/aptitude.rb +69 -0
  496. data/test/ral/providers/package/aptrpm.rb +89 -0
  497. data/test/ral/providers/package/dpkg.rb +64 -0
  498. data/test/ral/providers/parsedfile.rb +668 -0
  499. data/test/ral/providers/parsedport.rb +233 -0
  500. data/test/ral/providers/provider.rb +423 -0
  501. data/test/{types → ral/providers}/service.rb +20 -121
  502. data/test/ral/providers/service/base.rb +75 -0
  503. data/test/ral/providers/sshkey/parsed.rb +111 -0
  504. data/test/ral/providers/user.rb +567 -0
  505. data/test/ral/providers/user/useradd.rb +250 -0
  506. data/test/ral/types/basic.rb +90 -0
  507. data/test/ral/types/component.rb +113 -0
  508. data/test/ral/types/cron.rb +480 -0
  509. data/test/{types → ral/types}/exec.rb +278 -82
  510. data/test/ral/types/file.rb +1799 -0
  511. data/test/ral/types/file/target.rb +363 -0
  512. data/test/{types → ral/types}/filebucket.rb +15 -17
  513. data/test/{types → ral/types}/fileignoresource.rb +9 -15
  514. data/test/ral/types/filesources.rb +1046 -0
  515. data/test/ral/types/group.rb +169 -0
  516. data/test/ral/types/host.rb +155 -0
  517. data/test/ral/types/mount.rb +312 -0
  518. data/test/ral/types/package.rb +85 -0
  519. data/test/ral/types/parameter.rb +172 -0
  520. data/test/ral/types/port.rb +148 -0
  521. data/test/ral/types/property.rb +343 -0
  522. data/test/ral/types/resources.rb +221 -0
  523. data/test/{types → ral/types}/schedule.rb +34 -12
  524. data/test/ral/types/service.rb +37 -0
  525. data/test/{types → ral/types}/sshkey.rb +75 -65
  526. data/test/ral/types/tidy.rb +240 -0
  527. data/test/ral/types/user.rb +493 -0
  528. data/test/{types → ral/types}/yumrepo.rb +7 -11
  529. data/test/{types → ral/types}/zone.rb +45 -45
  530. data/test/tagging/tagging.rb +17 -26
  531. data/test/util/autoload.rb +130 -0
  532. data/test/util/classgen.rb +227 -0
  533. data/test/{other → util}/config.rb +373 -113
  534. data/test/util/execution.rb +34 -0
  535. data/test/util/features.rb +94 -0
  536. data/test/util/fileparsing.rb +677 -0
  537. data/test/{other → util}/filetype.rb +9 -12
  538. data/test/util/graph.rb +108 -0
  539. data/test/{other → util}/inifile.rb +24 -11
  540. data/test/util/loadedfile.rb +106 -0
  541. data/test/{other → util}/log.rb +96 -50
  542. data/test/{other → util}/metrics.rb +7 -17
  543. data/test/util/package.rb +27 -0
  544. data/test/util/pidlock.rb +126 -0
  545. data/test/util/posixtest.rb +173 -0
  546. data/test/util/storage.rb +123 -0
  547. data/test/util/subclass_loader.rb +100 -0
  548. data/test/util/utiltest.rb +368 -0
  549. metadata +449 -169
  550. data/examples/code/classing +0 -35
  551. data/examples/code/failers/badclassnoparam +0 -10
  552. data/examples/code/failers/badclassparam +0 -10
  553. data/examples/code/failers/badcompnoparam +0 -9
  554. data/examples/code/failers/badcompparam +0 -9
  555. data/examples/code/failers/badtypeparam +0 -3
  556. data/examples/code/failers/noobjectrvalue +0 -1
  557. data/examples/code/snippets/aliastest.pp +0 -16
  558. data/examples/code/snippets/argumentdefaults +0 -14
  559. data/examples/code/snippets/casestatement.pp +0 -58
  560. data/examples/code/snippets/classheirarchy.pp +0 -15
  561. data/examples/code/snippets/classincludes.pp +0 -17
  562. data/examples/code/snippets/classpathtest +0 -11
  563. data/examples/code/snippets/componentmetaparams.pp +0 -11
  564. data/examples/code/snippets/deepclassheirarchy.pp +0 -23
  565. data/examples/code/snippets/defineoverrides.pp +0 -17
  566. data/examples/code/snippets/dirchmod +0 -19
  567. data/examples/code/snippets/emptyclass.pp +0 -9
  568. data/examples/code/snippets/emptyexec.pp +0 -3
  569. data/examples/code/snippets/failmissingexecpath.pp +0 -13
  570. data/examples/code/snippets/falsevalues.pp +0 -3
  571. data/examples/code/snippets/filecreate +0 -11
  572. data/examples/code/snippets/implicititeration +0 -15
  573. data/examples/code/snippets/multipleinstances +0 -7
  574. data/examples/code/snippets/namevartest +0 -9
  575. data/examples/code/snippets/scopetest +0 -13
  576. data/examples/code/snippets/selectorvalues.pp +0 -42
  577. data/examples/code/snippets/simpledefaults +0 -5
  578. data/examples/code/snippets/simpleselector +0 -38
  579. data/examples/code/snippets/singleary.pp +0 -19
  580. data/examples/code/snippets/singlequote.pp +0 -11
  581. data/examples/code/snippets/singleselector.pp +0 -22
  582. data/examples/code/snippets/tag.pp +0 -9
  583. data/examples/code/snippets/tagged.pp +0 -35
  584. data/lib/puppet/client.rb +0 -177
  585. data/lib/puppet/client/ca.rb +0 -21
  586. data/lib/puppet/client/dipper.rb +0 -76
  587. data/lib/puppet/client/file.rb +0 -20
  588. data/lib/puppet/client/log.rb +0 -17
  589. data/lib/puppet/client/master.rb +0 -531
  590. data/lib/puppet/client/runner.rb +0 -17
  591. data/lib/puppet/client/status.rb +0 -7
  592. data/lib/puppet/event-loop.rb +0 -1
  593. data/lib/puppet/filetype.rb +0 -308
  594. data/lib/puppet/inifile.rb +0 -201
  595. data/lib/puppet/log.rb +0 -524
  596. data/lib/puppet/metric.rb +0 -132
  597. data/lib/puppet/networkclient.rb +0 -175
  598. data/lib/puppet/parsedfile.rb +0 -58
  599. data/lib/puppet/parser/ast/classdef.rb +0 -79
  600. data/lib/puppet/parser/ast/compdef.rb +0 -75
  601. data/lib/puppet/parser/ast/nodedef.rb +0 -73
  602. data/lib/puppet/parser/ast/objectdef.rb +0 -284
  603. data/lib/puppet/parser/ast/objectref.rb +0 -77
  604. data/lib/puppet/rails/database.rb +0 -40
  605. data/lib/puppet/rails/rails_object.rb +0 -42
  606. data/lib/puppet/rails/rails_parameter.rb +0 -5
  607. data/lib/puppet/server.rb +0 -196
  608. data/lib/puppet/server/authconfig.rb +0 -177
  609. data/lib/puppet/server/authstore.rb +0 -226
  610. data/lib/puppet/server/filebucket.rb +0 -155
  611. data/lib/puppet/server/pelement.rb +0 -188
  612. data/lib/puppet/server/report.rb +0 -184
  613. data/lib/puppet/server/rights.rb +0 -78
  614. data/lib/puppet/server/servlet.rb +0 -274
  615. data/lib/puppet/statechange.rb +0 -129
  616. data/lib/puppet/storage.rb +0 -98
  617. data/lib/puppet/type/nameservice.rb +0 -264
  618. data/lib/puppet/type/nameservice/netinfo.rb +0 -232
  619. data/lib/puppet/type/nameservice/objectadd.rb +0 -146
  620. data/lib/puppet/type/nameservice/posix.rb +0 -12
  621. data/lib/puppet/type/nameservice/pw.rb +0 -107
  622. data/lib/puppet/type/package/apple.rb +0 -41
  623. data/lib/puppet/type/package/apt.rb +0 -107
  624. data/lib/puppet/type/package/blastwave.rb +0 -136
  625. data/lib/puppet/type/package/darwinport.rb +0 -97
  626. data/lib/puppet/type/package/dpkg.rb +0 -113
  627. data/lib/puppet/type/package/freebsd.rb +0 -19
  628. data/lib/puppet/type/package/gem.rb +0 -119
  629. data/lib/puppet/type/package/openbsd.rb +0 -112
  630. data/lib/puppet/type/package/ports.rb +0 -103
  631. data/lib/puppet/type/package/rpm.rb +0 -121
  632. data/lib/puppet/type/package/sun.rb +0 -174
  633. data/lib/puppet/type/package/sunfreeware.rb +0 -7
  634. data/lib/puppet/type/package/yum.rb +0 -52
  635. data/lib/puppet/type/parsedtype/host.rb +0 -144
  636. data/lib/puppet/type/parsedtype/mount.rb +0 -271
  637. data/lib/puppet/type/parsedtype/port.rb +0 -261
  638. data/lib/puppet/type/parsedtype/sshkey.rb +0 -123
  639. data/lib/puppet/type/service/base.rb +0 -12
  640. data/lib/puppet/type/service/debian.rb +0 -46
  641. data/lib/puppet/type/service/redhat.rb +0 -38
  642. data/lib/puppet/type/state.rb +0 -393
  643. data/lib/puppet/type/symlink.rb +0 -186
  644. data/test/client/master.rb +0 -207
  645. data/test/language/rails.rb +0 -105
  646. data/test/other/parsedfile.rb +0 -58
  647. data/test/other/storage.rb +0 -100
  648. data/test/puppet/utiltest.rb +0 -299
  649. data/test/puppettest.rb +0 -1170
  650. data/test/server/authconfig.rb +0 -56
  651. data/test/server/authstore.rb +0 -218
  652. data/test/server/master.rb +0 -201
  653. data/test/server/report.rb +0 -93
  654. data/test/server/rights.rb +0 -41
  655. data/test/server/server.rb +0 -152
  656. data/test/test +0 -61
  657. data/test/types/basic.rb +0 -117
  658. data/test/types/component.rb +0 -298
  659. data/test/types/cron.rb +0 -718
  660. data/test/types/file.rb +0 -1314
  661. data/test/types/filesources.rb +0 -590
  662. data/test/types/group.rb +0 -323
  663. data/test/types/host.rb +0 -186
  664. data/test/types/mount.rb +0 -294
  665. data/test/types/package.rb +0 -538
  666. data/test/types/parameter.rb +0 -107
  667. data/test/types/port.rb +0 -201
  668. data/test/types/query.rb +0 -101
  669. data/test/types/state.rb +0 -92
  670. data/test/types/symlink.rb +0 -120
  671. data/test/types/tidy.rb +0 -102
  672. data/test/types/type.rb +0 -469
  673. data/test/types/user.rb +0 -563
@@ -1,30 +1,27 @@
1
- if __FILE__ == $0
2
- $:.unshift '..'
3
- $:.unshift '../../lib'
4
- $puppetbase = "../.."
5
- end
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
6
4
 
7
5
  require 'puppet'
8
6
  require 'puppet/transaction/report'
9
7
  require 'puppettest'
10
- require 'test/unit'
8
+ require 'puppettest/reporttesting'
11
9
 
12
10
  class TestReports < Test::Unit::TestCase
13
- include TestPuppet
11
+ include PuppetTest
12
+ include PuppetTest::Reporttesting
14
13
 
15
14
  # Make sure we can use reports as log destinations.
16
15
  def test_reports_as_log_destinations
17
- report = nil
18
- assert_nothing_raised {
19
- report = Puppet::Transaction::Report.new
20
- }
16
+ report = fakereport
21
17
 
22
18
  assert_nothing_raised {
23
- Puppet::Log.newdestination(report)
19
+ Puppet::Util::Log.newdestination(report)
24
20
  }
25
21
 
26
22
  # Now make a file for testing logging
27
23
  file = Puppet::Type.newfile(:path => tempfile(), :ensure => "file")
24
+ file.finish
28
25
 
29
26
  log = nil
30
27
  assert_nothing_raised {
@@ -33,12 +30,12 @@ class TestReports < Test::Unit::TestCase
33
30
 
34
31
  assert(report.logs.include?(log), "Report did not get log message")
35
32
 
36
- log = Puppet.info "This is a non-sourced message"
33
+ log = Puppet.warning "This is a non-sourced message"
37
34
 
38
35
  assert(! report.logs.include?(log), "Report got log message")
39
36
 
40
37
  assert_nothing_raised {
41
- Puppet::Log.close(report)
38
+ Puppet::Util::Log.close(report)
42
39
  }
43
40
 
44
41
  log = file.log "This is another message, yo"
@@ -60,12 +57,43 @@ class TestReports < Test::Unit::TestCase
60
57
  }
61
58
  end
62
59
 
63
- if Puppet::Metric.haverrd?
60
+ def test_store_report
61
+ # Create a bunch of log messages in an array.
62
+ report = Puppet::Transaction::Report.new
63
+
64
+ # We have to reuse reporting here because of something going on in the
65
+ # server/report.rb file
66
+ Puppet.config.use(:reporting)
67
+
68
+ 3.times { |i|
69
+ log = Puppet.warning("Report test message %s" % i)
70
+ log.tags = %w{a list of tags}
71
+ log.tags << "tag%s" % i
72
+
73
+ report.newlog(log)
74
+ }
75
+
76
+ assert_nothing_raised do
77
+ report.extend(Puppet::Network::Handler.report.report(:store))
78
+ end
79
+
80
+ yaml = YAML.dump(report)
81
+
82
+ file = nil
83
+ assert_nothing_raised {
84
+ file = report.process(yaml)
85
+ }
86
+
87
+ assert(FileTest.exists?(file), "report file did not get created")
88
+ assert_equal(yaml, File.read(file), "File did not get written")
89
+ end
90
+
91
+ if Puppet.features.rrd?
64
92
  def test_rrdgraph_report
65
93
  Puppet.config.use(:metrics)
66
94
  # First do some work
67
95
  objects = []
68
- 25.times do |i|
96
+ 6.times do |i|
69
97
  file = tempfile()
70
98
 
71
99
  # Make every third file
@@ -88,19 +116,120 @@ class TestReports < Test::Unit::TestCase
88
116
  trans.evaluate
89
117
  }
90
118
 
91
- method = Puppet::Server::Report.report("rrdgraph")
92
- server = nil
93
- assert_nothing_raised {
94
- server = Puppet::Server::Report.new()
95
- }
119
+ report = trans.generate_report
120
+
121
+ assert(! report.metrics.empty?, "Did not receive any metrics")
122
+
123
+ assert_nothing_raised do
124
+ report.extend(Puppet::Network::Handler.report.report(:rrdgraph))
125
+ end
96
126
 
97
127
  assert_nothing_raised {
98
- server.report_rrdgraph(trans.report)
128
+ report.process
99
129
  }
130
+
131
+ hostdir = nil
132
+ assert_nothing_raised do
133
+ hostdir = report.hostdir
134
+ end
135
+
136
+ assert(hostdir, "Did not get hostdir back")
137
+
138
+ assert(FileTest.directory?(hostdir), "Host rrd dir did not get created")
139
+ index = File.join(hostdir, "index.html")
140
+ assert(FileTest.exists?(index), "index file was not created")
141
+
142
+ # Now make sure it creaets each of the rrd files
143
+ %w{changes resources time}.each do |type|
144
+ file = File.join(hostdir, "%s.rrd" % type)
145
+ assert(FileTest.exists?(file), "Did not create rrd file for %s" % type)
146
+
147
+ daily = file.sub ".rrd", "-daily.png"
148
+ assert(FileTest.exists?(daily),
149
+ "Did not make daily graph for %s" % type)
150
+ end
151
+
100
152
  end
101
153
  else
102
154
  $stderr.puts "Install RRD for metric reporting tests"
103
155
  end
156
+
157
+ def test_tagmail_parsing
158
+ report = Object.new
159
+ report.extend(Puppet::Network::Handler.report.report(:tagmail))
160
+
161
+ passers = File.join(datadir, "reports", "tagmail_passers.conf")
162
+ assert(FileTest.exists?(passers), "no passers file %s" % passers)
163
+
164
+ File.readlines(passers).each do |line|
165
+ assert_nothing_raised("Could not parse %s" % line.inspect) do
166
+ report.parse(line)
167
+ end
168
+ end
169
+
170
+ # Now make sure the failers fail
171
+ failers = File.join(datadir, "reports", "tagmail_failers.conf")
172
+ assert(FileTest.exists?(failers), "no failers file %s" % failers)
173
+
174
+ File.readlines(failers).each do |line|
175
+ assert_raise(ArgumentError, "Parsed %s" % line.inspect) do
176
+ report.parse(line)
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_tagmail_parsing_results
182
+ report = Object.new
183
+ report.extend(Puppet::Network::Handler.report.report(:tagmail))
184
+ # Now test a few specific lines to make sure we get the results we want
185
+ {
186
+ "tag: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag}, []],
187
+ "tag, other: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag other}, []],
188
+ "tag-other: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag-other}, []],
189
+ "tag, !other: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag}, %w{other}],
190
+ "tag, !other, one, !two: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag one}, %w{other two}],
191
+ "tag: abuse@domain.com, other@domain.com" => [%w{abuse@domain.com other@domain.com}, %w{tag}, []]
192
+
193
+ }.each do |line, results|
194
+ assert_nothing_raised("Failed to parse %s" % line.inspect) do
195
+ assert_equal(results, report.parse(line).shift, "line %s returned incorrect results %s" % [line.inspect, results.inspect])
196
+ end
197
+ end
198
+ end
199
+
200
+ def test_tagmail_matching
201
+ report = Puppet::Transaction::Report.new
202
+ Puppet::Util::Log.close
203
+ [%w{one}, %w{one two}, %w{one two three}, %w{one two three four}].each do |tags|
204
+ log = Puppet::Util::Log.new(:level => :notice, :message => tags.join(" "), :tags => tags)
205
+
206
+ report << log
207
+ end
208
+
209
+ list = report.logs.collect { |l| l.to_report }
210
+
211
+ report.extend(Puppet::Network::Handler.report.report(:tagmail))
212
+
213
+ {
214
+ [%w{abuse@domain.com}, %w{all}, []] => list,
215
+ [%w{abuse@domain.com}, %w{all}, %w{three}] => list[0..1],
216
+ [%w{abuse@domain.com}, %w{one}, []] => list,
217
+ [%w{abuse@domain.com}, %w{two}, []] => list[1..3],
218
+ [%w{abuse@domain.com}, %w{two}, %w{three}] => list[1..1],
219
+ [%w{abuse@domain.com}, %w{}, %w{one}] => nil
220
+ }.each do |args, expected|
221
+ results = nil
222
+ assert_nothing_raised("Could not match with %s" % args.inspect) do
223
+ results = report.match([args])
224
+ end
225
+
226
+ if expected
227
+ assert_equal([args[0], expected.join("\n")], results[0], "did get correct results for %s" % args.inspect)
228
+ else
229
+ assert_nil(results[0], "got a report for %s" % args.inspect)
230
+ end
231
+ end
232
+ end
104
233
  end
105
234
 
106
- # $Id: report.rb 1359 2006-07-04 16:27:35Z luke $
235
+ # $Id: report.rb 2438 2007-04-30 18:15:01Z luke $
@@ -1,20 +1,71 @@
1
- if __FILE__ == $0
2
- $:.unshift '..'
3
- $:.unshift '../../lib'
4
- $puppetbase = "../.."
5
- end
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
6
4
 
7
5
  require 'puppet'
8
6
  require 'puppettest'
9
- require 'test/unit'
7
+ require 'mocha'
8
+ require 'puppettest/support/resources'
10
9
 
11
- # $Id: transactions.rb 1358 2006-07-04 16:07:47Z luke $
10
+ # $Id: transactions.rb 2372 2007-03-30 00:47:03Z luke $
12
11
 
13
12
  class TestTransactions < Test::Unit::TestCase
14
- include FileTesting
15
-
16
- # In case they're not in more than one group
17
- def test_nothing
13
+ include PuppetTest::FileTesting
14
+ include PuppetTest::Support::Resources
15
+ class Fakeprop <Puppet::Type::Property
16
+ attr_accessor :path, :is, :should, :name
17
+ def should_to_s
18
+ @should.to_s
19
+ end
20
+ def insync?
21
+ true
22
+ end
23
+ def info(*args)
24
+ false
25
+ end
26
+ end
27
+
28
+
29
+ def mkgenerator(&block)
30
+ $finished = []
31
+ cleanup { $finished = nil }
32
+
33
+ # Create a bogus type that generates new instances with shorter
34
+ type = Puppet::Type.newtype(:generator) do
35
+ newparam(:name, :namevar => true)
36
+ def finish
37
+ $finished << self.name
38
+ end
39
+ end
40
+ if block
41
+ type.class_eval(&block)
42
+ end
43
+ cleanup do
44
+ Puppet::Type.rmtype(:generator)
45
+ end
46
+
47
+ return type
48
+ end
49
+
50
+ # Create a new type that generates instances with shorter names.
51
+ def mkreducer(&block)
52
+ type = mkgenerator() do
53
+ def eval_generate
54
+ ret = []
55
+ if title.length > 1
56
+ ret << self.class.create(:title => title[0..-2])
57
+ else
58
+ return nil
59
+ end
60
+ ret
61
+ end
62
+ end
63
+
64
+ if block
65
+ type.class_eval(&block)
66
+ end
67
+
68
+ return type
18
69
  end
19
70
 
20
71
  def test_reports
@@ -35,14 +86,14 @@ class TestTransactions < Test::Unit::TestCase
35
86
  report = nil
36
87
 
37
88
  assert_nothing_raised {
38
- report = trans.report
89
+ report = trans.generate_report
39
90
  }
40
91
 
41
92
  # First test the report logs
42
93
  assert(report.logs.length > 0, "Did not get any report logs")
43
94
 
44
95
  report.logs.each do |obj|
45
- assert_instance_of(Puppet::Log, obj)
96
+ assert_instance_of(Puppet::Util::Log, obj)
46
97
  end
47
98
 
48
99
  # Then test the metrics
@@ -51,12 +102,74 @@ class TestTransactions < Test::Unit::TestCase
51
102
  assert(metrics, "Did not get any metrics")
52
103
  assert(metrics.length > 0, "Did not get any metrics")
53
104
 
54
- assert(metrics.has_key?("objects"), "Did not get object metrics")
105
+ assert(metrics.has_key?("resources"), "Did not get object metrics")
55
106
  assert(metrics.has_key?("changes"), "Did not get change metrics")
56
107
 
57
108
  metrics.each do |name, metric|
58
- assert_instance_of(Puppet::Metric, metric)
109
+ assert_instance_of(Puppet::Util::Metric, metric)
110
+ end
111
+ end
112
+
113
+ def test_prefetch
114
+ # Create a type just for testing prefetch
115
+ name = :prefetchtesting
116
+ $prefetched = false
117
+ type = Puppet::Type.newtype(name) do
118
+ newparam(:name) {}
119
+ end
120
+
121
+ cleanup do
122
+ Puppet::Type.rmtype(name)
123
+ end
124
+
125
+ # Now create a provider
126
+ type.provide(:prefetch) do
127
+ def self.prefetch
128
+ $prefetched = true
129
+ end
130
+ end
131
+
132
+ # Now create an instance
133
+ inst = type.create :name => "yay"
134
+
135
+ # Create a transaction
136
+ trans = Puppet::Transaction.new(newcomp(inst))
137
+
138
+ # Make sure prefetch works
139
+ assert_nothing_raised do
140
+ trans.prefetch
141
+ end
142
+
143
+ assert_equal(true, $prefetched, "type prefetch was not called")
144
+
145
+ # Now make sure it gets called from within evaluate()
146
+ $prefetched = false
147
+ assert_nothing_raised do
148
+ trans.evaluate
59
149
  end
150
+
151
+ assert_equal(true, $prefetched, "evaluate did not call prefetch")
152
+ end
153
+
154
+ def test_refreshes_generate_events
155
+ path = tempfile()
156
+ firstpath = tempfile()
157
+ secondpath = tempfile()
158
+ file = Puppet::Type.newfile(:title => "file", :path => path, :content => "yayness")
159
+ first = Puppet::Type.newexec(:title => "first",
160
+ :command => "/bin/echo first > #{firstpath}",
161
+ :subscribe => [:file, path],
162
+ :refreshonly => true
163
+ )
164
+ second = Puppet::Type.newexec(:title => "second",
165
+ :command => "/bin/echo second > #{secondpath}",
166
+ :subscribe => [:exec, "first"],
167
+ :refreshonly => true
168
+ )
169
+
170
+ assert_apply(file, first, second)
171
+
172
+ assert(FileTest.exists?(secondpath), "Refresh did not generate an event")
60
173
  end
61
174
 
62
175
  unless %x{groups}.chomp.split(/ /).length > 1
@@ -110,18 +223,6 @@ class TestTransactions < Test::Unit::TestCase
110
223
  }
111
224
  end
112
225
 
113
- def newservice
114
- assert_nothing_raised() {
115
- return Puppet.type(:service).create(
116
- :name => "sleeper",
117
- :type => "init",
118
- :path => File.join($puppetbase,"examples/root/etc/init.d"),
119
- :hasstatus => true,
120
- :check => [:ensure]
121
- )
122
- }
123
- end
124
-
125
226
  def newexec(file)
126
227
  assert_nothing_raised() {
127
228
  return Puppet.type(:exec).create(
@@ -137,7 +238,7 @@ class TestTransactions < Test::Unit::TestCase
137
238
  transaction = nil
138
239
  file = newfile()
139
240
 
140
- states = {}
241
+ properties = {}
141
242
  check = [:group,:mode]
142
243
  file[:check] = check
143
244
 
@@ -146,9 +247,9 @@ class TestTransactions < Test::Unit::TestCase
146
247
  }
147
248
 
148
249
  assert_nothing_raised() {
149
- check.each { |state|
150
- assert(file[state])
151
- states[state] = file[state]
250
+ check.each { |property|
251
+ assert(file[property])
252
+ properties[property] = file[property]
152
253
  }
153
254
  }
154
255
 
@@ -174,33 +275,13 @@ class TestTransactions < Test::Unit::TestCase
174
275
  assert_nothing_raised() {
175
276
  file.retrieve
176
277
  }
177
- states.each { |state,value|
278
+ properties.each { |property,value|
178
279
  assert_equal(
179
- value,file.is(state), "File %s remained %s" % [state, file.is(state)]
280
+ value,file.is(property), "File %s remained %s" % [property, file.is(property)]
180
281
  )
181
282
  }
182
283
  end
183
284
 
184
- # start a service, and then roll the modification back
185
- # Disabled, because it wasn't really worth the effort.
186
- def disabled_test_servicetrans
187
- transaction = nil
188
- service = newservice()
189
-
190
- component = newcomp("service",service)
191
-
192
- assert_nothing_raised() {
193
- service[:ensure] = 1
194
- }
195
- service.retrieve
196
- assert(service.insync?, "Service did not start")
197
- system("ps -ef | grep ruby")
198
- trans = assert_events([:service_started], component)
199
- service.retrieve
200
-
201
- assert_rollback_events(trans, [:service_stopped], "service")
202
- end
203
-
204
285
  # test that services are correctly restarted and that work is done
205
286
  # in the right order
206
287
  def test_refreshing
@@ -208,9 +289,12 @@ class TestTransactions < Test::Unit::TestCase
208
289
  file = newfile()
209
290
  execfile = File.join(tmpdir(), "exectestingness")
210
291
  exec = newexec(execfile)
211
- states = {}
292
+ properties = {}
212
293
  check = [:group,:mode]
213
294
  file[:check] = check
295
+ file[:group] = @groups[0]
296
+
297
+ assert_apply(file)
214
298
 
215
299
  @@tmpfiles << execfile
216
300
 
@@ -225,14 +309,14 @@ class TestTransactions < Test::Unit::TestCase
225
309
  exec.retrieve
226
310
  }
227
311
 
228
- check.each { |state|
229
- states[state] = file[state]
312
+ check.each { |property|
313
+ properties[property] = file[property]
230
314
  }
231
315
  assert_nothing_raised() {
232
316
  file[:mode] = "755"
233
317
  }
234
318
 
235
- trans = assert_events([:file_changed], component)
319
+ trans = assert_events([:file_changed, :triggered], component)
236
320
 
237
321
  assert(FileTest.exists?(execfile), "Execfile does not exist")
238
322
  File.unlink(execfile)
@@ -240,19 +324,23 @@ class TestTransactions < Test::Unit::TestCase
240
324
  file[:group] = @groups[1]
241
325
  }
242
326
 
243
- trans = assert_events([:file_changed], component)
327
+ trans = assert_events([:file_changed, :triggered], component)
244
328
  assert(FileTest.exists?(execfile), "Execfile does not exist")
245
329
  end
246
330
 
247
- def test_refreshAcrossTwoComponents
331
+ # Verify that one component requiring another causes the contained
332
+ # resources in the requiring component to get refreshed.
333
+ def test_refresh_across_two_components
248
334
  transaction = nil
249
335
  file = newfile()
250
336
  execfile = File.join(tmpdir(), "exectestingness2")
251
337
  @@tmpfiles << execfile
252
338
  exec = newexec(execfile)
253
- states = {}
339
+ properties = {}
254
340
  check = [:group,:mode]
255
341
  file[:check] = check
342
+ file[:group] = @groups[0]
343
+ assert_apply(file)
256
344
 
257
345
  fcomp = newcomp("file",file)
258
346
  ecomp = newcomp("exec",exec)
@@ -261,7 +349,7 @@ class TestTransactions < Test::Unit::TestCase
261
349
 
262
350
  # 'subscribe' expects an array of arrays
263
351
  #component[:require] = [[file.class.name,file.name]]
264
- ecomp[:subscribe] = [[fcomp.class.name,fcomp.name]]
352
+ ecomp[:subscribe] = fcomp
265
353
  exec[:refreshonly] = true
266
354
 
267
355
  trans = assert_events([], component)
@@ -271,8 +359,7 @@ class TestTransactions < Test::Unit::TestCase
271
359
  file[:mode] = "755"
272
360
  }
273
361
 
274
- trans = assert_events([:file_changed, :file_changed], component)
275
-
362
+ trans = assert_events([:file_changed, :file_changed, :triggered], component)
276
363
  end
277
364
 
278
365
  # Make sure that multiple subscriptions get triggered.
@@ -311,25 +398,29 @@ class TestTransactions < Test::Unit::TestCase
311
398
  :path => path,
312
399
  :ensure => "file"
313
400
  )
314
- svc = Puppet.type(:service).create(
315
- :name => "thisservicedoesnotexist",
316
- :subscribe => [:file, path]
401
+ exec1 = Puppet.type(:exec).create(
402
+ :path => ENV["PATH"],
403
+ :command => "touch /this/cannot/possibly/exist",
404
+ :logoutput => true,
405
+ :refreshonly => true,
406
+ :subscribe => file,
407
+ :title => "one"
317
408
  )
318
- exec = Puppet.type(:exec).create(
409
+ exec2 = Puppet.type(:exec).create(
319
410
  :path => ENV["PATH"],
320
411
  :command => "touch %s" % newfile,
321
412
  :logoutput => true,
322
413
  :refreshonly => true,
323
- :subscribe => [:file, path]
414
+ :subscribe => [file, exec1],
415
+ :title => "two"
324
416
  )
325
417
 
326
- assert_apply(file, svc, exec)
327
- assert(FileTest.exists?(path), "File did not get created")
418
+ assert_apply(file, exec1, exec2)
328
419
  assert(FileTest.exists?(newfile), "Refresh file did not get created")
329
420
  end
330
421
 
331
422
  # Make sure that unscheduled and untagged objects still respond to events
332
- def test_unscheduledanduntaggedresponse
423
+ def test_unscheduled_and_untagged_response
333
424
  Puppet::Type.type(:schedule).mkdefaultschedules
334
425
  Puppet[:ignoreschedules] = false
335
426
  file = Puppet.type(:file).create(
@@ -359,7 +450,7 @@ class TestTransactions < Test::Unit::TestCase
359
450
 
360
451
  file[:content] = "some content"
361
452
 
362
- assert_events([:file_changed], comp)
453
+ assert_events([:file_changed, :triggered], comp)
363
454
  assert(FileTest.exists?(fname), "File did not get recreated")
364
455
 
365
456
  # Now remove it, so it can get created again
@@ -377,30 +468,685 @@ class TestTransactions < Test::Unit::TestCase
377
468
 
378
469
  assert(! file.insync?, "Uh, file is in sync?")
379
470
 
380
- assert_events([:file_changed], comp)
471
+ assert_events([:file_changed, :triggered], comp)
381
472
  assert(FileTest.exists?(fname), "File did not get recreated")
382
473
  end
383
474
 
384
475
  def test_failed_reqs_mean_no_run
385
476
  exec = Puppet::Type.type(:exec).create(
386
477
  :command => "/bin/mkdir /this/path/cannot/possibly/exit",
387
- :name => "mkdir"
478
+ :title => "mkdir"
388
479
  )
389
480
 
390
- file = Puppet::Type.type(:file).create(
481
+ file1 = Puppet::Type.type(:file).create(
482
+ :title => "file1",
391
483
  :path => tempfile(),
392
- :require => ["exec", "mkdir"],
484
+ :require => exec,
393
485
  :ensure => :file
394
486
  )
395
487
 
396
- comp = newcomp(exec, file)
488
+ file2 = Puppet::Type.type(:file).create(
489
+ :title => "file2",
490
+ :path => tempfile(),
491
+ :require => file1,
492
+ :ensure => :file
493
+ )
494
+
495
+ comp = newcomp(exec, file1, file2)
397
496
 
398
497
  comp.finalize
399
498
 
400
499
  assert_apply(comp)
401
500
 
402
- assert(! FileTest.exists?(file[:path]),
501
+ assert(! FileTest.exists?(file1[:path]),
403
502
  "File got created even tho its dependency failed")
503
+ assert(! FileTest.exists?(file2[:path]),
504
+ "File got created even tho its deep dependency failed")
505
+ end
506
+ end
507
+
508
+ def f(n)
509
+ Puppet::Type.type(:file)["/tmp/#{n.to_s}"]
510
+ end
511
+
512
+ def test_relationship_graph
513
+ one, two, middle, top = mktree
514
+
515
+ {one => two, "f" => "c", "h" => middle}.each do |source, target|
516
+ if source.is_a?(String)
517
+ source = f(source)
518
+ end
519
+ if target.is_a?(String)
520
+ target = f(target)
521
+ end
522
+ target[:require] = source
523
+ end
524
+
525
+ trans = Puppet::Transaction.new(top)
526
+
527
+ graph = nil
528
+ assert_nothing_raised do
529
+ graph = trans.relationship_graph
530
+ end
531
+
532
+ assert_instance_of(Puppet::PGraph, graph,
533
+ "Did not get relationship graph")
534
+
535
+ # Make sure all of the components are gone
536
+ comps = graph.vertices.find_all { |v| v.is_a?(Puppet::Type::Component)}
537
+ assert(comps.empty?, "Deps graph still contains components %s" %
538
+ comps.collect { |c| c.ref }.join(","))
539
+
540
+ assert_equal([], comps, "Deps graph still contains components")
541
+
542
+ # It must be reversed because of how topsort works
543
+ sorted = graph.topsort.reverse
544
+
545
+ # Now make sure the appropriate edges are there and are in the right order
546
+ assert(graph.dependents(f(:f)).include?(f(:c)),
547
+ "c not marked a dep of f")
548
+ assert(sorted.index(f(:c)) < sorted.index(f(:f)),
549
+ "c is not before f")
550
+
551
+ one.each do |o|
552
+ two.each do |t|
553
+ assert(graph.dependents(o).include?(t),
554
+ "%s not marked a dep of %s" % [t.ref, o.ref])
555
+ assert(sorted.index(t) < sorted.index(o),
556
+ "%s is not before %s" % [t.ref, o.ref])
557
+ end
558
+ end
559
+
560
+ trans.resources.leaves(middle).each do |child|
561
+ assert(graph.dependents(f(:h)).include?(child),
562
+ "%s not marked a dep of h" % [child.ref])
563
+ assert(sorted.index(child) < sorted.index(f(:h)),
564
+ "%s is not before h" % child.ref)
565
+ end
566
+
567
+ # Lastly, make sure our 'g' vertex made it into the relationship
568
+ # graph, since it's not involved in any relationships.
569
+ assert(graph.vertex?(f(:g)),
570
+ "Lost vertexes with no relations")
571
+
572
+ # Now make the reversal graph and make sure all of the vertices made it into that
573
+ reverse = graph.reversal
574
+ %w{a b c d e f g h}.each do |letter|
575
+ file = f(letter)
576
+ assert(reverse.vertex?(file), "%s did not make it into reversal" % letter)
577
+ end
578
+ end
579
+
580
+ # Test pre-evaluation generation
581
+ def test_generate
582
+ mkgenerator() do
583
+ def generate
584
+ ret = []
585
+ if title.length > 1
586
+ ret << self.class.create(:title => title[0..-2])
587
+ else
588
+ return nil
589
+ end
590
+ ret
591
+ end
592
+ end
593
+
594
+ yay = Puppet::Type.newgenerator :title => "yay"
595
+ rah = Puppet::Type.newgenerator :title => "rah"
596
+ comp = newcomp(yay, rah)
597
+ trans = comp.evaluate
598
+
599
+ assert_nothing_raised do
600
+ trans.generate
601
+ end
602
+
603
+ %w{ya ra y r}.each do |name|
604
+ assert(trans.resources.vertex?(Puppet::Type.type(:generator)[name]),
605
+ "Generated %s was not a vertex" % name)
606
+ assert($finished.include?(name), "%s was not finished" % name)
607
+ end
608
+
609
+ # Now make sure that cleanup gets rid of those generated types.
610
+ assert_nothing_raised do
611
+ trans.cleanup
612
+ end
613
+
614
+ %w{ya ra y r}.each do |name|
615
+ assert(!trans.resources.vertex?(Puppet::Type.type(:generator)[name]),
616
+ "Generated vertex %s was not removed from graph" % name)
617
+ assert_nil(Puppet::Type.type(:generator)[name],
618
+ "Generated vertex %s was not removed from class" % name)
619
+ end
620
+ end
621
+
622
+ # Test mid-evaluation generation.
623
+ def test_eval_generate
624
+ $evaluated = []
625
+ cleanup { $evaluated = nil }
626
+ type = mkreducer() do
627
+ def evaluate
628
+ $evaluated << self.title
629
+ return []
630
+ end
631
+ end
632
+
633
+ yay = Puppet::Type.newgenerator :title => "yay"
634
+ rah = Puppet::Type.newgenerator :title => "rah", :subscribe => yay
635
+ comp = newcomp(yay, rah)
636
+ trans = comp.evaluate
637
+
638
+ trans.prepare
639
+
640
+ # Now apply the resources, and make sure they appropriately generate
641
+ # things.
642
+ assert_nothing_raised("failed to apply yay") do
643
+ trans.eval_resource(yay)
644
+ end
645
+ ya = type["ya"]
646
+ assert(ya, "Did not generate ya")
647
+ assert(trans.relgraph.vertex?(ya),
648
+ "Did not add ya to rel_graph")
649
+
650
+ # Now make sure the appropriate relationships were added
651
+ assert(trans.relgraph.edge?(yay, ya),
652
+ "parent was not required by child")
653
+ assert(! trans.relgraph.edge?(ya, rah),
654
+ "generated child ya inherited depencency on rah")
655
+
656
+ # Now make sure it in turn eval_generates appropriately
657
+ assert_nothing_raised("failed to apply yay") do
658
+ trans.eval_resource(type["ya"])
659
+ end
660
+
661
+ %w{y}.each do |name|
662
+ res = type[name]
663
+ assert(res, "Did not generate %s" % name)
664
+ assert(trans.relgraph.vertex?(res),
665
+ "Did not add %s to rel_graph" % name)
666
+ assert($finished.include?("y"), "y was not finished")
667
+ end
668
+
669
+ assert_nothing_raised("failed to eval_generate with nil response") do
670
+ trans.eval_resource(type["y"])
671
+ end
672
+ assert(trans.relgraph.edge?(yay, ya), "no edge was created for ya => yay")
673
+
674
+ assert_nothing_raised("failed to apply rah") do
675
+ trans.eval_resource(rah)
676
+ end
677
+
678
+ ra = type["ra"]
679
+ assert(ra, "Did not generate ra")
680
+ assert(trans.relgraph.vertex?(ra),
681
+ "Did not add ra to rel_graph" % name)
682
+ assert($finished.include?("ra"), "y was not finished")
683
+
684
+ # Now make sure this generated resource has the same relationships as
685
+ # the generating resource
686
+ assert(! trans.relgraph.edge?(yay, ra),
687
+ "rah passed its dependencies on to its children")
688
+ assert(! trans.relgraph.edge?(ya, ra),
689
+ "children have a direct relationship")
690
+
691
+ # Now make sure that cleanup gets rid of those generated types.
692
+ assert_nothing_raised do
693
+ trans.cleanup
694
+ end
695
+
696
+ %w{ya ra y r}.each do |name|
697
+ assert(!trans.relgraph.vertex?(type[name]),
698
+ "Generated vertex %s was not removed from graph" % name)
699
+ assert_nil(type[name],
700
+ "Generated vertex %s was not removed from class" % name)
701
+ end
702
+
703
+ # Now, start over and make sure that everything gets evaluated.
704
+ trans = comp.evaluate
705
+ $evaluated.clear
706
+ assert_nothing_raised do
707
+ trans.evaluate
708
+ end
709
+
710
+ assert_equal(%w{yay ya y rah ra r}, $evaluated,
711
+ "Not all resources were evaluated or not in the right order")
712
+ end
713
+
714
+ def test_tags
715
+ res = Puppet::Type.newfile :path => tempfile()
716
+ comp = newcomp(res)
717
+
718
+ # Make sure they default to none
719
+ assert_equal([], comp.evaluate.tags)
720
+
721
+ # Make sure we get the main tags
722
+ Puppet[:tags] = %w{this is some tags}
723
+ assert_equal(%w{this is some tags}, comp.evaluate.tags)
724
+
725
+ # And make sure they get processed correctly
726
+ Puppet[:tags] = ["one", "two,three", "four"]
727
+ assert_equal(%w{one two three four}, comp.evaluate.tags)
728
+
729
+ # lastly, make sure we can override them
730
+ trans = comp.evaluate
731
+ trans.tags = ["one", "two,three", "four"]
732
+ assert_equal(%w{one two three four}, comp.evaluate.tags)
733
+ end
734
+
735
+ def test_tagged?
736
+ res = Puppet::Type.newfile :path => tempfile()
737
+ comp = newcomp(res)
738
+ trans = comp.evaluate
739
+
740
+ assert(trans.tagged?(res), "tagged? defaulted to false")
741
+
742
+ # Now set some tags
743
+ trans.tags = %w{some tags}
744
+
745
+ # And make sure it's false
746
+ assert(! trans.tagged?(res), "matched invalid tags")
747
+
748
+ # Set ignoretags and make sure it sticks
749
+ trans.ignoretags = true
750
+ assert(trans.tagged?(res), "tags were not ignored")
751
+
752
+ # Now make sure we actually correctly match tags
753
+ res[:tag] = "mytag"
754
+ trans.ignoretags = false
755
+ trans.tags = %w{notag}
756
+
757
+ assert(! trans.tagged?(res), "tags incorrectly matched")
758
+
759
+ trans.tags = %w{mytag yaytag}
760
+ assert(trans.tagged?(res), "tags should have matched")
761
+ end
762
+
763
+ # Make sure changes generated by eval_generated resources have proxies
764
+ # set to the top-level resource.
765
+ def test_proxy_resources
766
+ type = mkreducer do
767
+ def evaluate
768
+ return Puppet::PropertyChange.new(Fakeprop.new(
769
+ :path => :path, :is => :is, :should => :should, :name => self.name, :parent => "a parent"))
770
+ end
771
+ end
772
+
773
+ resource = type.create :name => "test"
774
+ comp = newcomp(resource)
775
+ trans = comp.evaluate
776
+ trans.prepare
777
+
778
+ assert_nothing_raised do
779
+ trans.eval_resource(resource)
780
+ end
781
+
782
+ changes = trans.instance_variable_get("@changes")
783
+
784
+ assert(changes.length > 0, "did not get any changes")
785
+
786
+ changes.each do |change|
787
+ assert_equal(resource, change.source, "change did not get proxy set correctly")
788
+ end
789
+ end
790
+
791
+ # Make sure changes in contained files still generate callback events.
792
+ def test_generated_callbacks
793
+ dir = tempfile()
794
+ maker = tempfile()
795
+ Dir.mkdir(dir)
796
+ file = File.join(dir, "file")
797
+ File.open(file, "w") { |f| f.puts "" }
798
+ File.chmod(0644, file)
799
+ File.chmod(0755, dir) # So only the child file causes a change
800
+
801
+ dirobj = Puppet::Type.type(:file).create :mode => "755", :recurse => true, :path => dir
802
+ exec = Puppet::Type.type(:exec).create :title => "make",
803
+ :command => "touch #{maker}", :path => ENV['PATH'], :refreshonly => true,
804
+ :subscribe => dirobj
805
+
806
+ assert_apply(dirobj, exec)
807
+ assert(FileTest.exists?(maker), "Did not make callback file")
808
+ end
809
+
810
+ # Yay, this out to be fun.
811
+ def test_trigger
812
+ $triggered = []
813
+ cleanup { $triggered = nil }
814
+ trigger = Class.new do
815
+ attr_accessor :name
816
+ include Puppet::Util::Logging
817
+ def initialize(name)
818
+ @name = name
819
+ end
820
+ def ref
821
+ self.name
822
+ end
823
+ def refresh
824
+ $triggered << self.name
825
+ end
826
+
827
+ def to_s
828
+ self.name
829
+ end
830
+ end
831
+
832
+ # Make a graph with some stuff in it.
833
+ graph = Puppet::PGraph.new
834
+
835
+ # Add a non-triggering edge.
836
+ a = trigger.new(:a)
837
+ b = trigger.new(:b)
838
+ c = trigger.new(:c)
839
+ nope = Puppet::Relationship.new(a, b)
840
+ yep = Puppet::Relationship.new(a, c, {:callback => :refresh})
841
+ graph.add_edge!(nope)
842
+
843
+ # And a triggering one.
844
+ graph.add_edge!(yep)
845
+
846
+ # Create our transaction
847
+ trans = Puppet::Transaction.new(graph)
848
+
849
+ # Set the non-triggering on
850
+ assert_nothing_raised do
851
+ trans.set_trigger(nope)
852
+ end
853
+
854
+ assert(! trans.targeted?(b), "b is incorrectly targeted")
855
+
856
+ # Now set the other
857
+ assert_nothing_raised do
858
+ trans.set_trigger(yep)
859
+ end
860
+ assert(trans.targeted?(c), "c is not targeted")
861
+
862
+ # Now trigger our three resources
863
+ assert_nothing_raised do
864
+ assert_nil(trans.trigger(a), "a somehow triggered something")
865
+ end
866
+ assert_nothing_raised do
867
+ assert_nil(trans.trigger(b), "b somehow triggered something")
868
+ end
869
+ assert_equal([], $triggered,"got something in triggered")
870
+ result = nil
871
+ assert_nothing_raised do
872
+ result = trans.trigger(c)
873
+ end
874
+ assert(result, "c did not trigger anything")
875
+ assert_instance_of(Array, result)
876
+ event = result.shift
877
+ assert_instance_of(Puppet::Event, event)
878
+ assert_equal(:triggered, event.event, "event was not set correctly")
879
+ assert_equal(c, event.source, "source was not set correctly")
880
+ assert_equal(trans, event.transaction, "transaction was not set correctly")
881
+
882
+ assert(trans.triggered?(c, :refresh),
883
+ "Transaction did not store the trigger")
404
884
  end
885
+
886
+ def test_graph
887
+ Puppet.config.use(:puppet)
888
+ # Make a graph
889
+ graph = Puppet::PGraph.new
890
+ graph.add_edge!("a", "b")
891
+
892
+ # Create our transaction
893
+ trans = Puppet::Transaction.new(graph)
894
+
895
+ assert_nothing_raised do
896
+ trans.graph(graph, :testing)
897
+ end
898
+
899
+ dotfile = File.join(Puppet[:graphdir], "testing.dot")
900
+ assert(! FileTest.exists?(dotfile), "Enabled graphing even tho disabled")
901
+
902
+ # Now enable graphing
903
+ Puppet[:graph] = true
904
+
905
+ assert_nothing_raised do
906
+ trans.graph(graph, :testing)
907
+ end
908
+ assert(FileTest.exists?(dotfile), "Did not create graph.")
909
+ end
910
+
911
+ def test_created_graphs
912
+ FileUtils.mkdir_p(Puppet[:graphdir])
913
+ file = Puppet::Type.newfile(:path => tempfile, :content => "yay")
914
+ exec = Puppet::Type.type(:exec).create(:command => "echo yay", :path => ENV['PATH'],
915
+ :require => file)
916
+
917
+ Puppet[:graph] = true
918
+ assert_apply(file, exec)
919
+
920
+ %w{resources relationships expanded_relationships}.each do |name|
921
+ file = File.join(Puppet[:graphdir], "%s.dot" % name)
922
+ assert(FileTest.exists?(file), "graph for %s was not created" % name)
923
+ end
924
+ end
925
+
926
+ def test_set_target
927
+ file = Puppet::Type.newfile(:path => tempfile(), :content => "yay")
928
+ exec1 = Puppet::Type.type(:exec).create :command => "/bin/echo exec1"
929
+ exec2 = Puppet::Type.type(:exec).create :command => "/bin/echo exec2"
930
+ trans = Puppet::Transaction.new(newcomp(file, exec1, exec2))
931
+
932
+ # First try it with an edge that has no callback
933
+ edge = Puppet::Relationship.new(file, exec1)
934
+ assert_nothing_raised { trans.set_trigger(edge) }
935
+ assert(! trans.targeted?(exec1), "edge with no callback resulted in a target")
936
+
937
+ # Now with an edge that has an unsupported callback
938
+ edge = Puppet::Relationship.new(file, exec1, :callback => :nosuchmethod, :event => :ALL_EVENTS)
939
+ assert_nothing_raised { trans.set_trigger(edge) }
940
+ assert(! trans.targeted?(exec1), "edge with invalid callback resulted in a target")
941
+
942
+ # Lastly, with an edge with a supported callback
943
+ edge = Puppet::Relationship.new(file, exec1, :callback => :refresh, :event => :ALL_EVENTS)
944
+ assert_nothing_raised { trans.set_trigger(edge) }
945
+ assert(trans.targeted?(exec1), "edge with valid callback did not result in a target")
946
+ end
947
+
948
+ # Testing #401 -- transactions are calling refresh() on classes that don't support it.
949
+ def test_callback_availability
950
+ $called = []
951
+ klass = Puppet::Type.newtype(:norefresh) do
952
+ newparam(:name, :namevar => true) {}
953
+ def method_missing(method, *args)
954
+ $called << method
955
+ end
956
+ end
957
+ cleanup do
958
+ $called = nil
959
+ Puppet::Type.rmtype(:norefresh)
960
+ end
961
+
962
+ file = Puppet::Type.newfile :path => tempfile(), :content => "yay"
963
+ one = klass.create :name => "one", :subscribe => file
964
+
965
+ assert_apply(file, one)
966
+
967
+ assert(! $called.include?(:refresh), "Called refresh when it wasn't set as a method")
968
+ end
969
+
970
+ # Testing #437 - cyclic graphs should throw failures.
971
+ def test_fail_on_cycle
972
+ one = Puppet::Type.type(:exec).create(:name => "/bin/echo one")
973
+ two = Puppet::Type.type(:exec).create(:name => "/bin/echo two")
974
+ one[:require] = two
975
+ two[:require] = one
976
+
977
+ trans = newcomp(one, two).evaluate
978
+ assert_raise(Puppet::Error) do
979
+ trans.prepare
980
+ end
981
+ end
982
+
983
+ def test_errors_during_generation
984
+ type = Puppet::Type.newtype(:failer) do
985
+ newparam(:name) {}
986
+ def eval_generate
987
+ raise ArgumentError, "Invalid value"
988
+ end
989
+ def generate
990
+ raise ArgumentError, "Invalid value"
991
+ end
992
+ end
993
+ cleanup { Puppet::Type.rmtype(:failer) }
994
+
995
+ obj = type.create(:name => "testing")
996
+
997
+ assert_apply(obj)
998
+ end
999
+
1000
+ def test_self_refresh_causes_triggering
1001
+ type = Puppet::Type.newtype(:refresher, :self_refresh => true) do
1002
+ attr_accessor :refreshed, :testing
1003
+ newparam(:name) {}
1004
+ newproperty(:testing) do
1005
+ def sync
1006
+ self.is = self.should
1007
+ :ran_testing
1008
+ end
1009
+ end
1010
+ def refresh
1011
+ @refreshed = true
1012
+ end
1013
+ end
1014
+ cleanup { Puppet::Type.rmtype(:refresher)}
1015
+
1016
+ obj = type.create(:name => "yay", :testing => "cool")
1017
+
1018
+ assert(! obj.insync?, "fake object is already in sync")
1019
+
1020
+ # Now make sure it gets refreshed when the change happens
1021
+ assert_apply(obj)
1022
+ assert(obj.refreshed, "object was not refreshed during transaction")
1023
+ end
1024
+
1025
+ # Testing #433
1026
+ def test_explicit_dependencies_beat_automatic
1027
+ # Create a couple of different resource sets that have automatic relationships and make sure the manual relationships win
1028
+ rels = {}
1029
+ # First users and groups
1030
+ group = Puppet::Type.type(:group).create(:name => nonrootgroup.name, :ensure => :present)
1031
+ user = Puppet::Type.type(:user).create(:name => nonrootuser.name, :ensure => :present, :gid => group.title)
1032
+
1033
+ # Now add the explicit relationship
1034
+ group[:require] = user
1035
+ rels[group] = user
1036
+ # Now files
1037
+ d = tempfile()
1038
+ f = File.join(d, "file")
1039
+ file = Puppet::Type.newfile(:path => f, :content => "yay")
1040
+ dir = Puppet::Type.newfile(:path => d, :ensure => :directory, :require => file)
1041
+
1042
+ rels[dir] = file
1043
+ rels.each do |after, before|
1044
+ comp = newcomp(before, after)
1045
+ trans = comp.evaluate
1046
+ str = "from %s to %s" % [before, after]
1047
+
1048
+ assert_nothing_raised("Failed to create graph %s" % str) do
1049
+ trans.prepare
1050
+ end
1051
+
1052
+ graph = trans.relgraph
1053
+ assert(graph.edge?(before, after), "did not create manual relationship %s" % str)
1054
+ assert(! graph.edge?(after, before), "created automatic relationship %s" % str)
1055
+ end
1056
+ end
1057
+
1058
+ def test_labeled_deps_beat_unlabeled
1059
+ one = Puppet::Type.type(:exec).create :command => "/bin/echo one"
1060
+ two = Puppet::Type.type(:exec).create :command => "/bin/echo two"
1061
+
1062
+ one[:require] = two
1063
+ one[:subscribe] = two
1064
+
1065
+ comp = newcomp(one, two)
1066
+ trans = Puppet::Transaction.new(comp)
1067
+ graph = trans.relationship_graph
1068
+
1069
+ label = graph.edge_label(two, one)
1070
+ assert(label, "require beat subscribe")
1071
+ assert_equal(:refresh, label[:callback],
1072
+ "did not get correct callback from subscribe")
1073
+
1074
+ one.delete(:require)
1075
+ one.delete(:subscribe)
1076
+
1077
+ two[:before] = one
1078
+ two[:notify] = one
1079
+
1080
+ trans = Puppet::Transaction.new(comp)
1081
+ graph = trans.relationship_graph
1082
+
1083
+ label = graph.edge_label(two, one)
1084
+ assert(label, "before beat notify")
1085
+ assert_equal(:refresh, label[:callback],
1086
+ "did not get correct callback from notify")
1087
+ end
1088
+
1089
+ # #542 - make sure resources in noop mode still notify their resources,
1090
+ # so that users know if a service will get restarted.
1091
+ def test_noop_with_notify
1092
+ path = tempfile
1093
+ epath = tempfile
1094
+ spath = tempfile
1095
+ file = Puppet::Type.newfile(:path => path, :ensure => :file,
1096
+ :title => "file")
1097
+ exec = Puppet::Type.type(:exec).create(:command => "touch %s" % epath,
1098
+ :path => ENV["PATH"], :subscribe => file, :refreshonly => true,
1099
+ :title => 'exec1')
1100
+ exec2 = Puppet::Type.type(:exec).create(:command => "touch %s" % spath,
1101
+ :path => ENV["PATH"], :subscribe => exec, :refreshonly => true,
1102
+ :title => 'exec2')
1103
+
1104
+ Puppet[:noop] = true
1105
+
1106
+ assert(file.noop, "file not in noop")
1107
+ assert(exec.noop, "exec not in noop")
1108
+
1109
+ @logs.clear
1110
+ assert_apply(file, exec, exec2)
1111
+
1112
+ assert(! FileTest.exists?(path), "Created file in noop")
1113
+ assert(! FileTest.exists?(epath), "Executed exec in noop")
1114
+ assert(! FileTest.exists?(spath), "Executed second exec in noop")
1115
+
1116
+ assert(@logs.detect { |l|
1117
+ l.message =~ /should be/ and l.source == file.property(:ensure).path},
1118
+ "did not log file change")
1119
+ assert(@logs.detect { |l|
1120
+ l.message =~ /Would have/ and l.source == exec.path },
1121
+ "did not log first exec trigger")
1122
+ assert(@logs.detect { |l|
1123
+ l.message =~ /Would have/ and l.source == exec2.path },
1124
+ "did not log second exec trigger")
1125
+ end
1126
+
1127
+ def test_only_stop_purging_with_relations
1128
+ files = []
1129
+ paths = []
1130
+ 3.times do |i|
1131
+ path = tempfile
1132
+ paths << path
1133
+ file = Puppet::Type.newfile(:path => path, :ensure => :absent,
1134
+ :backup => false, :title => "file%s" % i)
1135
+ File.open(path, "w") { |f| f.puts "" }
1136
+ files << file
1137
+ end
1138
+
1139
+ files[0][:ensure] = :file
1140
+ files[0][:require] = files[1..2]
1141
+
1142
+ # Mark the second as purging
1143
+ files[1].purging
1144
+
1145
+ assert_apply(*files)
1146
+
1147
+ assert(FileTest.exists?(paths[1]), "Deleted required purging file")
1148
+ assert(! FileTest.exists?(paths[2]), "Did not delete non-purged file")
405
1149
  end
406
1150
  end
1151
+
1152
+ # $Id: transactions.rb 2372 2007-03-30 00:47:03Z luke $