puppet 0.23.2 → 0.24.0

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 (629) hide show
  1. data/CHANGELOG +112 -1
  2. data/README +1 -1
  3. data/Rakefile +1 -2
  4. data/bin/filebucket +2 -3
  5. data/bin/puppet +55 -39
  6. data/bin/puppetca +20 -11
  7. data/bin/puppetd +30 -31
  8. data/bin/puppetdoc +27 -28
  9. data/bin/puppetmasterd +24 -42
  10. data/bin/puppetrun +3 -4
  11. data/bin/ralsh +5 -7
  12. data/conf/redhat/puppet.spec +4 -1
  13. data/conf/solaris/smf/svc-puppetd +1 -1
  14. data/conf/solaris/smf/svc-puppetmasterd +1 -1
  15. data/examples/code/allatonce +1 -1
  16. data/examples/code/assignments +1 -1
  17. data/examples/code/components +1 -1
  18. data/examples/code/file.bl +1 -1
  19. data/examples/code/filedefaults +1 -1
  20. data/examples/code/fileparsing +1 -1
  21. data/examples/code/filerecursion +1 -1
  22. data/examples/code/functions +1 -1
  23. data/examples/code/groups +1 -1
  24. data/examples/code/head +1 -1
  25. data/examples/code/importing +1 -1
  26. data/examples/code/modules/sample-module.pp +10 -0
  27. data/examples/code/modules/sample-module/README.txt +17 -0
  28. data/examples/code/modules/sample-module/lib/puppet/parser/functions/hostname_to_dn.rb +36 -0
  29. data/examples/code/modules/sample-module/manifests/init.pp +12 -0
  30. data/examples/code/modules/sample-module/templates/sample.erb +5 -0
  31. data/examples/code/nodes +1 -1
  32. data/examples/code/one +1 -1
  33. data/examples/code/relationships +1 -1
  34. data/examples/code/selectors +1 -1
  35. data/examples/code/simpletests +1 -1
  36. data/examples/root/etc/init.d/sleeper +1 -1
  37. data/examples/root/etc/puppet/fileserver.conf +1 -1
  38. data/ext/ldap/puppet.schema +1 -1
  39. data/ext/module_puppet +30 -21
  40. data/ext/puppet-test +3 -3
  41. data/ext/vim/filetype.vim +1 -1
  42. data/install.rb +1 -2
  43. data/lib/puppet.rb +20 -19
  44. data/lib/puppet/checksum.rb +57 -0
  45. data/lib/puppet/config_stores/rest.rb +1 -1
  46. data/lib/puppet/daemon.rb +0 -1
  47. data/lib/puppet/{configuration.rb → defaults.rb} +56 -23
  48. data/lib/puppet/dsl.rb +22 -116
  49. data/lib/puppet/error.rb +0 -9
  50. data/lib/puppet/event.rb +0 -1
  51. data/lib/puppet/external/gratr/rdot.rb +0 -1
  52. data/lib/puppet/external/lock.rb +0 -1
  53. data/lib/puppet/feature/base.rb +3 -2
  54. data/lib/puppet/feature/rails.rb +0 -1
  55. data/lib/puppet/file_serving.rb +7 -0
  56. data/lib/puppet/file_serving/configuration.rb +129 -0
  57. data/lib/puppet/file_serving/configuration/parser.rb +124 -0
  58. data/lib/puppet/file_serving/content.rb +34 -0
  59. data/lib/puppet/file_serving/file_base.rb +63 -0
  60. data/lib/puppet/file_serving/fileset.rb +138 -0
  61. data/lib/puppet/file_serving/indirection_hooks.rb +44 -0
  62. data/lib/puppet/file_serving/metadata.rb +69 -0
  63. data/lib/puppet/file_serving/mount.rb +186 -0
  64. data/lib/puppet/file_serving/terminus_helper.rb +19 -0
  65. data/lib/puppet/indirector.rb +68 -0
  66. data/lib/puppet/indirector/catalog/compiler.rb +173 -0
  67. data/lib/puppet/indirector/catalog/yaml.rb +24 -0
  68. data/lib/puppet/indirector/checksum/file.rb +33 -0
  69. data/lib/puppet/indirector/code.rb +6 -0
  70. data/lib/puppet/indirector/direct_file_server.rb +27 -0
  71. data/lib/puppet/indirector/exec.rb +57 -0
  72. data/lib/puppet/indirector/facts/facter.rb +65 -0
  73. data/lib/puppet/indirector/facts/memory.rb +9 -0
  74. data/lib/puppet/indirector/facts/yaml.rb +7 -0
  75. data/lib/puppet/indirector/file.rb +54 -0
  76. data/lib/puppet/indirector/file_content.rb +5 -0
  77. data/lib/puppet/indirector/file_content/file.rb +11 -0
  78. data/lib/puppet/indirector/file_content/file_server.rb +11 -0
  79. data/lib/puppet/indirector/file_content/modules.rb +11 -0
  80. data/lib/puppet/indirector/file_content/rest.rb +12 -0
  81. data/lib/puppet/indirector/file_metadata.rb +5 -0
  82. data/lib/puppet/indirector/file_metadata/file.rb +26 -0
  83. data/lib/puppet/indirector/file_metadata/file_server.rb +11 -0
  84. data/lib/puppet/indirector/file_metadata/modules.rb +17 -0
  85. data/lib/puppet/indirector/file_metadata/rest.rb +12 -0
  86. data/lib/puppet/indirector/file_server.rb +56 -0
  87. data/lib/puppet/indirector/indirection.rb +237 -0
  88. data/lib/puppet/indirector/ldap.rb +90 -0
  89. data/lib/puppet/indirector/memory.rb +21 -0
  90. data/lib/puppet/indirector/module_files.rb +82 -0
  91. data/lib/puppet/indirector/node/exec.rb +52 -0
  92. data/lib/puppet/indirector/node/ldap.rb +120 -0
  93. data/lib/puppet/indirector/node/memory.rb +10 -0
  94. data/lib/puppet/indirector/node/plain.rb +19 -0
  95. data/lib/puppet/indirector/node/rest.rb +7 -0
  96. data/lib/puppet/indirector/node/yaml.rb +7 -0
  97. data/lib/puppet/indirector/plain.rb +9 -0
  98. data/lib/puppet/indirector/report/processor.rb +50 -0
  99. data/lib/puppet/indirector/rest.rb +8 -0
  100. data/lib/puppet/indirector/ssl_rsa.rb +5 -0
  101. data/lib/puppet/indirector/ssl_rsa/file.rb +33 -0
  102. data/lib/puppet/indirector/terminus.rb +178 -0
  103. data/lib/puppet/indirector/yaml.rb +57 -0
  104. data/lib/puppet/metatype/attributes.rb +3 -3
  105. data/lib/puppet/metatype/closure.rb +0 -66
  106. data/lib/puppet/metatype/container.rb +0 -9
  107. data/lib/puppet/metatype/evaluation.rb +10 -2
  108. data/lib/puppet/metatype/instances.rb +16 -30
  109. data/lib/puppet/metatype/manager.rb +1 -2
  110. data/lib/puppet/metatype/metaparams.rb +27 -21
  111. data/lib/puppet/metatype/providers.rb +3 -2
  112. data/lib/puppet/metatype/relationships.rb +1 -2
  113. data/lib/puppet/metatype/schedules.rb +0 -1
  114. data/lib/puppet/metatype/tags.rb +0 -1
  115. data/lib/puppet/module.rb +60 -32
  116. data/lib/puppet/network/authconfig.rb +0 -1
  117. data/lib/puppet/network/authorization.rb +0 -1
  118. data/lib/puppet/network/authstore.rb +0 -1
  119. data/lib/puppet/network/client.rb +13 -4
  120. data/lib/puppet/network/client/ca.rb +4 -5
  121. data/lib/puppet/network/client/dipper.rb +0 -1
  122. data/lib/puppet/network/client/file.rb +0 -1
  123. data/lib/puppet/network/client/master.rb +127 -235
  124. data/lib/puppet/network/client/proxy.rb +0 -1
  125. data/lib/puppet/network/client/report.rb +0 -1
  126. data/lib/puppet/network/client/resource.rb +0 -1
  127. data/lib/puppet/network/client/runner.rb +0 -1
  128. data/lib/puppet/network/client/status.rb +0 -1
  129. data/lib/puppet/network/client_request.rb +0 -1
  130. data/lib/puppet/network/handler.rb +5 -2
  131. data/lib/puppet/network/handler/ca.rb +1 -2
  132. data/lib/puppet/network/handler/configuration.rb +184 -0
  133. data/lib/puppet/network/handler/filebucket.rb +1 -2
  134. data/lib/puppet/network/handler/fileserver.rb +279 -107
  135. data/lib/puppet/network/handler/master.rb +57 -152
  136. data/lib/puppet/network/handler/report.rb +6 -65
  137. data/lib/puppet/network/handler/resource.rb +5 -13
  138. data/lib/puppet/network/handler/runner.rb +3 -4
  139. data/lib/puppet/network/handler/status.rb +0 -1
  140. data/lib/puppet/network/http.rb +13 -0
  141. data/lib/puppet/network/http/handler.rb +109 -0
  142. data/lib/puppet/network/http/mongrel.rb +54 -0
  143. data/lib/puppet/network/http/mongrel/rest.rb +37 -0
  144. data/lib/puppet/network/http/mongrel/xmlrpc.rb +4 -0
  145. data/lib/puppet/network/http/webrick.rb +51 -0
  146. data/lib/puppet/network/http/webrick/rest.rb +41 -0
  147. data/lib/puppet/network/http/webrick/xmlrpc.rb +4 -0
  148. data/lib/puppet/network/http_server.rb +3 -0
  149. data/lib/puppet/network/{server → http_server}/mongrel.rb +11 -5
  150. data/lib/puppet/network/{server → http_server}/webrick.rb +9 -5
  151. data/lib/puppet/network/rest_controller.rb +2 -0
  152. data/lib/puppet/network/rights.rb +0 -1
  153. data/lib/puppet/network/server.rb +63 -3
  154. data/lib/puppet/network/xmlrpc/client.rb +90 -23
  155. data/lib/puppet/network/xmlrpc/processor.rb +0 -1
  156. data/lib/puppet/network/xmlrpc/server.rb +0 -1
  157. data/lib/puppet/network/xmlrpc/webrick_servlet.rb +0 -1
  158. data/lib/puppet/node.rb +165 -0
  159. data/lib/puppet/node/catalog.rb +480 -0
  160. data/lib/puppet/node/environment.rb +46 -0
  161. data/lib/puppet/node/facts.rb +36 -0
  162. data/lib/puppet/parameter.rb +34 -28
  163. data/lib/puppet/parser/ast.rb +0 -1
  164. data/lib/puppet/parser/ast/astarray.rb +30 -53
  165. data/lib/puppet/parser/ast/branch.rb +0 -10
  166. data/lib/puppet/parser/ast/caseopt.rb +0 -11
  167. data/lib/puppet/parser/ast/casestatement.rb +0 -12
  168. data/lib/puppet/parser/ast/collection.rb +1 -3
  169. data/lib/puppet/parser/ast/collexpr.rb +0 -2
  170. data/lib/puppet/parser/ast/{component.rb → definition.rb} +58 -72
  171. data/lib/puppet/parser/ast/else.rb +0 -10
  172. data/lib/puppet/parser/ast/function.rb +0 -2
  173. data/lib/puppet/parser/ast/hostclass.rb +21 -19
  174. data/lib/puppet/parser/ast/ifstatement.rb +0 -13
  175. data/lib/puppet/parser/ast/leaf.rb +0 -8
  176. data/lib/puppet/parser/ast/node.rb +13 -10
  177. data/lib/puppet/parser/ast/resource.rb +75 -0
  178. data/lib/puppet/parser/ast/{resourcedefaults.rb → resource_defaults.rb} +4 -20
  179. data/lib/puppet/parser/ast/{resourceoverride.rb → resource_override.rb} +3 -5
  180. data/lib/puppet/parser/ast/resource_reference.rb +66 -0
  181. data/lib/puppet/parser/ast/resourceparam.rb +0 -14
  182. data/lib/puppet/parser/ast/selector.rb +0 -10
  183. data/lib/puppet/parser/ast/tag.rb +0 -2
  184. data/lib/puppet/parser/ast/vardef.rb +0 -14
  185. data/lib/puppet/parser/collector.rb +83 -101
  186. data/lib/puppet/parser/compile.rb +509 -0
  187. data/lib/puppet/parser/functions.rb +10 -10
  188. data/lib/puppet/parser/interpreter.rb +44 -662
  189. data/lib/puppet/parser/lexer.rb +1 -3
  190. data/lib/puppet/parser/parser.rb +674 -701
  191. data/lib/puppet/parser/parser_support.rb +33 -24
  192. data/lib/puppet/parser/resource.rb +219 -162
  193. data/lib/puppet/parser/resource/param.rb +1 -2
  194. data/lib/puppet/parser/resource/reference.rb +24 -16
  195. data/lib/puppet/parser/scope.rb +48 -459
  196. data/lib/puppet/parser/templatewrapper.rb +4 -5
  197. data/lib/puppet/pgraph.rb +10 -13
  198. data/lib/puppet/property.rb +25 -41
  199. data/lib/puppet/propertychange.rb +0 -2
  200. data/lib/puppet/provider.rb +15 -11
  201. data/lib/puppet/provider/cron/crontab.rb +6 -7
  202. data/lib/puppet/provider/group/groupadd.rb +0 -1
  203. data/lib/puppet/provider/group/netinfo.rb +0 -1
  204. data/lib/puppet/provider/group/pw.rb +0 -1
  205. data/lib/puppet/provider/host/netinfo.rb +0 -1
  206. data/lib/puppet/provider/host/parsed.rb +0 -1
  207. data/lib/puppet/provider/interface/redhat.rb +90 -91
  208. data/lib/puppet/provider/interface/sunos.rb +98 -81
  209. data/lib/puppet/provider/mailalias/aliases.rb +0 -1
  210. data/lib/puppet/provider/maillist/mailman.rb +2 -3
  211. data/lib/puppet/provider/mount.rb +10 -9
  212. data/lib/puppet/provider/mount/netinfo.rb +0 -1
  213. data/lib/puppet/provider/mount/parsed.rb +0 -1
  214. data/lib/puppet/provider/nameservice.rb +0 -1
  215. data/lib/puppet/provider/nameservice/netinfo.rb +0 -1
  216. data/lib/puppet/provider/nameservice/objectadd.rb +0 -1
  217. data/lib/puppet/provider/nameservice/pw.rb +0 -1
  218. data/lib/puppet/provider/package.rb +0 -2
  219. data/lib/puppet/provider/package/appdmg.rb +0 -1
  220. data/lib/puppet/provider/package/apple.rb +0 -1
  221. data/lib/puppet/provider/package/apt.rb +0 -1
  222. data/lib/puppet/provider/package/aptitude.rb +0 -1
  223. data/lib/puppet/provider/package/aptrpm.rb +0 -1
  224. data/lib/puppet/provider/package/blastwave.rb +0 -1
  225. data/lib/puppet/provider/package/darwinport.rb +0 -1
  226. data/lib/puppet/provider/package/dpkg.rb +9 -1
  227. data/lib/puppet/provider/package/fink.rb +0 -1
  228. data/lib/puppet/provider/package/freebsd.rb +0 -1
  229. data/lib/puppet/provider/package/gem.rb +0 -1
  230. data/lib/puppet/provider/package/openbsd.rb +1 -2
  231. data/lib/puppet/provider/package/pkgdmg.rb +14 -15
  232. data/lib/puppet/provider/package/portage.rb +6 -7
  233. data/lib/puppet/provider/package/ports.rb +1 -4
  234. data/lib/puppet/provider/package/rpm.rb +31 -45
  235. data/lib/puppet/provider/package/sun.rb +0 -3
  236. data/lib/puppet/provider/package/sunfreeware.rb +0 -1
  237. data/lib/puppet/provider/package/up2date.rb +0 -1
  238. data/lib/puppet/provider/package/urpmi.rb +0 -1
  239. data/lib/puppet/provider/package/yum.rb +45 -14
  240. data/lib/puppet/provider/package/yumhelper.py +37 -0
  241. data/lib/puppet/provider/parsedfile.rb +2 -3
  242. data/lib/puppet/provider/port/parsed.rb +0 -1
  243. data/lib/puppet/provider/service/base.rb +4 -1
  244. data/lib/puppet/provider/service/debian.rb +5 -2
  245. data/lib/puppet/provider/service/freebsd.rb +51 -0
  246. data/lib/puppet/provider/service/init.rb +16 -40
  247. data/lib/puppet/provider/service/redhat.rb +1 -6
  248. data/lib/puppet/provider/service/smf.rb +0 -1
  249. data/lib/puppet/provider/sshkey/parsed.rb +0 -1
  250. data/lib/puppet/provider/user/netinfo.rb +0 -1
  251. data/lib/puppet/provider/user/pw.rb +0 -1
  252. data/lib/puppet/provider/user/useradd.rb +0 -1
  253. data/lib/puppet/provider/zone/solaris.rb +0 -1
  254. data/lib/puppet/rails.rb +35 -30
  255. data/lib/puppet/rails/database/schema.rb +0 -1
  256. data/lib/puppet/rails/host.rb +6 -15
  257. data/lib/puppet/rails/param_name.rb +1 -2
  258. data/lib/puppet/rails/param_value.rb +0 -1
  259. data/lib/puppet/rails/puppet_class.rb +0 -1
  260. data/lib/puppet/rails/resource.rb +3 -5
  261. data/lib/puppet/reference/configuration.rb +12 -6
  262. data/lib/puppet/reference/indirection.rb +34 -0
  263. data/lib/puppet/reference/node_source.rb +9 -0
  264. data/lib/puppet/relationship.rb +10 -8
  265. data/lib/puppet/reports.rb +51 -0
  266. data/lib/puppet/reports/log.rb +2 -3
  267. data/lib/puppet/reports/rrdgraph.rb +2 -5
  268. data/lib/puppet/reports/store.rb +6 -7
  269. data/lib/puppet/reports/tagmail.rb +2 -3
  270. data/lib/puppet/resource_reference.rb +79 -0
  271. data/lib/puppet/simple_graph.rb +251 -0
  272. data/lib/puppet/sslcertificates.rb +19 -15
  273. data/lib/puppet/sslcertificates/ca.rb +56 -15
  274. data/lib/puppet/sslcertificates/certificate.rb +0 -1
  275. data/lib/puppet/sslcertificates/inventory.rb +2 -6
  276. data/lib/puppet/sslcertificates/monkey_patch.rb +6 -0
  277. data/lib/puppet/sslcertificates/support.rb +4 -5
  278. data/lib/puppet/transaction.rb +93 -96
  279. data/lib/puppet/transaction/report.rb +5 -1
  280. data/lib/puppet/transportable.rb +79 -125
  281. data/lib/puppet/type.rb +44 -10
  282. data/lib/puppet/type/component.rb +25 -110
  283. data/lib/puppet/type/cron.rb +1 -2
  284. data/lib/puppet/type/exec.rb +19 -13
  285. data/lib/puppet/type/group.rb +0 -1
  286. data/lib/puppet/type/host.rb +0 -1
  287. data/lib/puppet/type/interface.rb +6 -3
  288. data/lib/puppet/type/k5login.rb +87 -0
  289. data/lib/puppet/type/mailalias.rb +0 -1
  290. data/lib/puppet/type/maillist.rb +0 -1
  291. data/lib/puppet/type/mount.rb +7 -13
  292. data/lib/puppet/type/notify.rb +0 -1
  293. data/lib/puppet/type/package.rb +7 -63
  294. data/lib/puppet/type/pfile.rb +25 -32
  295. data/lib/puppet/type/pfile/checksum.rb +0 -1
  296. data/lib/puppet/type/pfile/content.rb +18 -3
  297. data/lib/puppet/type/pfile/ensure.rb +5 -6
  298. data/lib/puppet/type/pfile/group.rb +4 -1
  299. data/lib/puppet/type/pfile/mode.rb +0 -1
  300. data/lib/puppet/type/pfile/owner.rb +6 -9
  301. data/lib/puppet/type/pfile/source.rb +28 -11
  302. data/lib/puppet/type/pfile/target.rb +2 -1
  303. data/lib/puppet/type/pfile/type.rb +0 -1
  304. data/lib/puppet/type/pfilebucket.rb +0 -1
  305. data/lib/puppet/type/port.rb +0 -1
  306. data/lib/puppet/type/resources.rb +0 -1
  307. data/lib/puppet/type/schedule.rb +17 -15
  308. data/lib/puppet/type/service.rb +23 -159
  309. data/lib/puppet/type/sshkey.rb +0 -1
  310. data/lib/puppet/type/tidy.rb +15 -7
  311. data/lib/puppet/type/user.rb +0 -1
  312. data/lib/puppet/type/zone.rb +0 -1
  313. data/lib/puppet/util.rb +1 -2
  314. data/lib/puppet/util/autoload.rb +21 -23
  315. data/lib/puppet/util/checksums.rb +37 -0
  316. data/lib/puppet/util/classgen.rb +0 -1
  317. data/lib/puppet/util/diff.rb +71 -0
  318. data/lib/puppet/util/docs.rb +8 -2
  319. data/lib/puppet/util/errors.rb +0 -1
  320. data/lib/puppet/util/execution.rb +0 -1
  321. data/lib/puppet/util/fact_store.rb +0 -1
  322. data/lib/puppet/util/feature.rb +31 -22
  323. data/lib/puppet/util/fileparsing.rb +3 -2
  324. data/lib/puppet/util/filetype.rb +30 -12
  325. data/lib/puppet/util/graph.rb +0 -1
  326. data/lib/puppet/util/inifile.rb +0 -1
  327. data/lib/puppet/util/instance_loader.rb +11 -4
  328. data/lib/puppet/util/loadedfile.rb +0 -1
  329. data/lib/puppet/util/log.rb +0 -1
  330. data/lib/puppet/util/log_paths.rb +0 -1
  331. data/lib/puppet/util/logging.rb +0 -1
  332. data/lib/puppet/util/metaid.rb +0 -1
  333. data/lib/puppet/util/methodhelper.rb +0 -2
  334. data/lib/puppet/util/metric.rb +1 -2
  335. data/lib/puppet/util/plist.rb +0 -1
  336. data/lib/puppet/util/plist/generator.rb +0 -1
  337. data/lib/puppet/util/plist/parser.rb +0 -1
  338. data/lib/puppet/util/posix.rb +7 -1
  339. data/lib/puppet/util/provider_features.rb +11 -12
  340. data/lib/puppet/util/rails/collection_merger.rb +0 -1
  341. data/lib/puppet/util/reference.rb +2 -3
  342. data/lib/puppet/util/{config.rb → settings.rb} +424 -300
  343. data/lib/puppet/util/storage.rb +1 -3
  344. data/lib/puppet/util/subclass_loader.rb +0 -1
  345. data/lib/puppet/util/suidmanager.rb +25 -42
  346. data/lib/puppet/util/uri_helper.rb +22 -0
  347. data/lib/puppet/util/variables.rb +0 -1
  348. data/lib/puppet/util/warnings.rb +0 -1
  349. data/test/Rakefile +1 -1
  350. data/test/certmgr/ca.rb +8 -2
  351. data/test/certmgr/certmgr.rb +14 -6
  352. data/test/certmgr/inventory.rb +18 -30
  353. data/test/certmgr/support.rb +3 -2
  354. data/test/executables/filebucket.rb +1 -2
  355. data/test/executables/puppetbin.rb +1 -2
  356. data/test/executables/puppetca.rb +7 -2
  357. data/test/executables/puppetd.rb +23 -29
  358. data/test/executables/puppetmasterd.rb +1 -2
  359. data/test/executables/puppetmodule.rb +1 -2
  360. data/test/language/ast.rb +24 -29
  361. data/test/language/ast/casestatement.rb +1 -2
  362. data/test/language/ast/definition.rb +166 -0
  363. data/test/language/ast/hostclass.rb +50 -29
  364. data/test/language/ast/resource.rb +59 -0
  365. data/test/language/ast/{resourceref.rb → resource_reference.rb} +30 -20
  366. data/test/language/ast/selector.rb +1 -2
  367. data/test/language/ast/variable.rb +1 -2
  368. data/test/language/compile.rb +569 -0
  369. data/test/language/functions.rb +57 -76
  370. data/test/language/lexer.rb +20 -3
  371. data/test/language/parser.rb +45 -33
  372. data/test/language/resource.rb +275 -308
  373. data/test/language/scope.rb +135 -410
  374. data/test/language/snippets.rb +19 -41
  375. data/test/language/transportable.rb +8 -29
  376. data/test/lib/mocha/auto_verify.rb +6 -6
  377. data/test/lib/mocha/deprecation.rb +22 -0
  378. data/test/lib/mocha/exception_raiser.rb +17 -0
  379. data/test/lib/mocha/expectation.rb +167 -84
  380. data/test/lib/mocha/infinite_range.rb +4 -6
  381. data/test/lib/mocha/inspect.rb +3 -1
  382. data/test/lib/mocha/is_a.rb +9 -0
  383. data/test/lib/mocha/missing_expectation.rb +27 -0
  384. data/test/lib/mocha/mock.rb +192 -5
  385. data/test/lib/mocha/multiple_yields.rb +20 -0
  386. data/test/lib/mocha/no_yields.rb +11 -0
  387. data/test/lib/mocha/object.rb +11 -1
  388. data/test/lib/mocha/parameter_matchers.rb +9 -0
  389. data/test/lib/mocha/parameter_matchers/all_of.rb +39 -0
  390. data/test/lib/mocha/parameter_matchers/any_of.rb +44 -0
  391. data/test/lib/mocha/parameter_matchers/anything.rb +30 -0
  392. data/test/lib/mocha/parameter_matchers/has_entry.rb +39 -0
  393. data/test/lib/mocha/parameter_matchers/has_key.rb +39 -0
  394. data/test/lib/mocha/parameter_matchers/has_value.rb +39 -0
  395. data/test/lib/mocha/parameter_matchers/includes.rb +37 -0
  396. data/test/lib/mocha/return_values.rb +31 -0
  397. data/test/lib/mocha/single_return_value.rb +24 -0
  398. data/test/lib/mocha/single_yield.rb +18 -0
  399. data/test/lib/mocha/standalone.rb +2 -0
  400. data/test/lib/mocha/stub.rb +18 -0
  401. data/test/lib/mocha/test_case_adapter.rb +3 -3
  402. data/test/lib/mocha/yield_parameters.rb +31 -0
  403. data/test/lib/puppettest.rb +38 -20
  404. data/test/lib/puppettest/certificates.rb +0 -1
  405. data/test/lib/puppettest/exetest.rb +0 -1
  406. data/test/lib/puppettest/fakes.rb +0 -1
  407. data/test/lib/puppettest/fileparsing.rb +8 -15
  408. data/test/lib/puppettest/filetesting.rb +0 -1
  409. data/test/lib/puppettest/parsertesting.rb +37 -23
  410. data/test/lib/puppettest/railstesting.rb +3 -6
  411. data/test/lib/puppettest/reporttesting.rb +0 -1
  412. data/test/lib/puppettest/resourcetesting.rb +6 -34
  413. data/test/lib/puppettest/runnable_test.rb +30 -0
  414. data/test/lib/puppettest/servertest.rb +2 -3
  415. data/test/lib/puppettest/support/assertions.rb +13 -41
  416. data/test/lib/puppettest/support/collection.rb +0 -1
  417. data/test/lib/puppettest/support/helpers.rb +0 -1
  418. data/test/lib/puppettest/support/resources.rb +17 -17
  419. data/test/lib/puppettest/support/utils.rb +45 -27
  420. data/test/lib/puppettest/testcase.rb +2 -21
  421. data/test/lib/rake/puppet_test_loader.rb +0 -1
  422. data/test/lib/rake/puppet_testtask.rb +0 -1
  423. data/test/network/authconfig.rb +1 -2
  424. data/test/network/authorization.rb +1 -2
  425. data/test/network/authstore.rb +1 -2
  426. data/test/network/client/ca.rb +12 -7
  427. data/test/network/client/client.rb +17 -22
  428. data/test/network/client/dipper.rb +1 -2
  429. data/test/network/client/master.rb +70 -184
  430. data/test/network/client/resource.rb +9 -2
  431. data/test/network/client_request.rb +1 -2
  432. data/test/network/daemon.rb +1 -2
  433. data/test/network/handler/bucket.rb +2 -31
  434. data/test/network/handler/ca.rb +9 -3
  435. data/test/network/handler/configuration.rb +160 -0
  436. data/test/network/handler/fileserver.rb +24 -5
  437. data/test/network/handler/handler.rb +1 -2
  438. data/test/network/handler/master.rb +38 -243
  439. data/test/network/handler/report.rb +2 -104
  440. data/test/network/handler/resource.rb +5 -3
  441. data/test/network/handler/runner.rb +22 -60
  442. data/test/network/rights.rb +1 -2
  443. data/test/network/server/mongrel_test.rb +2 -3
  444. data/test/network/server/webrick.rb +17 -11
  445. data/test/network/xmlrpc/client.rb +27 -12
  446. data/test/network/xmlrpc/processor.rb +3 -4
  447. data/test/network/xmlrpc/server.rb +1 -2
  448. data/test/network/xmlrpc/webrick_servlet.rb +8 -2
  449. data/test/other/dsl.rb +2 -4
  450. data/test/other/events.rb +14 -56
  451. data/test/other/overrides.rb +3 -6
  452. data/test/other/propertychange.rb +1 -2
  453. data/test/other/provider.rb +1 -2
  454. data/test/other/puppet.rb +1 -2
  455. data/test/other/relationships.rb +15 -17
  456. data/test/other/report.rb +14 -20
  457. data/test/other/transactions.rb +109 -192
  458. data/test/puppet/conffiles.rb +3 -5
  459. data/test/puppet/defaults.rb +1 -28
  460. data/test/puppet/errortest.rb +1 -2
  461. data/test/puppet/tc_suidmanager.rb +77 -63
  462. data/test/rails/ast.rb +4 -4
  463. data/test/rails/configuration.rb +71 -0
  464. data/test/rails/host.rb +19 -30
  465. data/test/rails/rails.rb +1 -2
  466. data/test/rails/railsparameter.rb +3 -4
  467. data/test/rails/railsresource.rb +6 -5
  468. data/test/ral/manager/attributes.rb +1 -2
  469. data/test/ral/manager/instances.rb +3 -3
  470. data/test/ral/manager/manager.rb +1 -2
  471. data/test/ral/manager/provider.rb +1 -2
  472. data/test/ral/manager/type.rb +89 -93
  473. data/test/ral/providers/cron/crontab.rb +9 -11
  474. data/test/ral/providers/group.rb +1 -2
  475. data/test/ral/providers/host/netinfo.rb +1 -2
  476. data/test/ral/providers/host/parsed.rb +1 -2
  477. data/test/ral/providers/mailalias/aliases.rb +1 -2
  478. data/test/ral/providers/mount/netinfo.rb +1 -2
  479. data/test/ral/providers/nameservice.rb +1 -2
  480. data/test/ral/providers/package.rb +5 -4
  481. data/test/ral/providers/package/apt.rb +0 -1
  482. data/test/ral/providers/package/aptrpm.rb +0 -1
  483. data/test/ral/providers/parsedfile.rb +1 -2
  484. data/test/ral/providers/port/parsed.rb +1 -2
  485. data/test/ral/providers/provider.rb +10 -5
  486. data/test/ral/providers/service/base.rb +1 -2
  487. data/test/ral/providers/service/debian.rb +58 -0
  488. data/test/ral/providers/sshkey/parsed.rb +1 -2
  489. data/test/ral/providers/user.rb +3 -2
  490. data/test/ral/providers/user/useradd.rb +0 -1
  491. data/test/ral/types/basic.rb +4 -9
  492. data/test/ral/types/cron.rb +6 -12
  493. data/test/ral/types/exec.rb +6 -7
  494. data/test/ral/types/file.rb +35 -14
  495. data/test/ral/types/file/target.rb +6 -5
  496. data/test/ral/types/filebucket.rb +3 -2
  497. data/test/ral/types/fileignoresource.rb +10 -42
  498. data/test/ral/types/filesources.rb +21 -60
  499. data/test/ral/types/group.rb +3 -3
  500. data/test/ral/types/host.rb +6 -3
  501. data/test/ral/types/mailalias.rb +1 -2
  502. data/test/ral/types/parameter.rb +5 -3
  503. data/test/ral/types/port.rb +1 -2
  504. data/test/ral/types/property.rb +3 -3
  505. data/test/ral/types/resources.rb +1 -2
  506. data/test/ral/types/service.rb +5 -3
  507. data/test/ral/types/sshkey.rb +5 -3
  508. data/test/ral/types/tidy.rb +63 -3
  509. data/test/ral/types/user.rb +10 -11
  510. data/test/ral/types/yumrepo.rb +1 -1
  511. data/test/ral/types/zone.rb +1 -2
  512. data/test/util/autoload.rb +23 -27
  513. data/test/util/classgen.rb +1 -2
  514. data/test/util/execution.rb +1 -2
  515. data/test/util/features.rb +1 -3
  516. data/test/util/fileparsing.rb +11 -3
  517. data/test/util/filetype.rb +1 -2
  518. data/test/util/inifile.rb +1 -1
  519. data/test/util/instance_loader.rb +5 -6
  520. data/test/util/loadedfile.rb +1 -2
  521. data/test/util/log.rb +1 -2
  522. data/test/util/metrics.rb +1 -2
  523. data/test/util/package.rb +1 -2
  524. data/test/util/posixtest.rb +1 -2
  525. data/test/util/{config.rb → settings.rb} +123 -265
  526. data/test/util/storage.rb +1 -2
  527. data/test/util/subclass_loader.rb +1 -2
  528. data/test/util/utiltest.rb +1 -111
  529. metadata +130 -112
  530. data/ext/tools/passwd2puppet +0 -45
  531. data/lib/puppet/fact_stores/yaml.rb +0 -42
  532. data/lib/puppet/network/handler/facts.rb +0 -70
  533. data/lib/puppet/parser/ast/resourcedef.rb +0 -222
  534. data/lib/puppet/parser/ast/resourceref.rb +0 -58
  535. data/test/language/ast/component.rb +0 -142
  536. data/test/language/collector.rb +0 -179
  537. data/test/language/interpreter.rb +0 -804
  538. data/test/language/node.rb +0 -126
  539. data/test/lib/mocha/mock_methods.rb +0 -122
  540. data/test/lib/puppettest/graph.rb +0 -41
  541. data/test/lib/spec.rb +0 -8
  542. data/test/lib/spec/callback.rb +0 -11
  543. data/test/lib/spec/callback/callback_container.rb +0 -60
  544. data/test/lib/spec/callback/extensions/module.rb +0 -24
  545. data/test/lib/spec/callback/extensions/object.rb +0 -37
  546. data/test/lib/spec/deprecated.rb +0 -3
  547. data/test/lib/spec/expectations.rb +0 -59
  548. data/test/lib/spec/expectations/differs/default.rb +0 -62
  549. data/test/lib/spec/expectations/errors.rb +0 -6
  550. data/test/lib/spec/expectations/extensions.rb +0 -3
  551. data/test/lib/spec/expectations/extensions/object.rb +0 -109
  552. data/test/lib/spec/expectations/extensions/proc.rb +0 -57
  553. data/test/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
  554. data/test/lib/spec/expectations/handler.rb +0 -47
  555. data/test/lib/spec/expectations/should.rb +0 -5
  556. data/test/lib/spec/expectations/should/base.rb +0 -64
  557. data/test/lib/spec/expectations/should/change.rb +0 -69
  558. data/test/lib/spec/expectations/should/have.rb +0 -128
  559. data/test/lib/spec/expectations/should/not.rb +0 -74
  560. data/test/lib/spec/expectations/should/should.rb +0 -81
  561. data/test/lib/spec/expectations/sugar.rb +0 -47
  562. data/test/lib/spec/matchers.rb +0 -160
  563. data/test/lib/spec/matchers/be.rb +0 -161
  564. data/test/lib/spec/matchers/be_close.rb +0 -37
  565. data/test/lib/spec/matchers/change.rb +0 -120
  566. data/test/lib/spec/matchers/eql.rb +0 -43
  567. data/test/lib/spec/matchers/equal.rb +0 -43
  568. data/test/lib/spec/matchers/has.rb +0 -44
  569. data/test/lib/spec/matchers/have.rb +0 -140
  570. data/test/lib/spec/matchers/include.rb +0 -50
  571. data/test/lib/spec/matchers/match.rb +0 -41
  572. data/test/lib/spec/matchers/raise_error.rb +0 -100
  573. data/test/lib/spec/matchers/respond_to.rb +0 -35
  574. data/test/lib/spec/matchers/satisfy.rb +0 -47
  575. data/test/lib/spec/matchers/throw_symbol.rb +0 -75
  576. data/test/lib/spec/mocks.rb +0 -232
  577. data/test/lib/spec/mocks/argument_expectation.rb +0 -132
  578. data/test/lib/spec/mocks/error_generator.rb +0 -85
  579. data/test/lib/spec/mocks/errors.rb +0 -10
  580. data/test/lib/spec/mocks/extensions/object.rb +0 -3
  581. data/test/lib/spec/mocks/message_expectation.rb +0 -231
  582. data/test/lib/spec/mocks/methods.rb +0 -40
  583. data/test/lib/spec/mocks/mock.rb +0 -26
  584. data/test/lib/spec/mocks/mock_handler.rb +0 -166
  585. data/test/lib/spec/mocks/order_group.rb +0 -29
  586. data/test/lib/spec/rake/spectask.rb +0 -173
  587. data/test/lib/spec/rake/verify_rcov.rb +0 -47
  588. data/test/lib/spec/runner.rb +0 -132
  589. data/test/lib/spec/runner/backtrace_tweaker.rb +0 -55
  590. data/test/lib/spec/runner/command_line.rb +0 -34
  591. data/test/lib/spec/runner/context.rb +0 -154
  592. data/test/lib/spec/runner/context_eval.rb +0 -142
  593. data/test/lib/spec/runner/context_runner.rb +0 -55
  594. data/test/lib/spec/runner/drb_command_line.rb +0 -21
  595. data/test/lib/spec/runner/execution_context.rb +0 -17
  596. data/test/lib/spec/runner/extensions/kernel.rb +0 -17
  597. data/test/lib/spec/runner/extensions/object.rb +0 -32
  598. data/test/lib/spec/runner/formatter.rb +0 -5
  599. data/test/lib/spec/runner/formatter/base_text_formatter.rb +0 -118
  600. data/test/lib/spec/runner/formatter/html_formatter.rb +0 -219
  601. data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +0 -27
  602. data/test/lib/spec/runner/formatter/rdoc_formatter.rb +0 -22
  603. data/test/lib/spec/runner/formatter/specdoc_formatter.rb +0 -23
  604. data/test/lib/spec/runner/heckle_runner.rb +0 -71
  605. data/test/lib/spec/runner/heckle_runner_win.rb +0 -10
  606. data/test/lib/spec/runner/option_parser.rb +0 -224
  607. data/test/lib/spec/runner/reporter.rb +0 -105
  608. data/test/lib/spec/runner/spec_matcher.rb +0 -25
  609. data/test/lib/spec/runner/spec_parser.rb +0 -41
  610. data/test/lib/spec/runner/spec_should_raise_handler.rb +0 -74
  611. data/test/lib/spec/runner/specification.rb +0 -114
  612. data/test/lib/spec/translator.rb +0 -87
  613. data/test/lib/spec/version.rb +0 -30
  614. data/test/network/handler/facts.rb +0 -112
  615. data/test/other/pgraph.rb +0 -290
  616. data/test/other/relationship.rb +0 -74
  617. data/test/puppet/modules.rb +0 -59
  618. data/test/rails/collection.rb +0 -247
  619. data/test/rails/interpreter.rb +0 -91
  620. data/test/ral/providers/mount/parsed.rb +0 -251
  621. data/test/ral/providers/service.rb +0 -235
  622. data/test/ral/types/component.rb +0 -113
  623. data/test/ral/types/interface.rb +0 -40
  624. data/test/ral/types/mount.rb +0 -362
  625. data/test/ral/types/package.rb +0 -154
  626. data/test/ral/types/schedule.rb +0 -357
  627. data/test/tagging/tagging.rb +0 -170
  628. data/test/util/fact_store.rb +0 -67
  629. data/test/util/graph.rb +0 -108
