puppet 0.18.4 → 0.22.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,24 +1,27 @@
1
- #!/usr/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
- if __FILE__ == $0
4
- $:.unshift '../../lib'
5
- $:.unshift '..'
6
- $puppetbase = "../.."
7
- end
3
+ $:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
8
4
 
9
5
  require 'facter'
10
6
 
11
7
  require 'puppet'
12
8
  require 'puppet/parser/interpreter'
13
9
  require 'puppet/parser/parser'
14
- require 'puppet/client'
10
+ require 'puppet/network/client'
15
11
  require 'puppet/rails'
16
- require 'test/unit'
17
12
  require 'puppettest'
13
+ require 'puppettest/resourcetesting'
14
+ require 'puppettest/parsertesting'
15
+ require 'puppettest/servertest'
16
+ require 'puppettest/railstesting'
17
+ require 'timeout'
18
18
 
19
19
  class TestInterpreter < Test::Unit::TestCase
20
- include TestPuppet
21
- include ServerTest
20
+ include PuppetTest
21
+ include PuppetTest::ServerTest
22
+ include PuppetTest::ParserTesting
23
+ include PuppetTest::ResourceTesting
24
+ include PuppetTest::RailsTesting
22
25
  AST = Puppet::Parser::AST
23
26
 
24
27
  # create a simple manifest that uses nodes to create a file
@@ -73,7 +76,7 @@ class TestInterpreter < Test::Unit::TestCase
73
76
  assert(config != newconfig, "Configs are somehow the same")
74
77
  end
75
78
 
76
- if defined? ActiveRecord
79
+ if Puppet.features.rails?
77
80
  def test_hoststorage
