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
@@ -3,6 +3,7 @@ require 'openssl'
3
3
  require 'puppet/external/base64'
4
4
 
5
5
  require 'xmlrpc/client'
6
+ require 'net/https'
6
7
  require 'yaml'
7
8
 
8
9
  module Puppet::Network
@@ -11,12 +12,55 @@ module Puppet::Network
11
12
  class XMLRPCClient < ::XMLRPC::Client
12
13
  attr_accessor :puppet_server, :puppet_port
13
14
  @clients = {}
15
+ @@http_cache = {}
14
16
 
15
17
  class << self
16
18
  include Puppet::Util
17
19
  include Puppet::Util::ClassGen
18
20
  end
19
21
 
22
+ # Clear our http cache.
23
+ def self.clear_http_instances
24
+ @@http_cache.clear
25
+ end
26
+
27
+ # Retrieve a cached http instance of caching is enabled, else return
28
+ # a new one.
29
+ def self.http_instance(host, port, reset = false)
30
+ # We overwrite the uninitialized @http here with a cached one.
31
+ key = "%s:%s" % [host, port]
32
+
33
+ # Return our cached instance if keepalive is enabled and we've got
34
+ # a cache, as long as we're not resetting the instance.
35
+ return @@http_cache[key] if ! reset and Puppet[:http_keepalive] and @@http_cache[key]
36
+
37
+ args = [host, port]
38
+ if Puppet[:http_proxy_host] == "none"
39
+ args << nil << nil
40
+ else
41
+ args << Puppet[:http_proxy_host] << Puppet[:http_proxy_port]
42
+ end
43
+ @http = Net::HTTP.new(*args)
44
+
45
+ # Pop open @http a little; older versions of Net::HTTP(s) didn't
46
+ # give us a reader for ca_file... Grr...
47
+ class << @http; attr_accessor :ca_file; end
48
+
49
+ @http.use_ssl = true
50
+ @http.read_timeout = 120
51
+ @http.open_timeout = 120
52
+ # JJM Configurable fix for #896.
53
+ if Puppet[:http_enable_post_connection_check]
54
+ @http.enable_post_connection_check = true
55
+ else
56
+ @http.enable_post_connection_check = false
57
+ end
58
+
59
+ @@http_cache[key] = @http if Puppet[:http_keepalive]
60
+
61
+ return @http
62
+ end
63
+
20
64
  # Create a netclient for each handler
21
65
  def self.mkclient(handler)
22
66
  interface = handler.interface
@@ -24,7 +68,7 @@ module Puppet::Network
24
68
 
25
69
  # Create a subclass for every client type. This is
26
70
  # so that all of the methods are on their own class,
27
- # so that they namespaces can define the same methods if
71
+ # so that their namespaces can define the same methods if
28
72
  # they want.
29
73
  constant = handler.name.to_s.capitalize
30
74
  name = namespace.downcase
@@ -42,13 +86,14 @@ module Puppet::Network
42
86
  begin
43
87
  call("%s.%s" % [namespace, method.to_s],*args)
44
88
  rescue OpenSSL::SSL::SSLError => detail
89
+ if detail.message =~ /bad write retry/
90
+ Puppet.warning "Transient SSL write error; restarting connection and retrying"
91
+ self.recycle_connection(@cert_client)
92
+ retry
93
+ end
45
94
  raise XMLRPCClientError,
46
95
  "Certificates were not trusted: %s" % detail
47
96
  rescue ::XMLRPC::FaultException => detail
48
- #Puppet.err "Could not call %s.%s: %s" %
49
- # [namespace, method, detail.faultString]
50
- #raise XMLRPCClientError,
51
- # "XMLRPC Error: %s" % detail.faultString
52
97
  raise XMLRPCClientError, detail.faultString
53
98
  rescue Errno::ECONNREFUSED => detail
54
99
  msg = "Could not connect to %s on port %s" %
@@ -56,13 +101,21 @@ module Puppet::Network
56
101
  raise XMLRPCClientError, msg
57
102
  rescue SocketError => detail
58
103
  Puppet.err "Could not find server %s: %s" %
59
- [@puppet_server, detail.to_s]
104
+ [@host, detail.to_s]
60
105
  error = XMLRPCClientError.new(
61
- "Could not find server %s" % @puppet_server
106
+ "Could not find server %s" % @host
62
107
  )