@@ -24,5 +24,3 @@ class Puppet::Parser::AST
24
24
  end
25
25
  end
26
26
  end
27
-
28
- # $Id: tag.rb 1835 2006-11-08 05:22:24Z luke $
@@ -22,20 +22,6 @@ class Puppet::Parser::AST
22
22
  def each
23
23
  [@name,@value].each { |child| yield child }
24
24
  end
25
-
26
- def tree(indent = 0)
27
- return [
28
- @name.tree(indent + 1),
29
- ((@@indline * 4 * indent) + self.typewrap(self.pin)),
30
- @value.tree(indent + 1)
31
- ].join("\n")
32
- end
33
-
34
- def to_s
35
- return "%s => %s" % [@name,@value]
36
- end
37
25
  end
38
26
 
39
27
  end
40
-
41
- # $Id: vardef.rb 2237 2007-02-28 00:07:41Z luke $
@@ -1,7 +1,66 @@
1
1
  # An object that collects stored objects from the central cache and returns
2
2
  # them to the current host, yo.
3
3
  class Puppet::Parser::Collector
4
- attr_accessor :type, :scope, :vquery, :rquery, :form, :resources
4
+ attr_accessor :type, :scope, :vquery, :equery, :form, :resources
5
+
6
+ # Call the collection method, mark all of the returned objects as non-virtual,
7
+ # and then delete this object from the list of collections to evaluate.
8
+ def evaluate
9
+ if self.resources
10
+ if objects = collect_resources and ! objects.empty?
11
+ return objects
12
+ else
13
+ return false
14
+ end
15
+ else
16
+ method = "collect_#{@form.to_s}"
17
+ objects = send(method).each do |obj|
18
+ obj.virtual = false
19
+ end
20
+ if objects.empty?
21
+ return false
22
+ else
23
+ return objects
24
+ end
25
+ end
26
+ end
27
+
28
+ def initialize(scope, type, equery, vquery, form)
29
+ @scope = scope
30
+
31
+ # Canonize the type
32
+ @type = Puppet::ResourceReference.new(type, "whatever").type
33
+ @equery = equery
34
+ @vquery = vquery
35
+
36
+ raise(ArgumentError, "Invalid query form %s" % form) unless [:exported, :virtual].include?(form)
37
+ @form = form
38
+ end
39
+
40
+ private
41
+
42
+ # Create our active record query.
43
+ def build_active_record_query
44
+ Puppet::Rails.init unless ActiveRecord::Base.connected?
45
+
46
+ raise Puppet::DevError, "Cannot collect resources for a nil host" unless @scope.host
47
+ host = Puppet::Rails::Host.find_by_name(@scope.host)
48
+
49
+ query = {:include => {:param_values => :param_name}}
50
+
51
+ search = "(exported=? AND restype=?)"
52
+ values = [true, @type]
53
+
54
+ search += " AND (?)" and values << @equery if @equery
55
+
56
+ # We're going to collect objects from rails, but we don't want any
57
+ # objects from this host.
58
+ search = ("host_id != ? AND %s" % search) and values.unshift(host.id) if host
59
+
60
+ query[:conditions] = [search, *values]
61
+
62
+ return query
63
+ end
5
64
 