78
81
  assert_nothing_raised {
79
82
  Puppet[:storeconfigs] = true
@@ -109,17 +112,10 @@ class TestInterpreter < Test::Unit::TestCase
109
112
  end
110
113
 
111
114
  if Facter["domain"].value == "madstop.com"
112
- begin
113
- require 'ldap'
114
- $haveldap = true
115
- rescue LoadError
116
- $stderr.puts "Missing ldap; skipping ldap source tests"
117
- $haveldap = false
118
- end
119
115
 
120
116
  # Only test ldap stuff on luke's network, since that's the only place we
121
117
  # have data for.
122
- if $haveldap
118
+ if Puppet.features.ldap?
123
119
  def ldapconnect
124
120
 
125
121
  @ldap = LDAP::Conn.new("ldap", 389)
@@ -142,84 +138,67 @@ class TestInterpreter < Test::Unit::TestCase
142
138
  return parent, classes
143
139
  end
144
140
 
145
- def test_ldapnodes
141
+ def test_ldapsearch
146
142
  Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
147
143
  Puppet[:ldapnodes] = true
148
144
 
149
145
  ldapconnect()
150
- file = tempfile()
151
- files = []
152
- parentfile = tempfile() + "-parent"
153
- files << parentfile
154
- hostname = Facter["hostname"].value
155
- lparent, lclasses = ldaphost(Facter["hostname"].value)
156
- assert(lclasses, "Did not retrieve info from ldap")
157
- File.open(file, "w") { |f|
158
- f.puts "node #{lparent} {
159
- file { \"#{parentfile}\": ensure => file }
160
- }"
161
-
162
- lclasses.each { |klass|
163
- kfile = tempfile() + "-klass"
164
- files << kfile
165
- f.puts "class #{klass} { file { \"#{kfile}\": ensure => file } }"
166
- }
167
- }
168
- interp = nil
169
- assert_nothing_raised {
170
- interp = Puppet::Parser::Interpreter.new(
171
- :Manifest => file
172
- )
173
- }
174
146
 
175
- parent = nil
176
- classes = nil
177
- # First make sure we get the default node for unknown hosts
178
- dparent, dclasses = ldaphost("default")
147
+ interp = mkinterp :NodeSources => [:ldap, :code]
179
148
 
180
- assert_nothing_raised {
181
- parent, classes = interp.nodesearch("nosuchhostokay")
182
- }
149
+ # Make sure we get nil and nil back when we search for something missing
150
+ parent, classes = nil
151
+ assert_nothing_raised do
152
+ parent, classes = interp.ldapsearch("nosuchhost")
153
+ end
183
154
 
184
- assert_equal(dparent, parent, "Default parent node did not match")
185
- assert_equal(dclasses, classes, "Default parent class list did not match")
155
+ assert_nil(parent, "Got a parent for a non-existent host")
156
+ assert_nil(classes, "Got classes for a non-existent host")
186
157
 
187
- # Look for a host we know doesn't have a parent
188
- npparent, npclasses = ldaphost("noparent")
189
- assert_nothing_raised {
190
- #parent, classes = interp.nodesearch_ldap("noparent")
191
- parent, classes = interp.nodesearch("noparent")
192
- }
158
+ # Make sure we can find 'culain' in ldap
159
+ assert_nothing_raised do
160
+ parent, classes = interp.ldapsearch("culain")
161
+ end
193
162
 
194
- assert_equal(npparent, parent, "Parent node did not match")
195
- assert_equal(npclasses, classes, "Class list did not match")
163
+ realparent, realclasses = ldaphost("culain")
164
+ assert_equal(realparent, parent)
165
+ assert_equal(realclasses, classes)
166
+ end
196
167
 
197
- # Now look for our normal host
198
- assert_nothing_raised {
199
- parent, classes = interp.nodesearch_ldap(hostname)
200
- }
168
+ def test_ldapnodes
169
+ Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
170
+ Puppet[:ldapnodes] = true
201
171
 
202
- assert_equal(lparent, parent, "Parent node did not match")
203
- assert_equal(lclasses, classes, "Class list did not match")
172
+ ldapconnect()
204
173
 
205
- objects = nil
206
- assert_nothing_raised {
207
- objects = interp.run(hostname, Puppet::Client::MasterClient.facts)
208
- }
174
+ interp = mkinterp :NodeSources => [:ldap, :code]
209
175
 
210
- comp = nil
211
- assert_nothing_raised {
212
- comp = objects.to_type
213
- }
176
+ # culain uses basenode, so create that
177
+ basenode = interp.newnode([:basenode])[0]
214
178
 
215
- assert_apply(comp)
216
- files.each { |cfile|
217
- @@tmpfiles << cfile
218
- assert(FileTest.exists?(cfile), "Did not make %s" % cfile)
219
- }
179
+ # Make sure we get nothing for nonexistent hosts
180
+ none = nil
181
+ assert_nothing_raised do
182
+ none = interp.nodesearch_ldap("nosuchhost")
183
+ end
184
+
185
+ assert_nil(none, "Got a node for a non-existent host")
186
+
187
+ # Make sure we can find 'culain' in ldap
188
+ culain = nil
189
+ assert_nothing_raised do
190
+ culain = interp.nodesearch_ldap("culain")
191
+ end
192
+
193
+ assert(culain, "Did not find culain in ldap")
194
+
195
+ assert_nothing_raised do
196
+ assert_equal(basenode.fqname.to_s, culain.parentclass.fqname.to_s,
197
+ "Did not get parent class")
198
+ end
220
199
  end
221
200
 
222
- if Process.uid == 0 and Facter["hostname"].value == "culain"
201
+ if Puppet::Util::SUIDManager.uid == 0 and Facter["hostname"].value == "culain"
223
202
  def test_ldapreconnect
224
203
  Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
225
204
  Puppet[:ldapnodes] = true
@@ -265,56 +244,846 @@ class TestInterpreter < Test::Unit::TestCase
265
244
  $stderr.puts "Not in madstop.com; skipping ldap tests"
266
245
  end
267
246
 
247
+ # Test that node info and default node info in different sources isn't
248
+ # bad.
249
+ def test_multiple_nodesources
250
+
251
+ # Create another node source
252
+ Puppet::Parser::Interpreter.send(:define_method, :nodesearch_multi) do |*names|
253
+ if names[0] == "default"
254
+ gennode("default", {:facts => {}})
255
+ else
256
+ nil
257
+ end
258
+ end
259
+
260
+ interp = mkinterp :NodeSources => [:multi, :code]
261
+
262
+ interp.newnode(["node"])
263
+
264
+ obj = nil
265
+ assert_nothing_raised do
266
+ obj = interp.nodesearch("node")
267
+ end
268
+ assert(obj, "Did not find node")
269
+ assert_equal("node", obj.fqname)
270
+ end
271
+
268
272
  # Make sure searchnode behaves as we expect.
269
273
  def test_nodesearch
270
- # First create a fake nodesearch algorithm
271
- i = 0
272
- bucket = []
273
- Puppet::Parser::Interpreter.send(:define_method, "nodesearch_fake") do |node|
274
- return nil, nil if node == "default"
275
-
276
- return bucket[0], bucket[1]
277
- end
278
- text = %{
279
- node nodeparent {}
280
- node othernodeparent {}
281
- class nodeclass {}
282
- class nothernode {}
283
- }
284
- manifest = tempfile()
285
- File.open(manifest, "w") do |f| f.puts text end
286
- interp = nil
274
+ # We use two sources here to catch a weird bug where the default
275
+ # node is used if the host isn't in the first source.
276
+ interp = mkinterp
277
+
278
+ # Make some nodes
279
+ names = %w{node1 node2 node2.domain.com}
280
+ interp.newnode names
281
+ interp.newnode %w{default}
282
+
283
+ nodes = {}
284
+ # Make sure we can find them all, using the direct method
285
+ names.each do |name|
286
+ nodes[name] = interp.nodesearch_code(name)
287
+ assert(nodes[name], "Could not find %s" % name)
288
+ nodes[name].file = __FILE__
289
+ end
290
+
291
+ # Now let's try it with the nodesearch method
292
+ names.each do |name|
293
+ node = interp.nodesearch(name)
294
+ assert(node, "Could not find #{name} via nodesearch")
295
+ end
296
+
297
+ # Make sure we find the default node when we search for nonexistent nodes
298
+ assert_nothing_raised do
299
+ default = interp.nodesearch("nosuchnode")
300
+ assert(default, "Did not find default node")
301
+ assert_equal("default", default.fqname)
302
+ end
303
+
304
+ # Now make sure the longest match always wins
305
+ node = interp.nodesearch(*%w{node2 node2.domain.com})
306
+
307
+ assert(node, "Did not find node2")
308
+ assert_equal("node2.domain.com", node.fqname,
309
+ "Did not get longest match")
310
+ end
311
+
312
+ def test_parsedate
313
+ Puppet[:filetimeout] = 0
314
+ main = tempfile()
315
+ sub = tempfile()
316
+ mainfile = tempfile()
317
+ subfile = tempfile()
318
+ count = 0
319
+ updatemain = proc do
320
+ count += 1
321
+ File.open(main, "w") { |f|
322
+ f.puts "import '#{sub}'
323
+ file { \"#{mainfile}\": content => #{count} }
324
+ "
325
+ }
326
+ end
327
+ updatesub = proc do
328
+ count += 1
329
+ File.open(sub, "w") { |f|
330
+ f.puts "file { \"#{subfile}\": content => #{count} }
331
+ "
332
+ }
333
+ end
334
+
335
+ updatemain.call
336
+ updatesub.call
337
+
338
+ interp = Puppet::Parser::Interpreter.new(
339
+ :Manifest => main,
340
+ :Local => true
341
+ )
342
+
343
+ date = interp.parsedate
344
+
345
+ # Now update the site file and make sure we catch it
346
+ sleep 1
347
+ updatemain.call
348
+ newdate = interp.parsedate
349
+ assert(date != newdate, "Parsedate was not updated")
350
+ date = newdate
351
+
352
+ # And then the subfile
353
+ sleep 1
354
+ updatesub.call
355
+ newdate = interp.parsedate
356
+ assert(date != newdate, "Parsedate was not updated")
357
+ end
358
+
359
+ # Make sure our node gets added to the node table.
360
+ def test_newnode
361
+ interp = mkinterp
362
+
363
+ # First just try calling it directly
287
364
  assert_nothing_raised {
288
- interp = Puppet::Parser::Interpreter.new(
289
- :Manifest => manifest,
290
- :NodeSources => [:fake]
291
- )
365
+ interp.newnode("mynode", :code => :yay)
366
+ }
367
+
368
+ assert_equal(:yay, interp.nodesearch_code("mynode").code)
369
+
370
+ # Now make sure that trying to redefine it throws an error.
371
+ assert_raise(Puppet::ParseError) {
372
+ interp.newnode("mynode", {})
373
+ }
374
+
375
+ # Now try one with no code
376
+ assert_nothing_raised {
377
+ interp.newnode("simplenode", :parent => :foo)
378
+ }
379
+
380
+ # Make sure trying to get the parentclass throws an error
381
+ assert_raise(Puppet::ParseError) do
382
+ interp.nodesearch_code("simplenode").parentclass
383
+ end
384
+
385
+ # Now define the parent node
386
+ interp.newnode(:foo)
387
+
388
+ # And make sure we get things back correctly
389
+ assert_equal("foo", interp.nodesearch_code("simplenode").parentclass.fqname)
390
+ assert_nil(interp.nodesearch_code("simplenode").code)
391
+
392
+ # Now make sure that trying to redefine it throws an error.
393
+ assert_raise(Puppet::ParseError) {
394
+ interp.newnode("mynode", {})
395
+ }
396
+
397
+ # Test multiple names
398
+ names = ["one", "two", "three"]
399
+ assert_nothing_raised {
400
+ interp.newnode(names, {:code => :yay, :parent => :foo})
292
401
  }
293
- # Make sure it behaves correctly for all forms
294
- [[nil, nil],
295
- ["nodeparent", nil],
296
- [nil, ["nodeclass"]],
297
- [nil, ["nodeclass", "nothernode"]],
298
- ["othernodeparent", ["nodeclass", "nothernode"]],].each do |ary|
299
- # Set the return values
300
- bucket = ary
301
-
302
- # Look them back up
303
- parent, classes = interp.nodesearch("mynode")
304
-
305
- # Basically, just make sure that if we have either or both,
306
- # we get a result back.
307
- assert_equal(ary[0], parent,
308
- "Parent is not %s" % parent)
309
- assert_equal(ary[1], classes,
310
- "Parent is not %s" % parent)
311
-
312
- next if ary == [nil, nil]
313
- # Now make sure we actually get the configuration. This will throw
314
- # an exception if we don't.
402
+
403
+ names.each do |name|
404
+ assert_equal(:yay, interp.nodesearch_code(name).code)
405
+ assert_equal("foo", interp.nodesearch_code(name).parentclass.name)
406
+ # Now make sure that trying to redefine it throws an error.
407
+ assert_raise(Puppet::ParseError) {
408
+ interp.newnode(name, {})
409
+ }
410
+ end
411
+ end
412
+
413
+ # Make sure we're correctly generating a node definition.
414
+ def test_gennode
415
+ interp = mkinterp
416
+
417
+ interp.newnode "base"
418
+ interp.newclass "yaytest"
419
+
420
+ # Go through the different iterations:
421
+ [
422
+ [nil, "yaytest"],
423
+ [nil, ["yaytest"]],
424
+ [nil, nil],
425
+ [nil, []],
426
+ ["base", nil],
427
+ ["base", []],
428
+ ["base", "yaytest"],
429
+ ["base", ["yaytest"]]
430
+ ].each do |parent, classes|
431
+ node = nil
432
+ assert_nothing_raised {
433
+ node = interp.gennode("nodeA", :classes => classes,
434
+ :parentnode => parent)
435
+ }
436
+
437
+ assert_instance_of(Puppet::Parser::AST::Node, node)
438
+
439
+ assert_equal("nodeA", node.name)
440
+
441
+ scope = mkscope :interp => interp
442
+
315
443
  assert_nothing_raised do
316
- interp.run("mynode", {})
444
+ node.evaluate :scope => scope
445
+ end
446
+
447
+ # If there's a parent, make sure it got evaluated
448
+ if parent
449
+ assert(scope.classlist.include?("base"),
450
+ "Did not evaluate parent node")
451
+ end
452
+
453
+ # If there are classes make sure they got evaluated
454
+ if classes == ["yaytest"] or classes == "yaytest"
455
+ assert(scope.classlist.include?("yaytest"),
456
+ "Did not evaluate class")
457
+ end
458
+ end
459
+ end
460
+
461
+ def test_fqfind
462
+ interp = mkinterp
463
+
464
+ table = {}
465
+ # Define a bunch of things.
466
+ %w{a c a::b a::b::c a::c a::b::c::d a::b::c::d::e::f c::d}.each do |string|
467
+ table[string] = string
468
+ end
469
+
470
+ check = proc do |namespace, hash|
471
+ hash.each do |thing, result|
472
+ assert_equal(result, interp.fqfind(namespace, thing, table),
473
+ "Could not find %s in %s" % [thing, namespace])
474
+ end
475
+ end
476
+
477
+ # Now let's do some test lookups.
478
+
479
+ # First do something really simple
480
+ check.call "a", "b" => "a::b", "b::c" => "a::b::c", "d" => nil, "::c" => "c"
481
+
482
+ check.call "a::b", "c" => "a::b::c", "b" => "a::b", "a" => "a"
483
+
484
+ check.call "a::b::c::d::e", "c" => "a::b::c", "::c" => "c",
485
+ "c::d" => "a::b::c::d", "::c::d" => "c::d"
486
+
487
+ check.call "", "a" => "a", "a::c" => "a::c"
488
+ end
489
+
490
+ def test_newdefine
491
+ interp = mkinterp
492
+
493
+ assert_nothing_raised {
494
+ interp.newdefine("mydefine", :code => :yay,
495
+ :arguments => ["a", stringobj("b")])
496
+ }
497
+
498
+ mydefine = interp.finddefine("", "mydefine")
499
+ assert(mydefine, "Could not find definition")
500
+ assert_equal("mydefine", interp.finddefine("", "mydefine").type)
501
+ assert_equal("", mydefine.namespace)
502
+ assert_equal("mydefine", mydefine.type)
503
+
504
+ assert_raise(Puppet::ParseError) do
505
+ interp.newdefine("mydefine", :code => :yay,
506
+ :arguments => ["a", stringobj("b")])
507
+ end
508
+
509
+ # Now define the same thing in a different scope
510
+ assert_nothing_raised {
511
+ interp.newdefine("other::mydefine", :code => :other,
512
+ :arguments => ["a", stringobj("b")])
513
+ }
514
+ other = interp.finddefine("other", "mydefine")
515
+ assert(other, "Could not find definition")
516
+ assert(interp.finddefine("", "other::mydefine"),
517
+ "Could not find other::mydefine")
518
+ assert_equal(:other, other.code)
519
+ assert_equal("other", other.namespace)
520
+ assert_equal("mydefine", other.type)
521
+ assert_equal("other::mydefine", other.fqname)
522
+ end
523
+
524
+ def test_newclass
525
+ interp = mkinterp
526
+
527
+ mkcode = proc do |ary|
528
+ classes = ary.collect do |string|
529
+ AST::FlatString.new(:value => string)
530
+ end
531
+ AST::ASTArray.new(:children => classes)
532
+ end
533
+ scope = Puppet::Parser::Scope.new(:interp => interp)
534
+
535
+ # First make sure that code is being appended
536
+ code = mkcode.call(%w{original code})
537
+
538
+ klass = nil
539
+ assert_nothing_raised {
540
+ klass = interp.newclass("myclass", :code => code)
541
+ }
542
+
543
+ assert(klass, "Did not return class")
544
+
545
+ assert(interp.findclass("", "myclass"), "Could not find definition")
546
+ assert_equal("myclass", interp.findclass("", "myclass").type)
547
+ assert_equal(%w{original code},
548
+ interp.findclass("", "myclass").code.evaluate(:scope => scope))
549
+
550
+ # Now create the same class name in a different scope
551
+ assert_nothing_raised {
552
+ klass = interp.newclass("other::myclass",
553
+ :code => mkcode.call(%w{something diff}))
554
+ }
555
+ assert(klass, "Did not return class")
556
+ other = interp.findclass("other", "myclass")
557
+ assert(other, "Could not find class")
558
+ assert(interp.findclass("", "other::myclass"), "Could not find class")
559
+ assert_equal("other::myclass", other.fqname)
560
+ assert_equal("other::myclass", other.namespace)
561
+ assert_equal("myclass", other.type)
562
+ assert_equal(%w{something diff},
563
+ interp.findclass("other", "myclass").code.evaluate(:scope => scope))
564
+
565
+ # Newclass behaves differently than the others -- it just appends
566
+ # the code to the existing class.
567
+ code = mkcode.call(%w{something new})
568
+ assert_nothing_raised do
569
+ klass = interp.newclass("myclass", :code => code)
570
+ end
571
+ assert(klass, "Did not return class when appending")
572
+ assert_equal(%w{original code something new},
573
+ interp.findclass("", "myclass").code.evaluate(:scope => scope))
574
+
575
+ # Make sure newclass deals correctly with nodes with no code
576
+ klass = interp.newclass("nocode")
577
+ assert(klass, "Did not return class")
578
+
579
+ assert_nothing_raised do
580
+ klass = interp.newclass("nocode", :code => mkcode.call(%w{yay test}))
581
+ end
582
+ assert(klass, "Did not return class with no code")
583
+ assert_equal(%w{yay test},
584
+ interp.findclass("", "nocode").code.evaluate(:scope => scope))
585
+
586
+ # Then try merging something into nothing
587
+ interp.newclass("nocode2", :code => mkcode.call(%w{foo test}))
588
+ assert(klass, "Did not return class with no code")
589
+
590
+ assert_nothing_raised do
591
+ klass = interp.newclass("nocode2")
592
+ end
593
+ assert(klass, "Did not return class with no code")
594
+ assert_equal(%w{foo test},
595
+ interp.findclass("", "nocode2").code.evaluate(:scope => scope))
596
+
597
+ # And lastly, nothing and nothing
598
+ klass = interp.newclass("nocode3")
599
+ assert(klass, "Did not return class with no code")
600
+
601
+ assert_nothing_raised do
602
+ klass = interp.newclass("nocode3")
603
+ end
604
+ assert(klass, "Did not return class with no code")
605
+ assert_nil(interp.findclass("", "nocode3").code)
606
+ end
607
+
608
+ # Make sure class, node, and define methods are case-insensitive
609
+ def test_structure_case_insensitivity
610
+ interp = mkinterp
611
+
612
+ result = nil
613
+ assert_nothing_raised do
614
+ result = interp.newclass "Yayness"
615
+ end
616
+ assert_equal(result, interp.findclass("", "yayNess"))
617
+
618
+ assert_nothing_raised do
619
+ result = interp.newdefine "FunTest"
620
+ end
621
+ assert_equal(result, interp.finddefine("", "fUntEst"),
622
+ "%s was not matched" % "fUntEst")
623
+
624
+ assert_nothing_raised do
625
+ result = interp.newnode("MyNode").shift
626
+ end
627
+ assert_equal(result, interp.nodesearch("mYnOde"),
628
+ "mYnOde was not matched")
629
+
630
+ assert_nothing_raised do
631
+ result = interp.newnode("YayTest.Domain.Com").shift
632
+ end
633
+ assert_equal(result, interp.nodesearch("yaYtEst.domAin.cOm"),
634
+ "yaYtEst.domAin.cOm was not matched")
635
+ end
636
+
637
+ # Now make sure we get appropriate behaviour with parent class conflicts.
638
+ def test_newclass_parentage
639
+ interp = mkinterp
640
+ interp.newclass("base1")
641
+ interp.newclass("one::two::three")
642
+
643
+ # First create it with no parentclass.
644
+ assert_nothing_raised {
645
+ interp.newclass("sub")
646
+ }
647
+ assert(interp.findclass("", "sub"), "Could not find definition")
648
+ assert_nil(interp.findclass("", "sub").parentclass)
649
+
650
+ # Make sure we can't set the parent class to ourself.
651
+ assert_raise(Puppet::ParseError) {
652
+ interp.newclass("sub", :parent => "sub")
653
+ }
654
+
655
+ # Now create another one, with a parentclass.
656
+ assert_nothing_raised {
657
+ interp.newclass("sub", :parent => "base1")
658
+ }
659
+
660
+ # Make sure we get the right parent class, and make sure it's an object.
661
+ assert_equal(interp.findclass("", "base1"),
662
+ interp.findclass("", "sub").parentclass)
663
+
664
+ # Now make sure we get a failure if we try to conflict.
665
+ assert_raise(Puppet::ParseError) {
666
+ interp.newclass("sub", :parent => "one::two::three")
667
+ }
668
+
669
+ # Make sure that failure didn't screw us up in any way.
670
+ assert_equal(interp.findclass("", "base1"),
671
+ interp.findclass("", "sub").parentclass)
672
+ # But make sure we can create a class with a fq parent
673
+ assert_nothing_raised {
674
+ interp.newclass("another", :parent => "one::two::three")
675
+ }
676
+ assert_equal(interp.findclass("", "one::two::three"),
677
+ interp.findclass("", "another").parentclass)
678
+
679
+ end
680
+
681
+ def test_namesplit
682
+ interp = mkinterp
683
+
684
+ assert_nothing_raised do
685
+ {"base::sub" => %w{base sub},
686
+ "main" => ["", "main"],
687
+ "one::two::three::four" => ["one::two::three", "four"],
688
+ }.each do |name, ary|
689
+ result = interp.namesplit(name)
690
+ assert_equal(ary, result, "%s split to %s" % [name, result])
691
+ end
692
+ end
693
+ end
694
+
695
+ # Make sure you can't have classes and defines with the same name in the
696
+ # same scope.
697
+ def test_classes_beat_defines
698
+ interp = mkinterp
699
+
700
+ assert_nothing_raised {
701
+ interp.newclass("yay::funtest")
702
+ }
703
+
704
+ assert_raise(Puppet::ParseError) do
705
+ interp.newdefine("yay::funtest")
706
+ end
707
+
708
+ assert_nothing_raised {
709
+ interp.newdefine("yay::yaytest")
710
+ }
711
+
712
+ assert_raise(Puppet::ParseError) do
713
+ interp.newclass("yay::yaytest")
714
+ end
715
+ end
716
+
717
+ # Make sure our whole chain works.
718
+ def test_evaluate
719
+ interp, scope, source = mkclassframing
720
+
721
+ # Create a define that we'll be using
722
+ interp.newdefine("wrapper", :code => AST::ASTArray.new(:children => [
723
+ resourcedef("file", varref("name"), "owner" => "root")
724
+ ]))
725
+
726
+ # Now create a resource that uses that define
727
+ define = mkresource(:type => "wrapper", :title => "/tmp/testing",
728
+ :scope => scope, :source => source, :params => :none)
729
+
730
+ scope.setresource define
731
+
732
+ # And a normal resource
733
+ scope.setresource mkresource(:type => "file", :title => "/tmp/rahness",
734
+ :scope => scope, :source => source,
735
+ :params => {:owner => "root"})
736
+
737
+ # Now evaluate everything
738
+ objects = nil
739
+ interp.usenodes = false
740
+ assert_nothing_raised do
741
+ objects = interp.evaluate(nil, {})
742
+ end
743
+
744
+ assert_instance_of(Puppet::TransBucket, objects)
745
+ end
746
+
747
+ # Test evaliterate. It's a very simple method, but it's pretty tough
748
+ # to test. It iterates over collections and instances of defined types
749
+ # until there's no more work to do.
750
+ def test_evaliterate
751
+ interp, scope, source = mkclassframing
752
+
753
+ # Create a top-level definition that creates a builtin object
754
+ interp.newdefine("one", :arguments => [%w{owner}],
755
+ :code => AST::ASTArray.new(:children => [
756
+ resourcedef("file", varref("name"),
757
+ "owner" => varref("owner")
758
+ )
759
+ ])
760
+ )
761
+
762
+ # Create another definition to call that one
763
+ interp.newdefine("two", :arguments => [%w{owner}],
764
+ :code => AST::ASTArray.new(:children => [
765
+ resourcedef("one", varref("name"),
766
+ "owner" => varref("owner")
767
+ )
768
+ ])
769
+ )
770
+
771
+ # And then a third
772
+ interp.newdefine("three", :arguments => [%w{owner}],
773
+ :code => AST::ASTArray.new(:children => [
774
+ resourcedef("two", varref("name"),
775
+ "owner" => varref("owner")
776
+ )
777
+ ])
778
+ )
779
+
780
+ # And create a definition that creates a virtual resource
781
+ interp.newdefine("virtualizer", :arguments => [%w{owner}],
782
+ :code => AST::ASTArray.new(:children => [
783
+ virt_resourcedef("one", varref("name"),
784
+ "owner" => varref("owner")
785
+ )
786
+ ])
787
+ )
788
+
789
+ # Now create an instance of three
790
+ three = Puppet::Parser::Resource.new(
791
+ :type => "three", :title => "one",
792
+ :scope => scope, :source => source,
793
+ :params => paramify(source, :owner => "root")
794
+ )
795
+ scope.setresource(three)
796
+
797
+ # An instance of the virtualizer
798
+ virt = Puppet::Parser::Resource.new(
799
+ :type => "virtualizer", :title => "two",
800
+ :scope => scope, :source => source,
801
+ :params => paramify(source, :owner => "root")
802
+ )
803
+ scope.setresource(virt)
804
+
805
+ # And a virtual instance of three
806
+ virt_three = Puppet::Parser::Resource.new(
807
+ :type => "three", :title => "three",
808
+ :scope => scope, :source => source,
809
+ :params => paramify(source, :owner => "root")
810
+ )
811
+ virt_three.virtual = true
812
+ scope.setresource(virt_three)
813
+
814
+ # Create a normal, virtual resource
815
+ plainvirt = Puppet::Parser::Resource.new(
816
+ :type => "user", :title => "five",
817
+ :scope => scope, :source => source,
818
+ :params => paramify(source, :uid => "root")
819
+ )
820
+ plainvirt.virtual = true
821
+ scope.setresource(plainvirt)
822
+
823
+ # Now create some collections for our virtual resources
824
+ %w{Three[three] One[two]}.each do |ref|
825
+ coll = Puppet::Parser::Collector.new(scope, "file", nil, nil, :virtual)
826
+ coll.resources = [ref]
827
+ scope.newcollection(coll)
828
+ end
829
+
830
+ # And create a generic user collector for our plain resource
831
+ coll = Puppet::Parser::Collector.new(scope, "user", nil, nil, :virtual)
832
+ scope.newcollection(coll)
833
+
834
+ ret = nil
835
+ assert_nothing_raised do
836
+ ret = scope.unevaluated
837
+ end
838
+
839
+
840
+ assert_instance_of(Array, ret)
841
+ assert_equal(3, ret.length,
842
+ "did not get the correct number of unevaled resources")
843
+
844
+ # Now translate the whole tree
845
+ assert_nothing_raised do
846
+ Timeout::timeout(2) do
847
+ interp.evaliterate(scope)
848
+ end
849
+ end
850
+
851
+ # Now make sure we've got all of our files
852
+ %w{one two three}.each do |name|
853
+ file = scope.findresource("File[%s]" % name)
854
+ assert(file, "Could not find file %s" % name)
855
+
856
+ assert_equal("root", file[:owner])
857
+ assert(! file.virtual?, "file %s is still virtual" % name)
858
+ end
859
+
860
+ # Now make sure we found the user
861
+ assert(! plainvirt.virtual?, "user was not realized")
862
+ end
863
+
864
+ # Make sure we fail if there are any leftover overrides to perform.
865
+ # This would normally mean that someone is trying to override an object
866
+ # that does not exist.
867
+ def test_failonleftovers
868
+ interp, scope, source = mkclassframing
869
+
870
+ # Make sure we don't fail, since there are no overrides
871
+ assert_nothing_raised do
872
+ interp.failonleftovers(scope)
873
+ end
874
+
875
+ # Add an override, and make sure it causes a failure
876
+ over1 = mkresource :scope => scope, :source => source,
877
+ :params => {:one => "yay"}
878
+
879
+ scope.setoverride(over1)
880
+
881
+ assert_raise(Puppet::ParseError) do
882
+ interp.failonleftovers(scope)
883
+ end
884
+
885
+ # Make a new scope to test leftover collections
886
+ scope = mkscope :interp => interp
887
+ interp.meta_def(:check_resource_collections) do
888
+ raise ArgumentError, "yep"
889
+ end
890
+
891
+ assert_raise(ArgumentError, "did not call check_resource_colls") do
892
+ interp.failonleftovers(scope)
893
+ end
894
+ end
895
+
896
+ def test_evalnode
897
+ interp = mkinterp
898
+ interp.usenodes = false
899
+ scope = Parser::Scope.new(:interp => interp)
900
+ facts = Facter.to_hash
901
+
902
+ # First make sure we get no failures when client is nil
903
+ assert_nothing_raised do
904
+ interp.evalnode(nil, scope, facts)
905
+ end
906
+
907
+ # Now define a node
908
+ interp.newnode "mynode", :code => AST::ASTArray.new(:children => [
909
+ resourcedef("file", "/tmp/testing", "owner" => "root")
910
+ ])
911
+
912
+ # Eval again, and make sure it does nothing
913
+ assert_nothing_raised do
914
+ interp.evalnode("mynode", scope, facts)
915
+ end
916
+
917
+ assert_nil(scope.findresource("File[/tmp/testing]"),
918
+ "Eval'ed node with nodes off")
919
+
920
+ # Now enable usenodes and make sure it works.
921
+ interp.usenodes = true
922
+ assert_nothing_raised do
923
+ interp.evalnode("mynode", scope, facts)
924
+ end
925
+ file = scope.findresource("File[/tmp/testing]")
926
+
927
+ assert_instance_of(Puppet::Parser::Resource, file,
928
+ "Could not find file")
929
+ end
930
+
931
+ # This is mostly used for the cfengine module
932
+ def test_specificclasses
933
+ interp = mkinterp :Classes => %w{klass1 klass2}, :UseNodes => false
934
+
935
+ # Make sure it's not a failure to be missing classes, since
936
+ # we're using the cfengine class list, which is huge.
937
+ assert_nothing_raised do
938
+ interp.evaluate(nil, {})
939
+ end
940
+
941
+ interp.newclass("klass1", :code => AST::ASTArray.new(:children => [
942
+ resourcedef("file", "/tmp/klass1", "owner" => "root")
943
+ ]))
944
+ interp.newclass("klass2", :code => AST::ASTArray.new(:children => [
945
+ resourcedef("file", "/tmp/klass2", "owner" => "root")
946
+ ]))
947
+
948
+ ret = nil
949
+ assert_nothing_raised do
950
+ ret = interp.evaluate(nil, {})
951
+ end
952
+
953
+ found = ret.flatten.collect do |res| res.name end
954
+
955
+ assert(found.include?("/tmp/klass1"), "Did not evaluate klass1")
956
+ assert(found.include?("/tmp/klass2"), "Did not evaluate klass2")
957
+ end
958
+
959
+ if Puppet.features.rails?
960
+ # We need to make sure finished objects are stored in the db.
961
+ def test_finish_before_store
962
+ railsinit
963
+ interp = mkinterp
964
+
965
+ node = interp.newnode ["myhost"], :code => AST::ASTArray.new(:children => [
966
+ resourcedef("file", "/tmp/yay", :group => "root"),
967
+ defaultobj("file", :owner => "root")
968
+ ])
969
+
970
+ interp.newclass "myclass", :code => AST::ASTArray.new(:children => [
971
+ ])
972
+
973
+ interp.newclass "sub", :parent => "myclass",
974
+ :code => AST::ASTArray.new(:children => [
975
+ resourceoverride("file", "/tmp/yay", :owner => "root")
976
+ ]
977
+ )
978
+
979
+ # Now do the rails crap
980
+ Puppet[:storeconfigs] = true
981
+
982
+ interp.evaluate("myhost", {})
983
+
984
+ # And then retrieve the object from rails
985
+ res = Puppet::Rails::Resource.find_by_restype_and_title("file", "/tmp/yay")
986
+
987
+ assert(res, "Did not get resource from rails")
988
+
989
+ param = res.param_names.find_by_name("owner", :include => :param_values)
990
+
991
+ assert(param, "Did not find owner param")
992
+
993
+ pvalue = param.param_values.find_by_value("root")
994
+ assert_equal("root", pvalue[:value])
995
+ end
996
+ end
997
+
998
+ def mk_node_mapper
999
+ # First, make sure our nodesearch command works as we expect
1000
+ # Make a nodemapper
1001
+ mapper = tempfile()
1002
+ ruby = %x{which ruby}.chomp
1003
+ File.open(mapper, "w") { |f|
1004
+ f.puts "#!#{ruby}
1005
+ name = ARGV[0]
1006
+ if name =~ /a/
1007
+ puts ARGV[0].gsub('a', 'b')
1008
+ else
1009
+ puts ''
1010
+ end
1011
+ if name =~ /p/
1012
+ puts [1,2,3].collect { |n| ARGV[0] + n.to_s }.join(' ')
1013
+ else
1014
+ puts ''
1015
+ end
1016
+ "
1017
+ }
1018
+ File.chmod(0755, mapper)
1019
+ mapper
1020
+ end
1021
+
1022
+ def test_nodesearch_external
1023
+ interp = mkinterp
1024
+
1025
+ # Make a fake gennode method
1026
+ class << interp
1027
+ def gennode(name, args, source)
1028
+ args[:name] = name
1029
+ return args
317
1030
  end
318
1031
  end
1032
+
1033
+ mapper = mk_node_mapper
1034
+ # Make sure it gives the right response
1035
+ assert_equal("bpple\napple1 apple2 apple3\n",
1036
+ %x{#{mapper} apple})
1037
+
1038
+ # First make sure we get nil back by default
1039
+ assert_nothing_raised {
1040
+ assert_nil(interp.nodesearch_external("apple"),
1041
+ "Interp#nodesearch_external defaulted to a non-nil response")
1042
+ }
1043
+ assert_nothing_raised { Puppet[:external_nodes] = mapper }
1044
+
1045
+ node = nil
1046
+ assert_nothing_raised { node = interp.nodesearch_external("apple") }
1047
+
1048
+ assert_equal({:name => "apple", :classes => %w{apple1 apple2 apple3}, :parentnode => "bpple"},
1049
+ node)
1050
+
1051
+ assert_nothing_raised { node = interp.nodesearch_external("plum")} # no a's, thus no parent
1052
+ assert_equal({:name => "plum", :classes => %w{plum1 plum2 plum3}},
1053
+ node)
1054
+
1055
+ assert_nothing_raised { node = interp.nodesearch_external("guava")} # no p's, thus no classes
1056
+ assert_equal({:name => "guava", :parentnode => "gubvb"},
1057
+ node)
1058
+
1059
+ assert_nothing_raised { node = interp.nodesearch_external("honeydew")} # neither, thus nil
1060
+ assert_nil(node)
1061
+ end
1062
+
1063
+ def test_nodesearch_external_functional
1064
+ mapper = mk_node_mapper
1065
+
1066
+ Puppet[:external_nodes] = mapper
1067
+ interp = mkinterp
1068
+
1069
+ node = nil
1070
+ assert_nothing_raised do
1071
+ node = interp.nodesearch("apple")
1072
+ end
1073
+ assert_instance_of(Puppet::Parser::AST::Node, node, "did not create node")
1074
+ end
1075
+
1076
+ def test_check_resource_collections
1077
+ interp = mkinterp
1078
+ scope = mkscope :interp => interp
1079
+ coll = Puppet::Parser::Collector.new(scope, "file", nil, nil, :virtual)
1080
+ coll.resources = ["File[/tmp/virtual1]", "File[/tmp/virtual2]"]
1081
+ scope.newcollection(coll)
1082
+
1083
+ assert_raise(Puppet::ParseError, "Did not fail on remaining resource colls") do
1084
+ interp.check_resource_collections(scope)
1085
+ end
319
1086
  end
320
1087
  end
1088
+
1089
+ # $Id: interpreter.rb 2334 2007-03-19 23:04:32Z luke $