63
108
  error.set_backtrace detail.backtrace
64
109
  raise error
110
+ rescue Errno::EPIPE, EOFError
111
+ Puppet.warning "Other end went away; restarting connection and retrying"
112
+ self.recycle_connection(@cert_client)
113
+ retry
65
114
  rescue => detail
115
+ if detail.message =~ /^Wrong size\. Was \d+, should be \d+$/
116
+ Puppet.warning "XMLRPC returned wrong size. Retrying."
117
+ retry
118
+ end
66
119
  Puppet.err "Could not call %s.%s: %s" %
67
120
  [namespace, method, detail.inspect]
68
121
  error = XMLRPCClientError.new(detail.to_s)
@@ -81,18 +134,26 @@ module Puppet::Network
81
134
 
82
135
  # Use cert information from a Puppet client to set up the http object.
83
136
  def cert_setup(client)
84
- unless FileTest.exists?(Puppet[:localcacert])
137
+ # Cache it for next time
138
+ @cert_client = client
139
+
140
+ unless FileTest.exist?(Puppet[:localcacert])
85
141
  raise Puppet::SSLCertificates::Support::MissingCertificate,
86
142
  "Could not find ca certificate %s" % Puppet[:localcacert]
87
143
  end
88
- @http.ca_file = Puppet[:localcacert]
89
- store = OpenSSL::X509::Store.new
90
- store.add_file Puppet[:localcacert]
91
- store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
92
- @http.cert_store = store
93
- @http.cert = client.cert
94
- @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
95
- @http.key = client.key
144
+
145
+ # We can't overwrite certificates, @http will freeze itself
146
+ # once started.
147
+ unless @http.ca_file
148
+ @http.ca_file = Puppet[:localcacert]
149
+ store = OpenSSL::X509::Store.new
150
+ store.add_file Puppet[:localcacert]
151
+ store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
152
+ @http.cert_store = store
153
+ @http.cert = client.cert
154
+ @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
155
+ @http.key = client.key
156
+ end
96
157
  end
97
158
 
98
159
  def initialize(hash = {})
@@ -107,20 +168,28 @@ module Puppet::Network
107
168
  hash[:HTTPProxyPort] = nil
108
169
  end
109
170
 
110
- @puppet_server = hash[:Server]
111
- @puppet_port = hash[:Port]
112
-
113
171
  super(
114
172
  hash[:Server],
115
173
  hash[:Path],
116
174
  hash[:Port],
117
- hash[:HTTPProxyHost], # proxy_host
118
- hash[:HTTPProxyPort], # proxy_port
175
+ hash[:HTTPProxyHost],
176
+ hash[:HTTPProxyPort],
119
177
  nil, # user
120
178
  nil, # password
121
179
  true, # use_ssl
122
180
  120 # a two minute timeout, instead of 30 seconds
123
181
  )
182
+ @http = self.class.http_instance(@host, @port)
183
+ end
184
+
185
+ def recycle_connection(client)
186
+ @http = self.class.http_instance(@host, @port, true) # reset the instance
187
+
188
+ cert_setup(client)
189
+ end
190
+
191
+ def start
192
+ @http.start unless @http.started?
124
193
  end
125
194
 
126
195
  def local
@@ -132,5 +201,3 @@ module Puppet::Network
132
201
  end
133
202
  end
134
203
  end
135
-
136
- # $Id: client.rb 2661 2007-07-08 23:57:56Z luke $
@@ -88,4 +88,3 @@ module Puppet::Network
88
88
  end
89
89
  end
90
90
 
91
- # $Id: processor.rb 2259 2007-03-06 19:03:05Z luke $
@@ -17,4 +17,3 @@ module Puppet::Network
17
17
  end
18
18
  end
19
19
 
20
- # $Id: server.rb 2259 2007-03-06 19:03:05Z luke $
@@ -118,4 +118,3 @@ module Puppet::Network::XMLRPC
118
118
  end
119
119
  end
120
120
 