6
65
  # Collect exported objects.
7
66
  def collect_exported
@@ -9,38 +68,16 @@ class Puppet::Parser::Collector
9
68
  # collect_virtual method but tell it to use 'exported? for the test.
10
69
  resources = collect_virtual(true).reject { |r| ! r.virtual? }
11
70
 
12
- count = 0
71
+ count = resources.length
13
72
 
14
- unless @scope.host
15
- raise Puppet::DevError, "Cannot collect resources for a nil host"
16
- end
17
-
18
- # We're going to collect objects from rails, but we don't want any
19
- # objects from this host.
20
- unless ActiveRecord::Base.connected?
21
- Puppet::Rails.init
22
- end
23
- host = Puppet::Rails::Host.find_by_name(@scope.host)
24
-
25
- args = {:include => {:param_values => :param_name}}
26
- args[:conditions] = "(exported = 't' AND restype = '%s')" % [@type]
27
- if @equery
28
- args[:conditions] += " AND (%s)" % [@equery]
29
- end
30
- if host
31
- args[:conditions] = "host_id != %s AND %s" % [host.id, args[:conditions]]
32
- else
33
- #Puppet.info "Host %s is uninitialized" % @scope.host
34
- end
73
+ query = build_active_record_query
35
74
 
36
75
  # Now look them up in the rails db. When we support attribute comparison
