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
@@ -1,4 +1,3 @@
1
- # Grr
2
1
  require 'puppet/util/autoload'
3
2
  require 'puppet/parser/scope'
4
3
 
@@ -109,7 +108,10 @@ module Functions
109
108
 
110
109
  # Include the specified classes
111
110
  newfunction(:include, :doc => "Evaluate one or more classes.") do |vals|
112
- klasses = evalclasses(*vals)
111
+ vals = [vals] unless vals.is_a?(Array)
112
+
113
+ # The 'false' disables lazy evaluation.
114
+ klasses = compile.evaluate_classes(vals, self, false)
113
115
 
114
116
  missing = vals.find_all do |klass|
115
117
  ! klasses.include?(klass)
@@ -135,7 +137,7 @@ module Functions
135
137
  newfunction(:tag, :doc => "Add the specified tags to the containing class
136
138
  or definition. All contained objects will then acquire that tag, also.
137
139
  ") do |vals|
138
- self.tag(*vals)
140
+ self.resource.tag(*vals)
139
141
  end
140
142
 
141
143
  # Test whether a given tag is set. This functions as a big OR -- if any of the
@@ -144,11 +146,12 @@ module Functions
144
146
  tells you whether the current container is tagged with the specified tags.
145
147
  The tags are ANDed, so that all of the specified tags must be included for
146
148
  the function to return true.") do |vals|
147
- classlist = self.classlist
149
+ configtags = compile.catalog.tags
150
+ resourcetags = resource.tags
148
151
 
149
152
  retval = true
150
153
  vals.each do |val|
151
- unless classlist.include?(val) or self.tags.include?(val)
154
+ unless configtags.include?(val) or resourcetags.include?(val)
152
155
  retval = false
153
156
  break
154
157
  end
@@ -199,11 +202,9 @@ module Functions
199
202
  end
200
203
 
201
204
  newfunction(:template, :type => :rvalue, :doc => "Evaluate a template and
202
- return its value. See `the templating docs`_
205
+ return its value. See `the templating docs </trac/puppet/wiki/PuppetTemplating>`_
203
206
  for more information. Note that if multiple templates are specified, their
204
207
  output is all concatenated and returned as the output of the function.
205
-
206
- .. _the templating docs: /trac/puppet/wiki/PuppetTemplating
207
208
  ") do |vals|
208
209
  require 'erb'
209
210
 
@@ -234,7 +235,7 @@ module Functions
234
235
  vals = [vals] unless vals.is_a?(Array)
235
236
  coll.resources = vals
236
237
 
237
- newcollection(coll)
238
+ compile.add_collection(coll)
238
239
  end
239
240
 
240
241
  newfunction(:search, :doc => "Add another namespace for this class to search.
@@ -303,4 +304,3 @@ module Functions
303
304
  end
304
305
  end
305
306
 
306
- # $Id: functions.rb 2681 2007-07-12 14:35:45Z luke $
@@ -3,315 +3,33 @@ require 'timeout'
3
3
  require 'puppet/rails'
4
4
  require 'puppet/util/methodhelper'
5
5
  require 'puppet/parser/parser'
6
+ require 'puppet/parser/compile'
6
7
  require 'puppet/parser/scope'
7
8
 
8
- # The interpreter's job is to convert from a parsed file to the configuration
9
- # for a given client. It really doesn't do any work on its own, it just collects
10
- # and calls out to other objects.
9
+ # The interpreter is a very simple entry-point class that
10
+ # manages the existence of the parser (e.g., replacing it
11
+ # when files are reparsed). You can feed it a node and
12
+ # get the node's catalog back.
11
13
  class Puppet::Parser::Interpreter
12
- class NodeDef
13
- include Puppet::Util::MethodHelper
14
- attr_accessor :name, :classes, :parameters, :source
15
-
16
- def evaluate(options)
17
- begin
18
- parameters.each do |param, value|
19
- # Don't try to override facts with these parameters
20
- options[:scope].setvar(param, value) unless options[:scope].lookupvar(param, false) != :undefined
21
- end
22
-
23
- # Also, set the 'nodename', since it might not be obvious how the node was looked up
24
- options[:scope].setvar("nodename", @name) unless options[:scope].lookupvar(@nodename, false) != :undefined
25
- rescue => detail
26
- raise Puppet::ParseError, "Could not set parameters for %s: %s" % [name, detail]
27
- end
28
-
29
- # Then evaluate the classes.
30
- begin
31
- options[:scope].function_include(classes.find_all { |c| options[:scope].findclass(c) })
32
- rescue => detail
33
- puts detail.backtrace
34
- raise Puppet::ParseError, "Could not evaluate classes for %s: %s" % [name, detail]
35
- end
36
- end
37
-
38
- def initialize(args)
39
- set_options(args)
40
-
41
- raise Puppet::DevError, "NodeDefs require names" unless self.name
42
-
43
- if self.classes.is_a?(String)
44
- @classes = [@classes]
45
- else
46
- @classes ||= []
47
- end
48
- @parameters ||= {}
49
- end
50
-
51
- def safeevaluate(args)
52
- evaluate(args)
53
- end
54
- end
55
-
56
14
  include Puppet::Util
57
15
 
58
16
  attr_accessor :usenodes
59
17
 
60
- class << self
61
- attr_writer :ldap
62
- end
63
-
64
- # just shorten the constant path a bit, using what amounts to an alias
65
- AST = Puppet::Parser::AST
66
-
67
18
  include Puppet::Util::Errors
68
19
 
69
- # Create an ldap connection. This is a class method so others can call
70
- # it and use the same variables and such.
71
- def self.ldap
72
- unless defined? @ldap and @ldap
73
- if Puppet[:ldapssl]
74
- @ldap = LDAP::SSLConn.new(Puppet[:ldapserver], Puppet[:ldapport])
75
- elsif Puppet[:ldaptls]
76
- @ldap = LDAP::SSLConn.new(
77
- Puppet[:ldapserver], Puppet[:ldapport], true
78
- )
79
- else
80
- @ldap = LDAP::Conn.new(Puppet[:ldapserver], Puppet[:ldapport])
81
- end
82
- @ldap.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
83
- @ldap.set_option(LDAP::LDAP_OPT_REFERRALS, LDAP::LDAP_OPT_ON)
84
- @ldap.simple_bind(Puppet[:ldapuser], Puppet[:ldappassword])
85
- end
86
-
87
- return @ldap
88
- end
89
-
90
- # Make sure we don't have any remaining collections that specifically
91
- # look for resources, because we want to consider those to be
92
- # parse errors.
93
- def check_resource_collections(scope)
94
- remaining = []
95
- scope.collections.each do |coll|
96
- if r = coll.resources
97
- if r.is_a?(Array)
98
- remaining += r
99
- else
100
- remaining << r
101
- end
102
- end
103
- end
104
- unless remaining.empty?
105
- raise Puppet::ParseError, "Failed to find virtual resources %s" %
106
- remaining.join(', ')
107
- end
108
- end
109
-
110
- # Iteratively evaluate all of the objects. This finds all of the objects
111
- # that represent definitions and evaluates the definitions appropriately.
112
- # It also adds defaults and overrides as appropriate.
113
- def evaliterate(scope)
114
- count = 0
115
- loop do
116
- count += 1
117
- done = true
118
- # First perform collections, so we can collect defined types.
119
- if coll = scope.collections and ! coll.empty?
120
- exceptwrap do
121
- coll.each do |c|
122
- # Only keep the loop going if we actually successfully
123
- # collected something.
124
- if o = c.evaluate
125
- done = false
126
- end
127
- end
128
- end
129
- end
130
-
131
- # Then evaluate any defined types.
132
- if ary = scope.unevaluated
133
- ary.each do |resource|
134
- resource.evaluate
135
- end
136
- # If we evaluated, then loop through again.
137
- done = false
138
- end
139
- break if done
140
-
141
- if count > 1000
142
- raise Puppet::ParseError, "Got 1000 class levels, which is unsupported"
143
- end
144
- end
145
- end
146
-
147
- # Evaluate a specific node.
148
- def evalnode(client, scope, facts)
149
- return unless self.usenodes
150
-
151
- unless client
152
- raise Puppet::Error,
153
- "Cannot evaluate nodes with a nil client"
154
- end
155
- names = [client]
156
-
157
- # Make sure both the fqdn and the short name of the
158
- # host can be used in the manifest
159
- if client =~ /\./
160
- names << client.sub(/\..+/,'')
161
- else
162
- names << "#{client}.#{facts['domain']}"
163
- end
164
-
165
- if names.empty?
166
- raise Puppet::Error,
167
- "Cannot evaluate nodes with a nil client"
168
- end
169
-
170
- # Look up our node object.
171
- if nodeclass = nodesearch(*names)
172
- nodeclass.safeevaluate :scope => scope
173
- else
174
- raise Puppet::Error, "Could not find %s with names %s" %
175
- [client, names.join(", ")]
176
- end
20
+ # Determine the configuration version for a given node's environment.
21
+ def configuration_version(node)
22
+ parser(node.environment).version
177
23
  end
178
24
 
179
- # Evaluate all of the code we can find that's related to our client.
180
- def evaluate(client, facts)
181
-
182
- scope = Puppet::Parser::Scope.new(:interp => self) # no parent scope
183
- scope.name = "top"
184
- scope.type = "main"
185
-
186
- scope.host = client || facts["hostname"] || Facter.value(:hostname)
187
-
188
- classes = @classes.dup
189
-
190
- # Okay, first things first. Set our facts.
191
- scope.setfacts(facts)
192
-
193
- # Everyone will always evaluate the top-level class, if there is one.
194
- if klass = findclass("", "")
195
- # Set the source, so objects can tell where they were defined.
196
- scope.source = klass
197
- klass.safeevaluate :scope => scope, :nosubscope => true
198
- end
199
-
200
- # Next evaluate the node. We pass the facts so they can be used
201
- # when building the list of names for which to search.
202
- evalnode(client, scope, facts)
203
-
204
- # If we were passed any classes, evaluate those.
205
- if classes
206
- classes.each do |klass|
207
- if klassobj = findclass("", klass)
208
- klassobj.safeevaluate :scope => scope
209
- end
210
- end
211
- end
212
-
213
- # That was the first pass evaluation. Now iteratively evaluate
214
- # until we've gotten rid of all of everything or thrown an error.
215
- evaliterate(scope)
216
-
217
- # Now make sure we fail if there's anything left to do
218
- failonleftovers(scope)
219
-
220
- # Now finish everything. This recursively calls finish on the
221
- # contained scopes and resources.
222
- scope.finish
223
-
224
- # Store everything. We need to do this before translation, because
225
- # it operates on resources, not transobjects.
226
- if Puppet[:storeconfigs]
227
- args = {
228
- :resources => scope.resources,
229
- :name => scope.host,
230
- :facts => facts
231
- }
232
- unless scope.classlist.empty?
233
- args[:classes] = scope.classlist
234
- end
235
-
236
- storeconfigs(args)
237
- end
238
-
239
- # Now, finally, convert our scope tree + resources into a tree of
240
- # buckets and objects.
241
- objects = scope.translate
242
-
243
- # Add the class list
244
- unless scope.classlist.empty?
245
- objects.classes = scope.classlist
246
- end
247
-
248
- return objects
249
- end
250
-
251
- # Fail if there any overrides left to perform.
252
- def failonleftovers(scope)
253
- overrides = scope.overrides
254
- unless overrides.empty?
255
- fail Puppet::ParseError,
256
- "Could not find object(s) %s" % overrides.collect { |o|
257
- o.ref
258
- }.join(", ")
259
- end
260
-
261
- # Now check that there aren't any extra resource collections.
262
- check_resource_collections(scope)
263
- end
264
-
265
- # Create proxy methods, so the scopes can call the interpreter, since
266
- # they don't have access to the parser.
267
- def findclass(namespace, name)
268
- @parser.findclass(namespace, name)
269
- end
270
- def finddefine(namespace, name)
271
- @parser.finddefine(namespace, name)
25
+ # evaluate our whole tree
26
+ def compile(node)
27
+ raise Puppet::ParseError, "Could not parse configuration; cannot compile" unless env_parser = parser(node.environment)
28
+ return Puppet::Parser::Compile.new(node, env_parser).compile
272
29
  end
273
30
 
274
31
  # create our interpreter
275
- def initialize(hash)
276
- if @code = hash[:Code]
277
- @file = nil # to avoid warnings
278
- elsif ! @file = hash[:Manifest]
279
- devfail "You must provide code or a manifest"
280
- end
281
-
282
- if hash.include?(:UseNodes)
283
- @usenodes = hash[:UseNodes]
284
- else
285
- @usenodes = true
286
- end
287
-
288
-
289
- if Puppet[:ldapnodes]
290
- # Nodes in the file override nodes in ldap.
291
- @nodesource = :ldap
292
- elsif Puppet[:external_nodes] != "none"
293
- @nodesource = :external
294
- else
295
- # By default, we only search for parsed nodes.
296
- @nodesource = :code
297
- end
298
-
299
- @setup = false
300
-
301
- # Set it to either the value or nil. This is currently only used
302
- # by the cfengine module.
303
- @classes = hash[:Classes] || []
304
-
305
- @local = hash[:Local] || false
306
-
307
- if hash.include?(:ForkSave)
308
- @forksave = hash[:ForkSave]
309
- else
310
- # This is just too dangerous right now. Sorry, it's going
311
- # to have to be slow.
312
- @forksave = false
313
- end
314
-
32
+ def initialize
315
33
  # The class won't always be defined during testing.
316
34
  if Puppet[:storeconfigs]
317
35
  if Puppet.features.rails?
@@ -321,388 +39,52 @@ class Puppet::Parser::Interpreter
321
39
  end
322
40
  end
323
41
 
324
- @files = []
325
-
326
- # Create our parser object
327
- parsefiles
328
- end
329
-
330
- # Find the ldap node, return the class list and parent node specially,
331
- # and everything else in a parameter hash.
332
- def ldapsearch(node)
333
- unless defined? @ldap and @ldap
334
- setup_ldap()
335
- unless @ldap
336
- Puppet.info "Skipping ldap source; no ldap connection"
337
- return nil
338
- end
339
- end
340
-
341
- filter = Puppet[:ldapstring]
342
- classattrs = Puppet[:ldapclassattrs].split("\s*,\s*")
343
- if Puppet[:ldapattrs] == "all"
344
- # A nil value here causes all attributes to be returned.
345
- search_attrs = nil
346
- else
347
- search_attrs = classattrs + Puppet[:ldapattrs].split("\s*,\s*")
348
- end
349
- pattr = nil
350
- if pattr = Puppet[:ldapparentattr]
351
- if pattr == ""
352
- pattr = nil
353
- else
354
- search_attrs << pattr unless search_attrs.nil?
355
- end
356
- end
357
-
358
- if filter =~ /%s/
359
- filter = filter.gsub(/%s/, node)
360
- end
361
-
362
- parent = nil
363
- classes = []
364
- parameters = nil
365
-
366
- found = false
367
- count = 0
368
-
369
- begin
370
- # We're always doing a sub here; oh well.
371
- @ldap.search(Puppet[:ldapbase], 2, filter, search_attrs) do |entry|
372
- found = true
373
- if pattr
374
- if values = entry.vals(pattr)
375
- if values.length > 1
376
- raise Puppet::Error,
377
- "Node %s has more than one parent: %s" %
378
- [node, values.inspect]
379
- end
380
- unless values.empty?
381
- parent = values.shift
382
- end
383
- end
384
- end
385
-
386
- classattrs.each { |attr|
387
- if values = entry.vals(attr)
388
- values.each do |v| classes << v end
389
- end
390
- }
391
-
392
- parameters = entry.to_hash.inject({}) do |hash, ary|
393
- if ary[1].length == 1
394
- hash[ary[0]] = ary[1].shift
395
- else
396
- hash[ary[0]] = ary[1]
397
- end
398
- hash
399
- end
400
- end
401
- rescue => detail
402
- if count == 0
403
- # Try reconnecting to ldap
404
- @ldap = nil
405
- setup_ldap()
406
- retry
407
- else
408
- raise Puppet::Error, "LDAP Search failed: %s" % detail
409
- end
410
- end
411
-
412
- classes.flatten!
413
-
414
- if classes.empty?
415
- classes = nil
416
- end
417
-
418
- if parent or classes or parameters
419
- return parent, classes, parameters
420
- else
421
- return nil
422
- end
423
- end
424
-
425
- # Pass these methods through to the parser.
426
- [:newclass, :newdefine, :newnode].each do |name|
427
- define_method(name) do |*args|
428
- @parser.send(name, *args)
429
- end
430
- end
431
-
432
- # Add a new file to be checked when we're checking to see if we should be
433
- # reparsed.
434
- def newfile(*files)
435
- files.each do |file|
436
- unless file.is_a? Puppet::Util::LoadedFile
437
- file = Puppet::Util::LoadedFile.new(file)
438
- end
439
- @files << file
440
- end
441
- end
442
-
443
- # Search for our node in the various locations.
444
- def nodesearch(*nodes)
445
- nodes = nodes.collect { |n| n.to_s.downcase }
446
-
447
- method = "nodesearch_%s" % @nodesource
448
- # Do an inverse sort on the length, so the longest match always
449
- # wins
450
- nodes.sort { |a,b| b.length <=> a.length }.each do |node|
451
- node = node.to_s if node.is_a?(Symbol)
452
- if obj = self.send(method, node)
453
- if obj.is_a?(AST::Node)
454
- nsource = obj.file
455
- else
456
- nsource = obj.source
457
- end
458
- Puppet.info "Found %s in %s" % [node, nsource]
459
- return obj
460
- end
461
- end
462
-
463
- # If they made it this far, we haven't found anything, so look for a
464
- # default node.
465
- unless nodes.include?("default")
466
- if defobj = self.nodesearch("default")
467
- Puppet.notice "Using default node for %s" % [nodes[0]]
468
- return defobj
469
- end
470
- end
471
-
472
- return nil
473
- end
474
-
475
- # See if our node was defined in the code.
476
- def nodesearch_code(name)
477
- @parser.nodes[name]
478
- end
479
-
480
- # Look for external node definitions.
481
- def nodesearch_external(name)
482
- return nil unless Puppet[:external_nodes] != "none"
483
-
484
- begin
485
- output = Puppet::Util.execute([Puppet[:external_nodes], name])
486
- rescue Puppet::ExecutionFailure => detail
487
- if $?.exitstatus == 1
488
- return nil
489
- else
490
- Puppet.err "Could not retrieve external node information for %s: %s" % [name, detail]
491
- end
492
- return nil
493
- end
494
-
495
- if output =~ /\A\s*\Z/ # all whitespace
496
- Puppet.debug "Empty response for %s from external node source" % name
497
- return nil
498
- end
499
-
500
- begin
501
- result = YAML.load(output).inject({}) { |hash, data| hash[symbolize(data[0])] = data[1]; hash }
502
- rescue => detail
503
- raise Puppet::Error, "Could not load external node results for %s: %s" % [name, detail]
504
- end
505
-
506
- node_args = {:source => "external node source", :name => name}
507
- set = false
508
- [:parameters, :classes].each do |param|
509
- if value = result[param]
510
- node_args[param] = value
511
- set = true
512
- end
513
- end
514
-
515
- if set
516
- return NodeDef.new(node_args)
517
- else
518
- return nil
519
- end
520
- end
521
-
522
- # Look for our node in ldap.
523
- def nodesearch_ldap(node)
524
- unless ary = ldapsearch(node)
525
- return nil
526
- end
527
- parent, classes, parameters = ary
528
-
529
- while parent
530
- parent, tmpclasses, tmpparams = ldapsearch(parent)
531
- classes += tmpclasses if tmpclasses
532
- tmpparams.each do |param, value|
533
- # Specifically test for whether it's set, so false values are handled
534
- # correctly.
535
- parameters[param] = value unless parameters.include?(param)
536
- end
537
- end
538
-
539
- return NodeDef.new(:name => node, :classes => classes, :source => "ldap", :parameters => parameters)
540
- end
541
-
542
- def parsedate
543
- parsefiles()
544
- @parsedate
545
- end
546
-
547
- # evaluate our whole tree
548
- def run(client, facts)
549
- # We have to leave this for after initialization because there
550
- # seems to be a problem keeping ldap open after a fork.
551
- unless @setup
552
- method = "setup_%s" % @nodesource.to_s
553
- if respond_to? method
554
- exceptwrap :type => Puppet::Error,
555
- :message => "Could not set up node source %s" % @nodesource do
556
- self.send(method)
557
- end
558
- end
559
- end
560
- parsefiles()
561
-
562
- # Evaluate all of the appropriate code.
563
- objects = evaluate(client, facts)
564
-
565
- # And return it all.
566
- return objects
567
- end
568
-
569
- # Connect to the LDAP Server
570
- def setup_ldap
571
- self.class.ldap = nil
572
- unless Puppet.features.ldap?
573
- Puppet.notice(
574
- "Could not set up LDAP Connection: Missing ruby/ldap libraries"
575
- )
576
- @ldap = nil
577
- return
578
- end
579
-
580
- begin
581
- @ldap = self.class.ldap()
582
- rescue => detail
583
- raise Puppet::Error, "Could not connect to LDAP: %s" % detail
584
- end
585
- end
586
-
587
- def scope
588
- return @scope
42
+ @parsers = {}
589
43
  end
590
44
 
591
45
  private
592
46
 
593
- # Check whether any of our files have changed.
594
- def checkfiles
595
- if @files.find { |f| f.changed? }
596
- @parsedate = Time.now.to_i
597
- end
598
- end
599
-
600
- # Parse the files, generating our parse tree. This automatically
601
- # reparses only if files are updated, so it's safe to call multiple
602
- # times.
603
- def parsefiles
604
- # First check whether there are updates to any non-puppet files
605
- # like templates. If we need to reparse, this will get quashed,
606
- # but it needs to be done first in case there's no reparse
607
- # but there are other file changes.
608
- checkfiles()
609
-
610
- # Check if the parser should reparse.
611
- if @file
612
- if defined? @parser
613
- if stamp = @parser.reparse?
614
- Puppet.notice "Reloading files"
615
- else
616
- return false
617
- end
618
- end
619
-
620
- unless FileTest.exists?(@file)
621
- # If we've already parsed, then we're ok.
622
- if findclass("", "")
623
- return
624
- else
625
- raise Puppet::Error, "Manifest %s must exist" % @file
626
- end
627
- end
628
- end
629
-
630
- # Create a new parser, just to keep things fresh. Don't replace our
631
- # current parser until we know weverything works.
632
- newparser = Puppet::Parser::Parser.new()
633
- if @code
634
- newparser.string = @code
635
- else
636
- newparser.file = @file
637
- end
638
-
639
- # Parsing stores all classes and defines and such in their
640
- # various tables, so we don't worry about the return.
47
+ # Create a new parser object and pre-parse the configuration.
48
+ def create_parser(environment)
641
49
  begin
642
- if @local
643
- newparser.parse
50
+ parser = Puppet::Parser::Parser.new(:environment => environment)
51
+ if code = Puppet.settings.value(:code, environment) and code != ""
52
+ parser.string = code
644
53
  else
645
- benchmark(:info, "Parsed manifest") do
646
- newparser.parse
647
- end
648
- end
649
- # We've gotten this far, so it's ok to swap the parsers.
650
- oldparser = @parser
651
- @parser = newparser
652
- if oldparser
653
- oldparser.clear
54
+ file = Puppet.settings.value(:manifest, environment)
55
+ parser.file = file
654
56
  end
655
-
656
- # Mark when we parsed, so we can check freshness
657
- @parsedate = Time.now.to_i
57
+ parser.parse
58
+ return parser
658
59
  rescue => detail
659
- if Puppet[:trace]
660
- puts detail.backtrace
60
+ msg = "Could not parse"
61
+ if environment and environment != ""
62
+ msg += " for environment %s" % environment
661
63
  end
662
- Puppet.err "Could not parse; using old configuration: %s" % detail
64
+ msg += ": %s" % detail.to_s
65
+ error = Puppet::Error.new(msg)
66
+ error.set_backtrace(detail.backtrace)
67
+ raise error
663
68
  end
664
69
  end
665
70
 
666
- # Store the configs into the database.
667
- def storeconfigs(hash)
668
- unless Puppet.features.rails?
669
- raise Puppet::Error,
670
- "storeconfigs is enabled but rails is unavailable"
671
- end
672
-
673
- unless ActiveRecord::Base.connected?
674
- Puppet::Rails.connect
675
- end
676
-
677
- # Fork the storage, since we don't need the client waiting
678
- # on that. How do I avoid this duplication?
679
- if @forksave
680
- fork {
681
- # We store all of the objects, even the collectable ones
682
- benchmark(:info, "Stored configuration for #{hash[:name]}") do
683
- # Try to batch things a bit, by putting them into
684
- # a transaction
685
- Puppet::Rails::Host.transaction do
686
- Puppet::Rails::Host.store(hash)
687
- end
688
- end
689
- }
690
- else
71
+ # Return the parser for a specific environment.
72
+ def parser(environment)
73
+ if ! @parsers[environment] or @parsers[environment].reparse?
74
+ # This will throw an exception if it does not succeed. We only
75
+ # want to get rid of the old parser if we successfully create a new
76
+ # one.
691
77
  begin
692
- # We store all of the objects, even the collectable ones
693
- benchmark(:info, "Stored configuration for #{hash[:name]}") do
694
- Puppet::Rails::Host.transaction do
695
- Puppet::Rails::Host.store(hash)
696
- end
697
- end
78
+ tmp = create_parser(environment)
79
+ @parsers[environment].clear if @parsers[environment]
80
+ @parsers[environment] = tmp
698
81
  rescue => detail
699
- if Puppet[:trace]
700
- puts detail.backtrace
701
- end
702
- Puppet.err "Could not store configs: %s" % detail.to_s
82
+ # If a parser already exists, than assume that we logged the
83
+ # exception elsewhere and reuse the parser. If one doesn't
84
+ # exist, then reraise.
85
+ raise detail unless @parsers[environment]
703
86
  end
704
87
  end
88
+ @parsers[environment]
705
89
  end
706
90
  end
707
-
708
- # $Id: interpreter.rb 2742 2007-08-03 23:49:53Z luke $