121
- # $Id: webrick_servlet.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,165 @@
1
+ require 'puppet/indirector'
2
+
3
+ # A class for managing nodes, including their facts and environment.
4
+ class Puppet::Node
5
+ require 'puppet/node/facts'
6
+ require 'puppet/node/environment'
7
+
8
+ # Set up indirection, so that nodes can be looked for in
9
+ # the node sources.
10
+ extend Puppet::Indirector
11
+
12
+ # Use the node source as the indirection terminus.
13
+ indirects :node, :terminus_setting => :node_terminus, :doc => "Where to find node information.
14
+ A node is composed of its name, its facts, and its environment."
15
+
16
+ # Retrieve a node from the node source, with some additional munging
17
+ # thrown in for kicks.
18
+ def self.find_by_any_name(key)
19
+ return nil unless key
20
+
21
+ facts = node_facts(key)
22
+ node = nil
23
+ names = node_names(key, facts)
24
+ names.each do |name|
25
+ name = name.to_s if name.is_a?(Symbol)
26
+ break if node = find(name)
27
+ end
28
+
29
+ # If they made it this far, we haven't found anything, so look for a
30
+ # default node.
31
+ unless node or names.include?("default")
32
+ if node = find("default")
33
+ Puppet.notice "Using default node for %s" % key
34
+ end
35
+ end
36
+
37
+ if node
38
+ node.names = names
39
+
40
+ return node
41
+ else
42
+ return nil
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # Look up the node facts so we can generate the node names to use.
49
+ def self.node_facts(key)
50
+ if facts = Puppet::Node::Facts.find(key)
51
+ facts.values
52
+ else
53
+ {}
54
+ end
55
+ end
56
+
57
+ # Calculate the list of node names we should use for looking
58
+ # up our node.
59
+ def self.node_names(key, facts = nil)
60
+ facts ||= node_facts(key)
61
+ names = []
62
+
63
+ if hostname = facts["hostname"]
64
+ unless hostname == key
65
+ names << hostname
66
+ end
67
+ else
68
+ hostname = key
69
+ end
70
+
71
+ if fqdn = facts["fqdn"]
72
+ hostname = fqdn
73
+ names << fqdn
74
+ end
75
+
76
+ # Make sure both the fqdn and the short name of the
77
+ # host can be used in the manifest
78
+ if hostname =~ /\./
79
+ names << hostname.sub(/\..+/,'')
80
+ elsif domain = facts['domain']
81
+ names << hostname + "." + domain
82
+ end
83
+
84
+ # Sort the names inversely by name length.
85
+ names.sort! { |a,b| b.length <=> a.length }
86
+
87
+ # And make sure the key is first, since that's the most
88
+ # likely usage.
89
+ ([key] + names).uniq
90
+ end
91
+
92
+ public
93
+
94
+ attr_accessor :name, :classes, :parameters, :source, :ipaddress, :names
95
+ attr_reader :time
96
+
97
+ # Set the environment, making sure that it's valid.
98
+ def environment=(value)
99
+ raise(ArgumentError, "Invalid environment %s" % value) unless Puppet::Node::Environment.valid?(value)
100
+ @environment = value
101
+ end
102
+
103
+ # Do not return environments that are the empty string, and use
104
+ # explicitly set environments, then facts, then a central env
105
+ # value.
106
+ def environment
107
+ unless @environment
108
+ if env = parameters["environment"]
109
+ raise(ArgumentError, "Invalid environment %s from parameters" % env) unless Puppet::Node::Environment.valid?(env)
110
+ @environment = env
111
+ else
112
+ @environment = Puppet::Node::Environment.new.name.to_s
113
+ end
114
+ end
115
+ @environment
116
+ end
117
+
118
+ def initialize(name, options = {})
119
+ unless name
120
+ raise ArgumentError, "Node names cannot be nil"
121
+ end
122
+ @name = name
123
+
124
+ # Provide a default value.
125
+ if names = options[:names]
126
+ if names.is_a?(String)
127
+ @names = [names]
128
+ else
129
+ @names = names
130
+ end
131
+ else
132
+ @names = [name]
133
+ end
134
+
135
+ if classes = options[:classes]
136
+ if classes.is_a?(String)
137
+ @classes = [classes]
138
+ else
139
+ @classes = classes
140
+ end
141
+ else
142
+ @classes = []
143
+ end
144
+
145
+ @parameters = options[:parameters] || {}
146
+
147
+ self.environment = options[:environment] if options[:environment]
148
+
149
+ @time = Time.now
150
+ end
151
+
152
+ # Merge the node facts with parameters from the node source.
153
+ def fact_merge
154
+ if facts = Puppet::Node::Facts.find(name)
155
+ merge(facts.values)
156
+ end
157
+ end
158
+
159
+ # Merge any random parameters into our parameter list.
160
+ def merge(params)
161
+ params.each do |name, value|
162
+ @parameters[name] = value unless @parameters.include?(name)
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,480 @@
1
+ require 'puppet/indirector'
2
+ require 'puppet/external/gratr/digraph'
3
+
4
+ # This class models a node catalog. It is the thing
5
+ # meant to be passed from server to client, and it contains all
6
+ # of the information in the catalog, including the resources
7
+ # and the relationships between them.
8
+ class Puppet::Node::Catalog < Puppet::PGraph
9
+ extend Puppet::Indirector
10
+ indirects :catalog, :terminus_class => :compiler
11
+
12
+ # The host name this is a catalog for.
13
+ attr_accessor :name
14
+
15
+ # The catalog version. Used for testing whether a catalog
16
+ # is up to date.
17
+ attr_accessor :version
18
+
19
+ # How long this catalog took to retrieve. Used for reporting stats.
20
+ attr_accessor :retrieval_duration
21
+
22
+ # How we should extract the catalog for sending to the client.
23
+ attr_reader :extraction_format
24
+
25
+ # We need the ability to set this externally, so we can yaml-dump the
26
+ # catalog.
27
+ attr_accessor :edgelist_class
28
+
29
+ # Whether this is a host catalog, which behaves very differently.
30
+ # In particular, reports are sent, graphs are made, and state is
31
+ # stored in the state database. If this is set incorrectly, then you often
32
+ # end up in infinite loops, because catalogs are used to make things
33
+ # that the host catalog needs.
34
+ attr_accessor :host_config
35
+
36
+ # Whether this graph is another catalog's relationship graph.
37
+ # We don't want to accidentally create a relationship graph for another
38
+ # relationship graph.
39
+ attr_accessor :is_relationship_graph
40
+
41
+ # Whether this catalog was retrieved from the cache, which affects
42
+ # whether it is written back out again.
43
+ attr_accessor :from_cache
44
+
45
+ # Add classes to our class list.
46
+ def add_class(*classes)
47
+ classes.each do |klass|
48
+ @classes << klass
49
+ end
50
+
51
+ # Add the class names as tags, too.
52
+ tag(*classes)
53
+ end
54
+
55
+ # Add one or more resources to our graph and to our resource table.
56
+ def add_resource(*resources)
57
+ resources.each do |resource|
58
+ unless resource.respond_to?(:ref)
59
+ raise ArgumentError, "Can only add objects that respond to :ref"
60
+ end
61
+
62
+ ref = resource.ref
63
+ if @resource_table.include?(ref)
64
+ raise ArgumentError, "Resource %s is already defined" % ref
65
+ else
66
+ @resource_table[ref] = resource
67
+ end
68
+ resource.catalog = self unless is_relationship_graph
69
+ add_vertex!(resource)
70
+ end
71
+ end
72
+
73
+ # Create an alias for a resource.
74
+ def alias(resource, name)
75
+ resource.ref =~ /^(.+)\[/
76
+
77
+ newref = "%s[%s]" % [$1 || resource.class.name, name]
78
+ raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref]) if @resource_table[newref]
79
+ @resource_table[newref] = resource
80
+ @aliases[resource.ref] << newref
81
+ end
82
+
83
+ # Apply our catalog to the local host. Valid options
84
+ # are:
85
+ # :tags - set the tags that restrict what resources run
86
+ # during the transaction
87
+ # :ignoreschedules - tell the transaction to ignore schedules
88
+ # when determining the resources to run
89
+ def apply(options = {})
90
+ @applying = true
91
+
92
+ Puppet::Util::Storage.load if host_config?
93
+ transaction = Puppet::Transaction.new(self)
94
+
95
+ transaction.tags = options[:tags] if options[:tags]
96
+ transaction.ignoreschedules = true if options[:ignoreschedules]
97
+
98
+ transaction.addtimes :config_retrieval => @retrieval_duration
99
+
100
+
101
+ begin
102
+ transaction.evaluate
103
+ rescue Puppet::Error => detail
104
+ Puppet.err "Could not apply complete catalog: %s" % detail
105
+ rescue => detail
106
+ puts detail.backtrace if Puppet[:trace]
107
+ Puppet.err "Got an uncaught exception of type %s: %s" % [detail.class, detail]
108
+ ensure
109
+ # Don't try to store state unless we're a host config
110
+ # too recursive.
111
+ Puppet::Util::Storage.store if host_config?
112
+ end
113
+
114
+ yield transaction if block_given?
115
+
116
+ transaction.send_report if host_config and (Puppet[:report] or Puppet[:summarize])
117
+
118
+ return transaction
119
+ ensure
120
+ @applying = false
121
+ cleanup()
122
+ transaction.cleanup if defined? transaction and transaction
123
+ end
124
+
125
+ # Are we in the middle of applying the catalog?
126
+ def applying?
127
+ @applying
128
+ end
129
+
130
+ def clear(remove_resources = true)
131
+ super()
132
+ # We have to do this so that the resources clean themselves up.
133
+ @resource_table.values.each { |resource| resource.remove } if remove_resources
134
+ @resource_table.clear
135
+
136
+ if defined?(@relationship_graph) and @relationship_graph
137
+ @relationship_graph.clear(false)
138
+ @relationship_graph = nil
139
+ end
140
+ end
141
+
142
+ def classes
143
+ @classes.dup
144
+ end
145
+
146
+ # Create an implicit resource, meaning that it will lose out
147
+ # to any explicitly defined resources. This method often returns
148
+ # nil.
149
+ # The quirk of this method is that it's not possible to create
150
+ # an implicit resource before an explicit resource of the same name,
151
+ # because all explicit resources are created before any generate()
152
+ # methods are called on the individual resources. Thus, this
153
+ # method can safely just check if an explicit resource already exists
154
+ # and toss this implicit resource if so.
155
+ def create_implicit_resource(type, options)
156
+ unless options.include?(:implicit)
157
+ options[:implicit] = true
158
+ end
159
+
160
+ # This will return nil if an equivalent explicit resource already exists.
161
+ # When resource classes no longer retain references to resource instances,
162
+ # this will need to be modified to catch that conflict and discard
163
+ # implicit resources.
164
+ if resource = create_resource(type, options)
165
+ resource.implicit = true
166
+
167
+ return resource
168
+ else
169
+ return nil
170
+ end
171
+ end
172
+
173
+ # Create a new resource and register it in the catalog.
174
+ def create_resource(type, options)
175
+ unless klass = Puppet::Type.type(type)
176
+ raise ArgumentError, "Unknown resource type %s" % type
177
+ end
178
+ return unless resource = klass.create(options)
179
+
180
+ @transient_resources << resource if applying?
181
+ add_resource(resource)
182
+ if @relationship_graph
183
+ @relationship_graph.add_resource(resource) unless @relationship_graph.resource(resource.ref)
184
+ end
185
+ resource
186
+ end
187
+
188
+ # Make sure we support the requested extraction format.
189
+ def extraction_format=(value)
190
+ unless respond_to?("extract_to_%s" % value)
191
+ raise ArgumentError, "Invalid extraction format %s" % value
192
+ end
193
+ @extraction_format = value
194
+ end
195
+
196
+ # Turn our catalog graph into whatever the client is expecting.
197
+ def extract
198
+ send("extract_to_%s" % extraction_format)
199
+ end
200
+
201
+ # Create the traditional TransBuckets and TransObjects from our catalog
202
+ # graph. This will hopefully be deprecated soon.
203
+ def extract_to_transportable
204
+ top = nil
205
+ current = nil
206
+ buckets = {}
207
+
208
+ unless main = vertices.find { |res| res.type == "Class" and res.title == :main }
209
+ raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
210
+ end
211
+
212
+ # Create a proc for examining edges, which we'll use to build our tree
213
+ # of TransBuckets and TransObjects.
214
+ bucket = nil
215
+ edges = proc do |edge|
216
+ # The sources are always non-builtins.
217
+ source, target = edge.source, edge.target
218
+ unless tmp = buckets[source.to_s]
219
+ if tmp = buckets[source.to_s] = source.to_trans
220
+ bucket = tmp
221
+ else
222
+ # This is because virtual resources return nil. If a virtual
223
+ # container resource contains realized resources, we still need to get
224
+ # to them. So, we keep a reference to the last valid bucket
225
+ # we returned and use that if the container resource is virtual.
226
+ end
227
+ end
228
+ bucket = tmp || bucket
229
+ if child = target.to_trans
230
+ unless bucket
231
+ raise "No bucket created for %s" % source
232
+ end
233
+ bucket.push child
234
+
235
+ # It's important that we keep a reference to any TransBuckets we've created, so
236
+ # we don't create multiple buckets for children.
237
+ unless target.builtin?
238
+ buckets[target.to_s] = child
239
+ end
240
+ end
241
+ end
242
+ dfs(:start => main, :examine_edge => edges)
243
+
244
+ unless main
245
+ raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
246
+ end
247
+
248
+ # Retrieve the bucket for the top-level scope and set the appropriate metadata.
249
+ unless result = buckets[main.to_s]
250
+ # This only happens when the catalog is entirely empty.
251
+ result = buckets[main.to_s] = main.to_trans
252
+ end
253
+
254
+ result.classes = classes
255
+
256
+ # Clear the cache to encourage the GC
257
+ buckets.clear
258
+ return result
259
+ end
260
+
261
+ # Make sure all of our resources are "finished".
262
+ def finalize
263
+ @resource_table.values.each { |resource| resource.finish }
264
+
265
+ write_graph(:resources)
266
+ end
267
+
268
+ def host_config?
269
+ host_config || false
270
+ end
271
+
272
+ def initialize(name = nil)
273
+ super()
274
+ @name = name if name
275
+ @extraction_format ||= :transportable
276
+ @tags = []
277
+ @classes = []
278
+ @resource_table = {}
279
+ @transient_resources = []
280
+ @applying = false
281
+ @relationship_graph = nil
282
+
283
+ @aliases = Hash.new { |hash, key| hash[key] = [] }
284
+
285
+ if block_given?
286
+ yield(self)
287
+ finalize()
288
+ end
289
+ end
290
+
291
+ # Create a graph of all of the relationships in our catalog.
292
+ def relationship_graph
293
+ raise(Puppet::DevError, "Tried get a relationship graph for a relationship graph") if self.is_relationship_graph
294
+
295
+ unless defined? @relationship_graph and @relationship_graph
296
+ # It's important that we assign the graph immediately, because
297
+ # the debug messages below use the relationships in the
298
+ # relationship graph to determine the path to the resources
299
+ # spitting out the messages. If this is not set,
300
+ # then we get into an infinite loop.
301
+ @relationship_graph = Puppet::Node::Catalog.new
302
+ @relationship_graph.host_config = host_config?
303
+ @relationship_graph.is_relationship_graph = true
304
+
305
+ # First create the dependency graph
306
+ self.vertices.each do |vertex|
307
+ @relationship_graph.add_vertex! vertex
308
+ vertex.builddepends.each do |edge|
309
+ @relationship_graph.add_edge!(edge)
310
+ end
311
+ end
312
+
313
+ # Lastly, add in any autorequires
314
+ @relationship_graph.vertices.each do |vertex|
315
+ vertex.autorequire.each do |edge|
316
+ unless @relationship_graph.edge?(edge.source, edge.target) # don't let automatic relationships conflict with manual ones.
317
+ unless @relationship_graph.edge?(edge.target, edge.source)
318
+ vertex.debug "Autorequiring %s" % [edge.source]
319
+ @relationship_graph.add_edge!(edge)
320
+ else
321
+ vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
322
+ end
323
+ end
324
+ end
325
+ end
326
+
327
+ @relationship_graph.write_graph(:relationships)
328
+
329
+ # Then splice in the container information
330
+ @relationship_graph.splice!(self, Puppet::Type::Component)
331
+
332
+ @relationship_graph.write_graph(:expanded_relationships)
333
+ end
334
+ @relationship_graph
335
+ end
336
+
337
+ # Remove the resource from our catalog. Notice that we also call
338
+ # 'remove' on the resource, at least until resource classes no longer maintain
339
+ # references to the resource instances.
340
+ def remove_resource(*resources)
341
+ resources.each do |resource|
342
+ @resource_table.delete(resource.ref)
343
+ @aliases[resource.ref].each { |res_alias| @resource_table.delete(res_alias) }
344
+ @aliases[resource.ref].clear
345
+ remove_vertex!(resource) if vertex?(resource)
346
+ @relationship_graph.remove_vertex!(resource) if @relationship_graph and @relationship_graph.vertex?(resource)
347
+ resource.remove
348
+ end
349
+ end
350
+
351
+ # Look a resource up by its reference (e.g., File[/etc/passwd]).
352
+ def resource(type, title = nil)
353
+ # Always create a resource reference, so that it always canonizes how we
354
+ # are referring to them.
355
+ if title
356
+ ref = Puppet::ResourceReference.new(type, title).to_s
357
+ else
358
+ # If they didn't provide a title, then we expect the first
359
+ # argument to be of the form 'Class[name]', which our
360
+ # Reference class canonizes for us.
361
+ ref = Puppet::ResourceReference.new(nil, type).to_s
362
+ end
363
+ if resource = @resource_table[ref]
364
+ return resource
365
+ elsif defined?(@relationship_graph) and @relationship_graph
366
+ @relationship_graph.resource(ref)
367
+ end
368
+ end
369
+
370
+ # Add a tag.
371
+ def tag(*names)
372
+ names.each do |name|
373
+ name = name.to_s
374
+ @tags << name unless @tags.include?(name)
375
+ if name.include?("::")
376
+ name.split("::").each do |sub|
377
+ @tags << sub unless @tags.include?(sub)
378
+ end
379
+ end
380
+ end
381
+ nil
382
+ end
383
+
384
+ # Return the list of tags.
385
+ def tags
386
+ @tags.dup
387
+ end
388
+
389
+ # Convert our catalog into a RAL catalog.
390
+ def to_ral
391
+ to_catalog :to_type
392
+ end
393
+
394
+ # Turn our parser catalog into a transportable catalog.
395
+ def to_transportable
396
+ to_catalog :to_transobject
397
+ end
398
+
399
+ # Produce the graph files if requested.
400
+ def write_graph(name)
401
+ # We only want to graph the main host catalog.
402
+ return unless host_config?
403
+
404
+ return unless Puppet[:graph]
405
+
406
+ Puppet.settings.use(:graphing)
407
+
408
+ file = File.join(Puppet[:graphdir], "%s.dot" % name.to_s)
409
+ File.open(file, "w") { |f|
410
+ f.puts to_dot("name" => name.to_s.capitalize)
411
+ }
412
+ end
413
+
414
+ # LAK:NOTE We cannot yaml-dump the class in the edgelist_class, because classes cannot be
415
+ # dumped by default, nor does yaml-dumping # the edge-labels work at this point (I don't
416
+ # know why).
417
+ # Neither of these matters right now, but I suppose it could at some point.
418
+ # We also have to have the vertex_dict dumped after the resource table, because yaml can't
419
+ # seem to handle the output of yaml-dumping the vertex_dict.
420
+ def to_yaml_properties
421
+ props = instance_variables.reject { |v| %w{@edgelist_class @edge_labels @vertex_dict}.include?(v) }
422
+ props << "@vertex_dict"
423
+ props
424
+ end
425
+
426
+ private
427
+
428
+ def cleanup
429
+ unless @transient_resources.empty?
430
+ remove_resource(*@transient_resources)
431
+ @transient_resources.clear
432
+ @relationship_graph = nil
433
+ end
434
+ end
435
+
436
+ # An abstracted method for converting one catalog into another type of catalog.
437
+ # This pretty much just converts all of the resources from one class to another, using
438
+ # a conversion method.
439
+ def to_catalog(convert)
440
+ result = self.class.new(self.name)
441
+
442
+ map = {}
443
+ vertices.each do |resource|
444
+ next if resource.respond_to?(:virtual?) and resource.virtual?
445
+
446
+ newres = resource.send(convert)
447
+
448
+ # We can't guarantee that resources don't munge their names
449
+ # (like files do with trailing slashes), so we have to keep track
450
+ # of what a resource got converted to.
451
+ map[resource.ref] = newres
452
+
453
+ result.add_resource newres
454
+ end
455
+
456
+ message = convert.to_s.gsub "_", " "
457
+ edges.each do |edge|
458
+ # Skip edges between virtual resources.
459
+ next if edge.source.respond_to?(:virtual?) and edge.source.virtual?
460
+ next if edge.target.respond_to?(:virtual?) and edge.target.virtual?
461
+
462
+ unless source = map[edge.source.ref]
463
+ raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.source.ref, message]
464
+ end
465
+
466
+ unless target = map[edge.target.ref]
467
+ raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.target.ref, message]
468
+ end
469
+
470
+ result.add_edge!(source, target, edge.label)
471
+ end
472
+
473
+ map.clear
474
+
475
+ result.add_class *self.classes
476
+ result.tag(*self.tags)
477
+
478
+ return result
479
+ end
480
+ end