37
76
  # and such, we'll need to vary the conditions, but this works with no
38
77
  # attributes, anyway.
39
78
  time = Puppet::Util.thinmark do
40
- Puppet::Rails::Resource.find(:all, @type, true,
41
- args
42
- ).each do |obj|
43
- if resource = export_resource(obj)
79
+ Puppet::Rails::Resource.find(:all, @type, true, query).each do |obj|
80
+ if resource = exported_resource(obj)
44
81
  count += 1
45
82
  resources << resource
46
83
  end
@@ -62,13 +99,13 @@ class Puppet::Parser::Collector
62
99
  end
63
100
 
64
101
  def collect_exported_resources
65
- raise Puppet::ParseError,
66
- "realize() is not yet implemented for exported resources"
102
+ raise Puppet::ParseError, "realize() is not yet implemented for exported resources"
67
103
  end
68
104
 
69
105
  # Collect resources directly; this is the result of using 'realize',
70
106
  # which specifies resources, rather than using a normal collection.
71
107
  def collect_virtual_resources
108
+ return [] unless defined?(@resources) and ! @resources.empty?
72
109
  result = @resources.dup.collect do |ref|
73
110
  if res = @scope.findresource(ref.to_s)
74
111
  @resources.delete(ref)
@@ -81,58 +118,41 @@ class Puppet::Parser::Collector
81
118
  # If there are no more resources to find, delete this from the list
82
119
  # of collections.
83
120
  if @resources.empty?
84
- @scope.collections.delete(self)
121
+ @scope.compile.delete_collection(self)
85
122
  end
86
123
 
87
124
  return result
88
125
  end
89
126
 
90
- # Collect just virtual objects, from our local configuration.
127
+ # Collect just virtual objects, from our local compile.
91
128
  def collect_virtual(exported = false)
92
129
  if exported
93
130
  method = :exported?
94
131
  else
95
132
  method = :virtual?
96
133
  end
97
- scope.resources.find_all do |resource|
134
+ scope.compile.resources.find_all do |resource|
98
135
  resource.type == @type and resource.send(method) and match?(resource)
99
136
  end
100
137
  end
101
138
 
102
- # Call the collection method, mark all of the returned objects as non-virtual,
103
- # and then delete this object from the list of collections to evaluate.
104
- def evaluate
105
- if self.resources
106
- if objects = collect_resources and ! objects.empty?
107
- return objects
108
- else
109
- return false
110
- end
111
- else
112
- method = "collect_#{@form.to_s}"
113
- objects = send(method).each { |obj| obj.virtual = false }
114
- if objects.empty?
115
- return false
116
- else
117
- return objects
118
- end
139
+ # Seek a specific exported resource.
140
+ def exported_resource(obj)
141
+ if existing = @scope.findresource(obj.restype, obj.title)
142
+ # Next see if we've already collected this resource
143
+ return nil if existing.rails_id == obj.id
144
+
145
+ # This is the one we've already collected
146
+ raise Puppet::ParseError, "Exported resource %s cannot override local resource" % [obj.ref]
119
147
  end
120
148
 
121
- # if objects and ! objects.empty?
122
- # objects.each { |r| r.virtual = false }
123
- # return objects
124
- # else
125
- # return false
126
- # end
127
- end
149
+ resource = obj.to_resource(self.scope)
128
150
 
129
- def initialize(scope, type, equery, vquery, form)
130
- @scope = scope
131
- @type = type
132
- @equery = equery
133
- @vquery = vquery
134
- @form = form
135
- @tests = []
151
+ resource.exported = false
152
+
153
+ scope.compile.store_resource(scope, resource)
154
+
155
+ return resource
136
156
  end
137
157
 
138
158
  # Does the resource match our tests? We don't yet support tests,
@@ -144,42 +164,4 @@ class Puppet::Parser::Collector
144
164
  return true
145
165
  end
146
166
  end
147
-
148
- def export_resource(obj)
149
- if existing = @scope.findresource(obj.restype, obj.title)
150
- # See if we exported it; if so, just move on
151
- if @scope.host == obj.host.name
152
- return nil
153
- else
154
- # Next see if we've already collected this resource
155
- if existing.rails_id == obj.id
156
- # This is the one we've already collected
157
- return nil
158
- else
159
- raise Puppet::ParseError,
160
- "Exported resource %s cannot override local resource" %
161
- [obj.ref]
162
- end
163
- end
164
- end
165
-
166
- begin
167
- resource = obj.to_resource(self.scope)
168
-
169
- # XXX Because the scopes don't expect objects to return values,
170
- # we have to manually add our objects to the scope. This is
171
- # �ber-lame.
172
- scope.setresource(resource)
173
- rescue => detail
174
- if Puppet[:trace]
175
- puts detail.backtrace
176
- end
177
- raise
178
- end
179
- resource.exported = false
180
-
181
- return resource
182
- end
183
167
  end
184
-
185
- # $Id: collector.rb 2746 2007-08-05 17:57:31Z luke $
@@ -0,0 +1,509 @@
1
+ # Created by Luke A. Kanies on 2007-08-13.
2
+ # Copyright (c) 2007. All rights reserved.
3
+
4
+ require 'puppet/external/gratr/digraph'
5
+ require 'puppet/external/gratr/import'
6
+ require 'puppet/external/gratr/dot'
7
+
8
+ require 'puppet/node'
9
+ require 'puppet/node/catalog'
10
+ require 'puppet/util/errors'
11
+
12
+ # Maintain a graph of scopes, along with a bunch of data
13
+ # about the individual catalog we're compiling.
14
+ class Puppet::Parser::Compile
15
+ include Puppet::Util
16
+ include Puppet::Util::Errors
17
+ attr_reader :parser, :node, :facts, :collections, :catalog, :node_scope
18
+
19
+ # Add a collection to the global list.
20
+ def add_collection(coll)
21
+ @collections << coll
22
+ end
23
+
24
+ # Do we use nodes found in the code, vs. the external node sources?
25
+ def ast_nodes?
26
+ parser.nodes.length > 0
27
+ end
28
+
29
+ # Store the fact that we've evaluated a class, and store a reference to
30
+ # the scope in which it was evaluated, so that we can look it up later.
31
+ def class_set(name, scope)
32
+ if existing = @class_scopes[name]
33
+ if existing.nodescope? or scope.nodescope?
34
+ raise Puppet::ParseError, "Cannot have classes, nodes, or definitions with the same name"
35
+ else
36
+ raise Puppet::DevError, "Somehow evaluated the same class twice"
37
+ end
38
+ end
39
+ @class_scopes[name] = scope
40
+ @catalog.add_class(name) unless name == ""
41
+ end
42
+
43
+ # Return the scope associated with a class. This is just here so
44
+ # that subclasses can set their parent scopes to be the scope of
45
+ # their parent class, and it's also used when looking up qualified
46
+ # variables.
47
+ def class_scope(klass)
48
+ # They might pass in either the class or class name
49
+ if klass.respond_to?(:classname)
50
+ @class_scopes[klass.classname]
51
+ else
52
+ @class_scopes[klass]
53
+ end
54
+ end
55
+
56
+ # Return a list of all of the defined classes.
57
+ def classlist
58
+ return @catalog.classes
59
+ end
60
+
61
+ # Compile our catalog. This mostly revolves around finding and evaluating classes.
62
+ # This is the main entry into our catalog.
63
+ def compile
64
+ # Set the client's parameters into the top scope.
65
+ set_node_parameters()
66
+
67
+ evaluate_main()
68
+
69
+ evaluate_ast_node()
70
+
71
+ evaluate_node_classes()
72
+
73
+ evaluate_generators()
74
+
75
+ fail_on_unevaluated()
76
+
77
+ finish()
78
+
79
+ if Puppet[:storeconfigs]
80
+ store()
81
+ end
82
+
83
+ return @catalog
84
+ end
85
+
86
+ # LAK:FIXME There are no tests for this.
87
+ def delete_collection(coll)
88
+ @collections.delete(coll) if @collections.include?(coll)
89
+ end
90
+
91
+ # LAK:FIXME There are no tests for this.
92
+ def delete_resource(resource)
93
+ @resource_table.delete(resource.ref) if @resource_table.include?(resource.ref)
94
+ end
95
+
96
+ # Return the node's environment.
97
+ def environment
98
+ unless defined? @environment
99
+ if node.environment and node.environment != ""
100
+ @environment = node.environment
101
+ else
102
+ @environment = nil
103
+ end
104
+ end
105
+ @environment
106
+ end
107
+
108
+ # Evaluate all of the classes specified by the node.
109
+ def evaluate_node_classes
110
+ evaluate_classes(@node.classes, topscope)
111
+ end
112
+
113
+ # Evaluate each specified class in turn. If there are any classes we can't
114
+ # find, just tag the catalog and move on. This method really just
115
+ # creates resource objects that point back to the classes, and then the
116
+ # resources are themselves evaluated later in the process.
117
+ def evaluate_classes(classes, scope, lazy_evaluate = true)
118
+ unless scope.source
119
+ raise Puppet::DevError, "No source for scope passed to evaluate_classes"
120
+ end
121
+ found = []
122
+ classes.each do |name|
123
+ # If we can find the class, then make a resource that will evaluate it.
124
+ if klass = scope.findclass(name)
125
+ # Create a resource to model this class, and then add it to the list
126
+ # of resources.
127
+ resource = Puppet::Parser::Resource.new(:type => "class", :title => klass.classname, :scope => scope, :source => scope.source)
128
+ store_resource(scope, resource)
129
+
130
+ # If they've disabled lazy evaluation (which the :include function does),
131
+ # then evaluate our resource immediately.
132
+ resource.evaluate unless lazy_evaluate
133
+ @catalog.tag(klass.classname)
134
+ found << name
135
+ else
136
+ Puppet.info "Could not find class %s for %s" % [name, node.name]
137
+ @catalog.tag(name)
138
+ end
139
+ end
140
+ found
141
+ end
142
+
143
+ # Return a resource by either its ref or its type and title.
144
+ def findresource(string, name = nil)
145
+ string = "%s[%s]" % [string.capitalize, name] if name
146
+
147
+ @resource_table[string]
148
+ end
149
+
150
+ # Set up our compile. We require a parser
151
+ # and a node object; the parser is so we can look up classes
152
+ # and AST nodes, and the node has all of the client's info,
153
+ # like facts and environment.
154
+ def initialize(node, parser, options = {})
155
+ @node = node
156
+ @parser = parser
157
+
158
+ options.each do |param, value|
159
+ begin
160
+ send(param.to_s + "=", value)
161
+ rescue NoMethodError
162
+ raise ArgumentError, "Compile objects do not accept %s" % param
163
+ end
164
+ end
165
+
166
+ initvars()
167
+ init_main()
168
+ end
169
+
170
+ # Create a new scope, with either a specified parent scope or
171
+ # using the top scope. Adds an edge between the scope and
172
+ # its parent to the graph.
173
+ def newscope(parent, options = {})
174
+ parent ||= topscope
175
+ options[:compile] = self
176
+ options[:parser] ||= self.parser
177
+ scope = Puppet::Parser::Scope.new(options)
178
+ @scope_graph.add_edge!(parent, scope)
179
+ scope
180
+ end
181
+
182
+ # Find the parent of a given scope. Assumes scopes only ever have
183
+ # one in edge, which will always be true.
184
+ def parent(scope)
185
+ if ary = @scope_graph.adjacent(scope, :direction => :in) and ary.length > 0
186
+ ary[0]
187
+ else
188
+ nil
189
+ end
190
+ end
191
+
192
+ # Return any overrides for the given resource.
193
+ def resource_overrides(resource)
194
+ @resource_overrides[resource.ref]
195
+ end
196
+
197
+ # Return a list of all resources.
198
+ def resources
199
+ @resource_table.values
200
+ end
201
+
202
+ # Store a resource override.
203
+ def store_override(override)
204
+ override.override = true
205
+
206
+ # If possible, merge the override in immediately.
207
+ if resource = @resource_table[override.ref]
208
+ resource.merge(override)
209
+ else
210
+ # Otherwise, store the override for later; these
211
+ # get evaluated in Resource#finish.
212
+ @resource_overrides[override.ref] << override
213
+ end
214
+ end
215
+
216
+ # Store a resource in our resource table.
217
+ def store_resource(scope, resource)
218
+ # This might throw an exception
219
+ verify_uniqueness(resource)
220
+
221
+ # Store it in the global table.
222
+ @resource_table[resource.ref] = resource
223
+
224
+ # And in the resource graph. At some point, this might supercede
225
+ # the global resource table, but the table is a lot faster
226
+ # so it makes sense to maintain for now.
227
+ @catalog.add_edge!(scope.resource, resource)
228
+ end
229
+
230
+ # The top scope is usually the top-level scope, but if we're using AST nodes,
231
+ # then it is instead the node's scope.
232
+ def topscope
233
+ node_scope || @topscope
234
+ end
235
+
236
+ private
237
+
238
+ # If ast nodes are enabled, then see if we can find and evaluate one.
239
+ def evaluate_ast_node
240
+ return unless ast_nodes?
241
+
242
+ # Now see if we can find the node.
243
+ astnode = nil
244
+ @node.names.each do |name|
245
+ break if astnode = @parser.nodes[name.to_s.downcase]
246
+ end
247
+
248
+ unless (astnode ||= @parser.nodes["default"])
249
+ raise Puppet::ParseError, "Could not find default node or by name with '%s'" % node.names.join(", ")
250
+ end
251
+
252
+ # Create a resource to model this node, and then add it to the list
253
+ # of resources.
254
+ resource = Puppet::Parser::Resource.new(:type => "node", :title => astnode.classname, :scope => topscope, :source => topscope.source)
255
+ store_resource(topscope, resource)
256
+ @catalog.tag(astnode.classname)
257
+
258
+ resource.evaluate
259
+
260
+ # Now set the node scope appropriately, so that :topscope can
261
+ # behave differently.
262
+ @node_scope = class_scope(astnode)
263
+ end
264
+
265
+ # Evaluate our collections and return true if anything returned an object.
266
+ # The 'true' is used to continue a loop, so it's important.
267
+ def evaluate_collections
268
+ return false if @collections.empty?
269
+
270
+ found_something = false
271
+ exceptwrap do
272
+ # We have to iterate over a dup of the array because
273
+ # collections can delete themselves from the list, which
274
+ # changes its length and causes some collections to get missed.
275
+ @collections.dup.each do |collection|
276
+ found_something = true if collection.evaluate
277
+ end
278
+ end
279
+
280
+ return found_something
281
+ end
282
+
283
+ # Make sure all of our resources have been evaluated into native resources.
284
+ # We return true if any resources have, so that we know to continue the
285
+ # evaluate_generators loop.
286
+ def evaluate_definitions
287
+ exceptwrap do
288
+ if ary = unevaluated_resources
289
+ ary.each do |resource|
290
+ resource.evaluate
291
+ end
292
+ # If we evaluated, let the loop know.
293
+ return true
294
+ else
295
+ return false
296
+ end
297
+ end
298
+ end
299
+
300
+ # Iterate over collections and resources until we're sure that the whole
301
+ # compile is evaluated. This is necessary because both collections
302
+ # and defined resources can generate new resources, which themselves could
303
+ # be defined resources.
304
+ def evaluate_generators
305
+ count = 0
306
+ loop do
307
+ done = true
308
+
309
+ # Call collections first, then definitions.
310
+ done = false if evaluate_collections
311
+ done = false if evaluate_definitions
312
+ break if done
313
+ if count > 1000
314
+ raise Puppet::ParseError, "Somehow looped more than 1000 times while evaluating host catalog"
315
+ end
316
+ end
317
+ end
318
+
319
+ # Find and evaluate our main object, if possible.
320
+ def evaluate_main
321
+ @main = @parser.findclass("", "") || @parser.newclass("")
322
+ @topscope.source = @main
323
+ @main_resource = Puppet::Parser::Resource.new(:type => "class", :title => :main, :scope => @topscope, :source => @main)
324
+ @topscope.resource = @main_resource
325
+
326
+ @catalog.add_vertex!(@main_resource)
327
+
328
+ @resource_table["Class[main]"] = @main_resource
329
+
330
+ @main_resource.evaluate
331
+ end
332
+
333
+ # Make sure the entire catalog is evaluated.
334
+ def fail_on_unevaluated
335
+ fail_on_unevaluated_overrides
336
+ fail_on_unevaluated_resource_collections
337
+ end
338
+
339
+ # If there are any resource overrides remaining, then we could
340
+ # not find the resource they were supposed to override, so we
341
+ # want to throw an exception.
342
+ def fail_on_unevaluated_overrides
343
+ remaining = []
344
+ @resource_overrides.each do |name, overrides|
345
+ remaining += overrides
346
+ end
347
+
348
+ unless remaining.empty?
349
+ fail Puppet::ParseError,
350
+ "Could not find object(s) %s" % remaining.collect { |o|
351
+ o.ref
352
+ }.join(", ")
353
+ end
354
+ end
355
+
356
+ # Make sure we don't have any remaining collections that specifically
357
+ # look for resources, because we want to consider those to be
358
+ # parse errors.
359
+ def fail_on_unevaluated_resource_collections
360
+ remaining = []
361
+ @collections.each do |coll|
362
+ # We're only interested in the 'resource' collections,
363
+ # which result from direct calls of 'realize'. Anything
364
+ # else is allowed not to return resources.
365
+ # Collect all of them, so we have a useful error.
366
+ if r = coll.resources
367
+ if r.is_a?(Array)
368
+ remaining += r
369
+ else
370
+ remaining << r
371
+ end
372
+ end
373
+ end
374
+
375
+ unless remaining.empty?
376
+ raise Puppet::ParseError, "Failed to realize virtual resources %s" %
377
+ remaining.join(', ')
378
+ end
379
+ end
380
+
381
+ # Make sure all of our resources and such have done any last work
382
+ # necessary.
383
+ def finish
384
+ @resource_table.each { |name, resource| resource.finish if resource.respond_to?(:finish) }
385
+ end
386
+
387
+ # Initialize the top-level scope, class, and resource.
388
+ def init_main
389
+ # Create our initial scope and a resource that will evaluate main.
390
+ @topscope = Puppet::Parser::Scope.new(:compile => self, :parser => self.parser)
391
+ @scope_graph.add_vertex!(@topscope)
392
+ end
393
+
394
+ # Set up all of our internal variables.
395
+ def initvars
396
+ # The table for storing class singletons. This will only actually
397
+ # be used by top scopes and node scopes.
398
+ @class_scopes = {}
399
+
400
+ # The table for all defined resources.
401
+ @resource_table = {}
402
+
403
+ # The list of objects that will available for export.
404
+ @exported_resources = {}
405
+
406
+ # The list of overrides. This is used to cache overrides on objects
407
+ # that don't exist yet. We store an array of each override.
408
+ @resource_overrides = Hash.new do |overs, ref|
409
+ overs[ref] = []
410
+ end
411
+
412
+ # The list of collections that have been created. This is a global list,
413
+ # but they each refer back to the scope that created them.
414
+ @collections = []
415
+
416
+ # A list of tags we've generated; most class names.
417
+ @tags = []
418
+
419
+ # A graph for maintaining scope relationships.
420
+ @scope_graph = GRATR::Digraph.new
421
+
422
+ # For maintaining the relationship between scopes and their resources.
423
+ @catalog = Puppet::Node::Catalog.new(@node.name)
424
+ @catalog.version = @parser.version
425
+ end
426
+
427
+ # Set the node's parameters into the top-scope as variables.
428
+ def set_node_parameters
429
+ node.parameters.each do |param, value|
430
+ @topscope.setvar(param, value)
431
+ end
432
+ end
433
+
434
+ # Store the catalog into the database.
435
+ def store
436
+ unless Puppet.features.rails?
437
+ raise Puppet::Error,
438
+ "storeconfigs is enabled but rails is unavailable"
439
+ end
440
+
441
+ unless ActiveRecord::Base.connected?
442
+ Puppet::Rails.connect
443
+ end
444
+
445
+ # We used to have hooks here for forking and saving, but I don't
446
+ # think it's worth retaining at this point.
447
+ store_to_active_record(@node, @resource_table.values)
448
+ end
449
+
450
+ # Do the actual storage.
451
+ def store_to_active_record(node, resources)
452
+ begin
453
+ # We store all of the objects, even the collectable ones
454
+ benchmark(:info, "Stored catalog for #{node.name}") do
455
+ Puppet::Rails::Host.transaction do
456
+ Puppet::Rails::Host.store(node, resources)
457
+ end
458
+ end
459
+ rescue => detail
460
+ if Puppet[:trace]
461
+ puts detail.backtrace
462
+ end
463
+ Puppet.err "Could not store configs: %s" % detail.to_s
464
+ end
465
+ end
466
+
467
+ # Return an array of all of the unevaluated resources. These will be definitions,
468
+ # which need to get evaluated into native resources.
469
+ def unevaluated_resources
470
+ ary = @resource_table.find_all do |name, object|
471
+ ! object.builtin? and ! object.evaluated?
472
+ end.collect { |name, object| object }
473
+
474
+ if ary.empty?
475
+ return nil
476
+ else
477
+ return ary
478
+ end
479
+ end
480
+
481
+ # Verify that the given resource isn't defined elsewhere.
482
+ def verify_uniqueness(resource)
483
+ # Short-curcuit the common case,
484
+ unless existing_resource = @resource_table[resource.ref]
485
+ return true
486
+ end
487
+
488
+ if typeclass = Puppet::Type.type(resource.type) and ! typeclass.isomorphic?
489
+ Puppet.info "Allowing duplicate %s" % typeclass.name
490
+ return true
491
+ end
492
+
493
+ # Either it's a defined type, which are never
494
+ # isomorphic, or it's a non-isomorphic type, so
495
+ # we should throw an exception.
496
+ msg = "Duplicate definition: %s is already defined" % resource.ref
497
+
498
+ if existing_resource.file and existing_resource.line
499
+ msg << " in file %s at line %s" %
500
+ [existing_resource.file, existing_resource.line]
501
+ end
502
+
503
+ if resource.line or resource.file
504
+ msg << "; cannot redefine"
505
+ end
506
+
507
+ raise Puppet::ParseError.new(msg)
508
+ end
509
+ end