puppet 2.6.18 → 2.7.1

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 (1050) hide show
  1. data/CHANGELOG +733 -187
  2. data/LICENSE +13 -13
  3. data/README.md +5 -9
  4. data/Rakefile +1 -1
  5. data/conf/auth.conf +8 -3
  6. data/conf/redhat/puppet.spec +21 -110
  7. data/conf/solaris/pkginfo +3 -4
  8. data/conf/suse/puppet.spec +1 -1
  9. data/ext/cert_inspector +140 -0
  10. data/ext/nagios/naggen +12 -5
  11. data/ext/puppet-test +11 -5
  12. data/ext/vim/README +1 -2
  13. data/ext/yaml_nodes.rb +11 -5
  14. data/install.rb +1 -54
  15. data/lib/puppet.rb +6 -10
  16. data/lib/puppet/application.rb +23 -32
  17. data/lib/puppet/application/agent.rb +228 -7
  18. data/lib/puppet/application/apply.rb +108 -36
  19. data/lib/puppet/application/catalog.rb +4 -0
  20. data/lib/puppet/application/cert.rb +128 -17
  21. data/lib/puppet/application/certificate.rb +18 -0
  22. data/lib/puppet/application/certificate_request.rb +4 -0
  23. data/lib/puppet/application/certificate_revocation_list.rb +4 -0
  24. data/lib/puppet/application/config.rb +4 -0
  25. data/lib/puppet/application/describe.rb +53 -0
  26. data/lib/puppet/application/device.rb +255 -0
  27. data/lib/puppet/application/doc.rb +92 -6
  28. data/lib/puppet/application/face_base.rb +246 -0
  29. data/lib/puppet/application/facts.rb +4 -0
  30. data/lib/puppet/application/file.rb +4 -0
  31. data/lib/puppet/application/filebucket.rb +102 -0
  32. data/lib/puppet/application/help.rb +4 -0
  33. data/lib/puppet/application/indirection_base.rb +4 -0
  34. data/lib/puppet/application/inspect.rb +21 -23
  35. data/lib/puppet/application/key.rb +4 -0
  36. data/lib/puppet/application/kick.rb +131 -4
  37. data/lib/puppet/application/man.rb +4 -0
  38. data/lib/puppet/application/master.rb +108 -40
  39. data/lib/puppet/application/node.rb +4 -0
  40. data/lib/puppet/application/parser.rb +5 -0
  41. data/lib/puppet/application/plugin.rb +3 -0
  42. data/lib/puppet/application/queue.rb +75 -13
  43. data/lib/puppet/application/report.rb +4 -0
  44. data/lib/puppet/application/resource.rb +115 -23
  45. data/lib/puppet/application/resource_type.rb +4 -0
  46. data/lib/puppet/application/secret_agent.rb +6 -0
  47. data/lib/puppet/application/status.rb +4 -0
  48. data/lib/puppet/configurer.rb +57 -61
  49. data/lib/puppet/configurer/fact_handler.rb +1 -6
  50. data/lib/puppet/daemon.rb +2 -2
  51. data/lib/puppet/defaults.rb +30 -88
  52. data/lib/puppet/dsl/resource_type_api.rb +19 -31
  53. data/lib/puppet/external/nagios/parser.rb +1 -1
  54. data/lib/puppet/face.rb +12 -0
  55. data/lib/puppet/face/catalog.rb +130 -0
  56. data/lib/puppet/face/catalog/select.rb +49 -0
  57. data/lib/puppet/face/certificate.rb +115 -0
  58. data/lib/puppet/face/certificate_request.rb +55 -0
  59. data/lib/puppet/face/certificate_revocation_list.rb +60 -0
  60. data/lib/puppet/face/config.rb +45 -0
  61. data/lib/puppet/face/facts.rb +81 -0
  62. data/lib/puppet/face/file.rb +47 -0
  63. data/lib/puppet/face/file/download.rb +54 -0
  64. data/lib/puppet/face/file/store.rb +21 -0
  65. data/lib/puppet/face/help.rb +131 -0
  66. data/lib/puppet/face/help/action.erb +53 -0
  67. data/lib/puppet/face/help/face.erb +79 -0
  68. data/lib/puppet/face/help/global.erb +19 -0
  69. data/lib/puppet/face/help/man.erb +136 -0
  70. data/lib/puppet/face/key.rb +15 -0
  71. data/lib/puppet/face/man.rb +93 -0
  72. data/lib/puppet/face/node.rb +43 -0
  73. data/lib/puppet/face/parser.rb +42 -0
  74. data/lib/puppet/face/plugin.rb +55 -0
  75. data/lib/puppet/face/report.rb +56 -0
  76. data/lib/puppet/face/resource.rb +53 -0
  77. data/lib/puppet/face/resource_type.rb +81 -0
  78. data/lib/puppet/face/secret_agent.rb +54 -0
  79. data/lib/puppet/face/status.rb +52 -0
  80. data/lib/puppet/feature/ssh.rb +4 -0
  81. data/lib/puppet/file_bucket/dipper.rb +3 -3
  82. data/lib/puppet/file_bucket/file.rb +6 -5
  83. data/lib/puppet/file_bucket/file/indirection_hooks.rb +9 -0
  84. data/lib/puppet/file_serving/configuration.rb +1 -2
  85. data/lib/puppet/file_serving/content.rb +2 -1
  86. data/lib/puppet/file_serving/{terminus_selector.rb → indirection_hooks.rb} +3 -2
  87. data/lib/puppet/file_serving/metadata.rb +2 -1
  88. data/lib/puppet/file_serving/mount/modules.rb +5 -4
  89. data/lib/puppet/indirector.rb +16 -43
  90. data/lib/puppet/indirector/catalog/active_record.rb +1 -1
  91. data/lib/puppet/indirector/catalog/compiler.rb +5 -15
  92. data/lib/puppet/indirector/catalog/static_compiler.rb +137 -0
  93. data/lib/puppet/indirector/certificate_request/ca.rb +8 -0
  94. data/lib/puppet/indirector/certificate_status.rb +4 -0
  95. data/lib/puppet/indirector/certificate_status/file.rb +82 -0
  96. data/lib/puppet/indirector/certificate_status/rest.rb +10 -0
  97. data/lib/puppet/indirector/couch.rb +5 -3
  98. data/lib/puppet/indirector/exec.rb +3 -3
  99. data/lib/puppet/indirector/face.rb +127 -0
  100. data/lib/puppet/indirector/facts/network_device.rb +25 -0
  101. data/lib/puppet/indirector/file.rb +79 -0
  102. data/lib/puppet/indirector/file_bucket_file/file.rb +0 -4
  103. data/lib/puppet/indirector/indirection.rb +1 -2
  104. data/lib/puppet/indirector/inventory/yaml.rb +81 -0
  105. data/lib/puppet/indirector/report/processor.rb +0 -2
  106. data/lib/puppet/indirector/request.rb +0 -4
  107. data/lib/puppet/indirector/resource/ral.rb +0 -4
  108. data/lib/puppet/indirector/resource_type/parser.rb +19 -3
  109. data/lib/puppet/indirector/rest.rb +11 -5
  110. data/lib/puppet/indirector/run/local.rb +0 -4
  111. data/lib/puppet/indirector/ssl_file.rb +1 -5
  112. data/lib/puppet/indirector/terminus.rb +3 -26
  113. data/lib/puppet/indirector/yaml.rb +0 -5
  114. data/lib/puppet/interface.rb +156 -0
  115. data/lib/puppet/interface/action.rb +284 -0
  116. data/lib/puppet/interface/action_builder.rb +74 -0
  117. data/lib/puppet/interface/action_manager.rb +70 -0
  118. data/lib/puppet/interface/documentation.rb +230 -0
  119. data/lib/puppet/interface/face_collection.rb +137 -0
  120. data/lib/puppet/interface/option.rb +108 -0
  121. data/lib/puppet/interface/option_builder.rb +54 -0
  122. data/lib/puppet/interface/option_manager.rb +67 -0
  123. data/lib/puppet/metatype/manager.rb +20 -7
  124. data/lib/puppet/module.rb +1 -1
  125. data/lib/puppet/network/client.rb +179 -0
  126. data/lib/puppet/network/client/ca.rb +56 -0
  127. data/lib/puppet/network/client/file.rb +6 -0
  128. data/lib/puppet/network/client/proxy.rb +27 -0
  129. data/lib/puppet/network/client/report.rb +26 -0
  130. data/lib/puppet/network/client/runner.rb +10 -0
  131. data/lib/puppet/network/client/status.rb +4 -0
  132. data/lib/puppet/network/format.rb +1 -1
  133. data/lib/puppet/network/formats.rb +63 -0
  134. data/lib/puppet/network/handler/ca.rb +106 -16
  135. data/lib/puppet/network/handler/filebucket.rb +2 -4
  136. data/lib/puppet/network/handler/fileserver.rb +3 -2
  137. data/lib/puppet/network/handler/master.rb +5 -3
  138. data/lib/puppet/network/handler/report.rb +0 -2
  139. data/lib/puppet/network/handler/runner.rb +0 -2
  140. data/lib/puppet/network/handler/status.rb +0 -2
  141. data/lib/puppet/network/http/api/v1.rb +11 -3
  142. data/lib/puppet/network/http/handler.rb +26 -35
  143. data/lib/puppet/network/http/rack/rest.rb +2 -7
  144. data/lib/puppet/network/http/webrick.rb +1 -2
  145. data/lib/puppet/network/http_pool.rb +8 -17
  146. data/lib/puppet/network/http_server/mongrel.rb +1 -0
  147. data/lib/puppet/network/http_server/webrick.rb +155 -0
  148. data/lib/puppet/network/rest_authconfig.rb +4 -3
  149. data/lib/puppet/network/rest_authorization.rb +2 -2
  150. data/lib/puppet/network/rights.rb +4 -9
  151. data/lib/puppet/network/server.rb +1 -1
  152. data/lib/puppet/network/xmlrpc/client.rb +211 -0
  153. data/lib/puppet/node.rb +2 -1
  154. data/lib/puppet/node/environment.rb +30 -3
  155. data/lib/puppet/node/facts.rb +15 -15
  156. data/lib/puppet/node/inventory.rb +7 -0
  157. data/lib/puppet/parser/ast.rb +6 -2
  158. data/lib/puppet/parser/ast/astarray.rb +12 -23
  159. data/lib/puppet/parser/ast/caseopt.rb +12 -24
  160. data/lib/puppet/parser/ast/definition.rb +17 -0
  161. data/lib/puppet/parser/ast/hostclass.rb +29 -0
  162. data/lib/puppet/parser/ast/leaf.rb +2 -2
  163. data/lib/puppet/parser/ast/node.rb +20 -0
  164. data/lib/puppet/parser/ast/resource.rb +42 -50
  165. data/lib/puppet/parser/ast/resource_instance.rb +9 -0
  166. data/lib/puppet/parser/ast/resource_override.rb +2 -3
  167. data/lib/puppet/parser/ast/resource_reference.rb +1 -1
  168. data/lib/puppet/parser/ast/top_level_construct.rb +4 -0
  169. data/lib/puppet/parser/ast/vardef.rb +1 -1
  170. data/lib/puppet/parser/compiler.rb +16 -17
  171. data/lib/puppet/parser/functions/create_resources.rb +47 -0
  172. data/lib/puppet/parser/functions/extlookup.rb +2 -7
  173. data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
  174. data/lib/puppet/parser/functions/sha1.rb +1 -1
  175. data/lib/puppet/parser/grammar.ra +67 -144
  176. data/lib/puppet/parser/lexer.rb +1 -1
  177. data/lib/puppet/parser/parser.rb +1190 -1262
  178. data/lib/puppet/parser/parser_support.rb +48 -73
  179. data/lib/puppet/parser/resource.rb +2 -19
  180. data/lib/puppet/parser/scope.rb +33 -103
  181. data/lib/puppet/parser/templatewrapper.rb +21 -22
  182. data/lib/puppet/parser/type_loader.rb +60 -35
  183. data/lib/puppet/provider/aixobject.rb +393 -0
  184. data/lib/puppet/provider/augeas/augeas.rb +37 -15
  185. data/lib/puppet/provider/cisco.rb +9 -0
  186. data/lib/puppet/provider/cron/crontab.rb +1 -7
  187. data/lib/puppet/provider/exec/posix.rb +3 -6
  188. data/lib/puppet/provider/exec/shell.rb +2 -11
  189. data/lib/puppet/provider/file/posix.rb +1 -1
  190. data/lib/puppet/provider/file/win32.rb +1 -1
  191. data/lib/puppet/provider/group/aix.rb +141 -0
  192. data/lib/puppet/provider/group/directoryservice.rb +0 -14
  193. data/lib/puppet/provider/host/parsed.rb +23 -55
  194. data/lib/puppet/provider/interface/base.rb +0 -0
  195. data/lib/puppet/provider/interface/cisco.rb +27 -0
  196. data/lib/puppet/provider/mcx/mcxcontent.rb +57 -96
  197. data/lib/puppet/provider/mount/parsed.rb +1 -1
  198. data/lib/puppet/provider/naginator.rb +1 -9
  199. data/lib/puppet/provider/nameservice/directoryservice.rb +41 -26
  200. data/lib/puppet/provider/network_device.rb +68 -0
  201. data/lib/puppet/provider/package/appdmg.rb +13 -13
  202. data/lib/puppet/provider/package/aptitude.rb +0 -1
  203. data/lib/puppet/provider/package/pip.rb +109 -0
  204. data/lib/puppet/provider/package/pkgdmg.rb +24 -32
  205. data/lib/puppet/provider/package/pkgutil.rb +175 -0
  206. data/lib/puppet/provider/package/yum.rb +8 -1
  207. data/lib/puppet/provider/service/daemontools.rb +1 -1
  208. data/lib/puppet/provider/service/launchd.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +3 -3
  210. data/lib/puppet/provider/service/upstart.rb +73 -0
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +9 -10
  212. data/lib/puppet/provider/user/aix.rb +353 -0
  213. data/lib/puppet/provider/user/directoryservice.rb +0 -14
  214. data/lib/puppet/provider/user/user_role_add.rb +17 -32
  215. data/lib/puppet/provider/vlan/cisco.rb +28 -0
  216. data/lib/puppet/provider/zfs/solaris.rb +1 -1
  217. data/lib/puppet/provider/zone/solaris.rb +3 -0
  218. data/lib/puppet/provider/zpool/solaris.rb +7 -5
  219. data/lib/puppet/rails.rb +1 -1
  220. data/lib/puppet/rails/benchmark.rb +1 -1
  221. data/lib/puppet/rails/fact_name.rb +1 -0
  222. data/lib/puppet/rails/host.rb +0 -7
  223. data/lib/puppet/reference/configuration.rb +26 -101
  224. data/lib/puppet/reports/store.rb +3 -7
  225. data/lib/puppet/resource.rb +1 -1
  226. data/lib/puppet/resource/catalog.rb +86 -36
  227. data/lib/puppet/resource/type.rb +10 -15
  228. data/lib/puppet/resource/type_collection.rb +55 -63
  229. data/lib/puppet/simple_graph.rb +370 -269
  230. data/lib/puppet/ssl/base.rb +0 -8
  231. data/lib/puppet/ssl/certificate.rb +0 -6
  232. data/lib/puppet/ssl/certificate_authority.rb +24 -109
  233. data/lib/puppet/ssl/certificate_authority/interface.rb +19 -66
  234. data/lib/puppet/ssl/certificate_factory.rb +91 -112
  235. data/lib/puppet/ssl/certificate_request.rb +15 -98
  236. data/lib/puppet/ssl/certificate_revocation_list.rb +1 -1
  237. data/lib/puppet/ssl/host.rb +85 -51
  238. data/lib/puppet/ssl/inventory.rb +1 -1
  239. data/lib/puppet/sslcertificates.rb +146 -0
  240. data/lib/puppet/sslcertificates/ca.rb +375 -0
  241. data/lib/puppet/sslcertificates/certificate.rb +255 -0
  242. data/lib/puppet/sslcertificates/inventory.rb +38 -0
  243. data/lib/puppet/sslcertificates/support.rb +146 -0
  244. data/lib/puppet/status.rb +1 -1
  245. data/lib/puppet/transaction.rb +163 -94
  246. data/lib/puppet/transaction/event.rb +1 -1
  247. data/lib/puppet/transaction/event_manager.rb +19 -3
  248. data/lib/puppet/transaction/report.rb +9 -3
  249. data/lib/puppet/type.rb +107 -62
  250. data/lib/puppet/type/augeas.rb +10 -14
  251. data/lib/puppet/type/cron.rb +13 -14
  252. data/lib/puppet/type/exec.rb +0 -9
  253. data/lib/puppet/type/file.rb +20 -29
  254. data/lib/puppet/type/file/ctime.rb +1 -1
  255. data/lib/puppet/type/file/ensure.rb +1 -1
  256. data/lib/puppet/type/file/group.rb +1 -1
  257. data/lib/puppet/type/file/mode.rb +1 -1
  258. data/lib/puppet/type/file/mtime.rb +1 -1
  259. data/lib/puppet/type/file/selcontext.rb +1 -1
  260. data/lib/puppet/type/file/source.rb +3 -3
  261. data/lib/puppet/type/file/type.rb +1 -1
  262. data/lib/puppet/type/group.rb +36 -0
  263. data/lib/puppet/type/host.rb +18 -43
  264. data/lib/puppet/type/interface.rb +109 -0
  265. data/lib/puppet/type/k5login.rb +1 -4
  266. data/lib/puppet/type/macauthorization.rb +3 -3
  267. data/lib/puppet/type/mcx.rb +2 -21
  268. data/lib/puppet/type/router.rb +14 -0
  269. data/lib/puppet/type/schedule.rb +2 -0
  270. data/lib/puppet/type/service.rb +2 -0
  271. data/lib/puppet/type/sshkey.rb +6 -1
  272. data/lib/puppet/type/tidy.rb +12 -12
  273. data/lib/puppet/type/user.rb +36 -9
  274. data/lib/puppet/type/vlan.rb +26 -0
  275. data/lib/puppet/type/whit.rb +13 -1
  276. data/lib/puppet/type/zfs.rb +100 -8
  277. data/lib/puppet/type/zone.rb +45 -1
  278. data/lib/puppet/type/zpool.rb +1 -0
  279. data/lib/puppet/util.rb +63 -91
  280. data/lib/puppet/util/autoload.rb +16 -14
  281. data/lib/puppet/util/classgen.rb +13 -1
  282. data/lib/puppet/util/command_line.rb +109 -22
  283. data/lib/puppet/util/log.rb +1 -0
  284. data/lib/puppet/util/log/destinations.rb +16 -4
  285. data/lib/puppet/util/logging.rb +11 -0
  286. data/lib/puppet/util/monkey_patches.rb +7 -77
  287. data/lib/puppet/util/network_device.rb +17 -0
  288. data/lib/puppet/util/network_device/base.rb +27 -0
  289. data/lib/puppet/util/network_device/cisco.rb +4 -0
  290. data/lib/puppet/util/network_device/cisco/device.rb +256 -0
  291. data/lib/puppet/util/network_device/cisco/facts.rb +72 -0
  292. data/lib/puppet/util/network_device/cisco/interface.rb +82 -0
  293. data/lib/puppet/util/network_device/config.rb +93 -0
  294. data/lib/puppet/util/network_device/ipcalc.rb +68 -0
  295. data/lib/puppet/util/network_device/transport.rb +3 -0
  296. data/lib/puppet/util/network_device/transport/base.rb +26 -0
  297. data/lib/puppet/util/network_device/transport/ssh.rb +121 -0
  298. data/lib/puppet/util/network_device/transport/telnet.rb +42 -0
  299. data/lib/puppet/util/rdoc.rb +4 -10
  300. data/lib/puppet/util/rdoc/parser.rb +34 -23
  301. data/lib/puppet/util/reference.rb +7 -8
  302. data/lib/puppet/util/selinux.rb +2 -2
  303. data/lib/puppet/util/settings.rb +1 -6
  304. data/lib/puppet/util/settings/file_setting.rb +0 -1
  305. data/lib/puppet/util/suidmanager.rb +30 -79
  306. data/lib/puppet/util/zaml.rb +41 -40
  307. data/man/man5/puppet.conf.5 +291 -873
  308. data/man/man8/filebucket.8 +47 -71
  309. data/man/man8/pi.8 +44 -10
  310. data/man/man8/puppet-agent.8 +154 -0
  311. data/man/man8/puppet-apply.8 +75 -0
  312. data/man/man8/puppet-catalog.8 +286 -0
  313. data/man/man8/puppet-cert.8 +97 -0
  314. data/man/man8/puppet-certificate.8 +229 -0
  315. data/man/man8/puppet-certificate_request.8 +168 -0
  316. data/man/man8/puppet-certificate_revocation_list.8 +165 -0
  317. data/man/man8/puppet-config.8 +80 -0
  318. data/man/man8/puppet-describe.8 +51 -0
  319. data/man/man8/puppet-device.8 +86 -0
  320. data/man/man8/puppet-doc.8 +101 -0
  321. data/man/man8/puppet-facts.8 +217 -0
  322. data/man/man8/puppet-file.8 +225 -0
  323. data/man/man8/puppet-filebucket.8 +81 -0
  324. data/man/man8/puppet-help.8 +71 -0
  325. data/man/man8/puppet-inspect.8 +28 -0
  326. data/man/man8/puppet-key.8 +126 -0
  327. data/man/man8/puppet-kick.8 +95 -0
  328. data/man/man8/puppet-man.8 +74 -0
  329. data/man/man8/puppet-master.8 +74 -0
  330. data/man/man8/puppet-node.8 +171 -0
  331. data/man/man8/puppet-parser.8 +71 -0
  332. data/man/man8/puppet-plugin.8 +77 -0
  333. data/man/man8/puppet-queue.8 +55 -0
  334. data/man/man8/puppet-report.8 +187 -0
  335. data/man/man8/puppet-resource.8 +84 -0
  336. data/man/man8/puppet-resource_type.8 +214 -0
  337. data/man/man8/puppet-secret_agent.8 +74 -0
  338. data/man/man8/puppet-status.8 +150 -0
  339. data/man/man8/puppet.8 +2 -2
  340. data/man/man8/puppetca.8 +64 -136
  341. data/man/man8/puppetd.8 +99 -228
  342. data/man/man8/puppetdoc.8 +41 -48
  343. data/man/man8/puppetmasterd.8 +54 -32
  344. data/man/man8/puppetqd.8 +45 -10
  345. data/man/man8/puppetrun.8 +56 -134
  346. data/man/man8/ralsh.8 +48 -49
  347. data/spec/fixtures/faulty_face/puppet/face/syntax.rb +8 -0
  348. data/spec/fixtures/integration/provider/mailalias/aliases/test1 +28 -0
  349. data/spec/fixtures/unit/parser/lexer/aliastest.pp +16 -0
  350. data/spec/fixtures/unit/parser/lexer/append.pp +11 -0
  351. data/spec/fixtures/unit/parser/lexer/argumentdefaults.pp +14 -0
  352. data/spec/fixtures/unit/parser/lexer/arithmetic_expression.pp +8 -0
  353. data/spec/fixtures/unit/parser/lexer/arraytrailingcomma.pp +3 -0
  354. data/spec/fixtures/unit/parser/lexer/casestatement.pp +65 -0
  355. data/spec/fixtures/unit/parser/lexer/classheirarchy.pp +15 -0
  356. data/spec/fixtures/unit/parser/lexer/classincludes.pp +17 -0
  357. data/spec/fixtures/unit/parser/lexer/classpathtest.pp +11 -0
  358. data/spec/fixtures/unit/parser/lexer/collection.pp +10 -0
  359. data/spec/fixtures/unit/parser/lexer/collection_override.pp +8 -0
  360. data/spec/fixtures/unit/parser/lexer/collection_within_virtual_definitions.pp +20 -0
  361. data/spec/fixtures/unit/parser/lexer/componentmetaparams.pp +11 -0
  362. data/spec/fixtures/unit/parser/lexer/componentrequire.pp +8 -0
  363. data/spec/fixtures/unit/parser/lexer/deepclassheirarchy.pp +23 -0
  364. data/spec/fixtures/unit/parser/lexer/defineoverrides.pp +17 -0
  365. data/spec/fixtures/unit/parser/lexer/emptyclass.pp +9 -0
  366. data/spec/fixtures/unit/parser/lexer/emptyexec.pp +3 -0
  367. data/spec/fixtures/unit/parser/lexer/emptyifelse.pp +9 -0
  368. data/spec/fixtures/unit/parser/lexer/falsevalues.pp +3 -0
  369. data/spec/fixtures/unit/parser/lexer/filecreate.pp +11 -0
  370. data/spec/fixtures/unit/parser/lexer/fqdefinition.pp +5 -0
  371. data/spec/fixtures/unit/parser/lexer/fqparents.pp +11 -0
  372. data/spec/fixtures/unit/parser/lexer/funccomma.pp +5 -0
  373. data/spec/fixtures/unit/parser/lexer/hash.pp +33 -0
  374. data/spec/fixtures/unit/parser/lexer/ifexpression.pp +12 -0
  375. data/spec/fixtures/unit/parser/lexer/implicititeration.pp +15 -0
  376. data/spec/fixtures/unit/parser/lexer/multilinecomments.pp +10 -0
  377. data/spec/fixtures/unit/parser/lexer/multipleclass.pp +9 -0
  378. data/spec/fixtures/unit/parser/lexer/multipleinstances.pp +7 -0
  379. data/spec/fixtures/unit/parser/lexer/multisubs.pp +13 -0
  380. data/spec/fixtures/unit/parser/lexer/namevartest.pp +9 -0
  381. data/spec/fixtures/unit/parser/lexer/scopetest.pp +13 -0
  382. data/spec/fixtures/unit/parser/lexer/selectorvalues.pp +49 -0
  383. data/spec/fixtures/unit/parser/lexer/simpledefaults.pp +5 -0
  384. data/spec/fixtures/unit/parser/lexer/simpleselector.pp +38 -0
  385. data/spec/fixtures/unit/parser/lexer/singleary.pp +19 -0
  386. data/spec/fixtures/unit/parser/lexer/singlequote.pp +11 -0
  387. data/spec/fixtures/unit/parser/lexer/singleselector.pp +22 -0
  388. data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +11 -0
  389. data/spec/fixtures/unit/parser/lexer/tag.pp +9 -0
  390. data/spec/fixtures/unit/parser/lexer/tagged.pp +35 -0
  391. data/spec/fixtures/unit/parser/lexer/virtualresources.pp +14 -0
  392. data/spec/fixtures/unit/provider/host/parsed/valid_hosts +19 -0
  393. data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +144 -0
  394. data/spec/fixtures/unit/provider/mount/parsed/aix.mount +7 -0
  395. data/spec/fixtures/unit/provider/mount/parsed/darwin.mount +6 -0
  396. data/spec/fixtures/unit/provider/mount/parsed/freebsd.fstab +8 -0
  397. data/spec/fixtures/unit/provider/mount/parsed/freebsd.mount +3 -0
  398. data/spec/fixtures/unit/provider/mount/parsed/hpux.mount +17 -0
  399. data/spec/fixtures/unit/provider/mount/parsed/linux.fstab +11 -0
  400. data/spec/fixtures/unit/provider/mount/parsed/linux.mount +5 -0
  401. data/spec/fixtures/unit/provider/mount/parsed/netbsd.fstab +9 -0
  402. data/spec/fixtures/unit/provider/mount/parsed/netbsd.mount +8 -0
  403. data/spec/fixtures/unit/provider/mount/parsed/openbsd.fstab +4 -0
  404. data/spec/fixtures/unit/provider/mount/parsed/openbsd.mount +4 -0
  405. data/spec/fixtures/unit/provider/mount/parsed/solaris.fstab +11 -0
  406. data/spec/fixtures/unit/provider/mount/parsed/solaris.mount +6 -0
  407. data/spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys +7 -0
  408. data/spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys1 +3 -0
  409. data/spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys2 +1 -0
  410. data/spec/fixtures/unit/reports/tagmail/tagmail_failers.conf +3 -0
  411. data/spec/fixtures/unit/reports/tagmail/tagmail_passers.conf +30 -0
  412. data/spec/fixtures/unit/util/rdoc/basic.pp +16 -0
  413. data/spec/integration/application/apply_spec.rb +2 -5
  414. data/spec/integration/application/doc_spec.rb +5 -6
  415. data/spec/integration/configurer_spec.rb +10 -6
  416. data/spec/integration/defaults_spec.rb +18 -52
  417. data/spec/integration/faces/documentation_spec.rb +55 -0
  418. data/spec/integration/file_serving/content_spec.rb +10 -3
  419. data/spec/integration/file_serving/fileset_spec.rb +2 -3
  420. data/spec/integration/file_serving/metadata_spec.rb +10 -3
  421. data/spec/integration/file_serving/terminus_helper_spec.rb +2 -3
  422. data/spec/integration/indirector/catalog/compiler_spec.rb +7 -12
  423. data/spec/integration/indirector/catalog/queue_spec.rb +3 -4
  424. data/spec/integration/indirector/direct_file_server_spec.rb +2 -2
  425. data/spec/integration/indirector/file_content/file_server_spec.rb +7 -7
  426. data/spec/integration/indirector/file_metadata/file_server_spec.rb +2 -2
  427. data/spec/integration/indirector/node/ldap_spec.rb +3 -4
  428. data/spec/integration/network/client_spec.rb +18 -0
  429. data/spec/integration/network/formats_spec.rb +3 -4
  430. data/spec/integration/network/handler_spec.rb +3 -4
  431. data/spec/integration/network/server/mongrel_spec.rb +3 -4
  432. data/spec/integration/network/server/webrick_spec.rb +4 -4
  433. data/spec/integration/node/environment_spec.rb +2 -3
  434. data/spec/integration/node/facts_spec.rb +6 -6
  435. data/spec/integration/node_spec.rb +16 -16
  436. data/spec/integration/parser/collector_spec.rb +3 -4
  437. data/spec/integration/parser/compiler_spec.rb +43 -3
  438. data/spec/integration/parser/functions/require_spec.rb +2 -3
  439. data/spec/integration/parser/functions_spec.rb +3 -4
  440. data/spec/integration/parser/parser_spec.rb +7 -6
  441. data/spec/integration/parser/ruby_manifest_spec.rb +2 -3
  442. data/spec/integration/provider/mailalias/aliases_spec.rb +5 -19
  443. data/spec/integration/provider/mount_spec.rb +2 -2
  444. data/spec/integration/provider/package_spec.rb +3 -4
  445. data/spec/integration/provider/service/init_spec.rb +4 -6
  446. data/spec/integration/reference/providers_spec.rb +2 -3
  447. data/spec/integration/reports_spec.rb +2 -2
  448. data/spec/integration/resource/catalog_spec.rb +6 -7
  449. data/spec/integration/resource/type_collection_spec.rb +2 -3
  450. data/spec/integration/ssl/certificate_authority_spec.rb +7 -7
  451. data/spec/integration/ssl/certificate_request_spec.rb +7 -7
  452. data/spec/integration/ssl/certificate_revocation_list_spec.rb +2 -2
  453. data/spec/integration/ssl/host_spec.rb +4 -4
  454. data/spec/integration/transaction/report_spec.rb +3 -3
  455. data/spec/integration/transaction_spec.rb +61 -6
  456. data/spec/integration/type/file_spec.rb +10 -8
  457. data/spec/integration/type/package_spec.rb +2 -3
  458. data/spec/integration/type/tidy_spec.rb +2 -3
  459. data/spec/integration/type_spec.rb +2 -14
  460. data/spec/integration/util/autoload_spec.rb +2 -3
  461. data/spec/integration/util/feature_spec.rb +2 -3
  462. data/spec/integration/util/file_locking_spec.rb +3 -4
  463. data/spec/integration/util/rdoc/parser_spec.rb +3 -4
  464. data/spec/integration/util/settings_spec.rb +2 -3
  465. data/spec/lib/matchers/json.rb +111 -0
  466. data/spec/lib/puppet/face/basetest.rb +46 -0
  467. data/spec/lib/puppet/face/huzzah.rb +7 -0
  468. data/spec/lib/puppet/face/version_matching.rb +12 -0
  469. data/spec/lib/puppet_spec/files.rb +38 -5
  470. data/spec/lib/puppet_spec/fixtures.rb +28 -0
  471. data/spec/lib/puppet_spec/matchers.rb +87 -0
  472. data/spec/lib/puppet_spec/verbose.rb +0 -0
  473. data/spec/monkey_patches/alias_should_to_must.rb +0 -0
  474. data/spec/monkey_patches/publicize_methods.rb +0 -0
  475. data/spec/shared_behaviours/all_parsedfile_providers.rb +21 -0
  476. data/spec/shared_behaviours/an_indirector_face.rb +6 -0
  477. data/spec/shared_behaviours/documentation_on_faces.rb +263 -0
  478. data/spec/shared_behaviours/file_server_terminus.rb +1 -1
  479. data/spec/shared_behaviours/file_serving.rb +61 -70
  480. data/spec/shared_behaviours/memory_terminus.rb +0 -0
  481. data/spec/shared_behaviours/path_parameters.rb +0 -0
  482. data/spec/shared_behaviours/things_that_declare_options.rb +150 -0
  483. data/spec/spec.opts +0 -2
  484. data/spec/spec_helper.rb +33 -75
  485. data/spec/unit/agent/locker_spec.rb +2 -3
  486. data/spec/unit/agent_spec.rb +2 -2
  487. data/spec/unit/application/agent_spec.rb +51 -76
  488. data/spec/unit/application/apply_spec.rb +86 -150
  489. data/spec/unit/application/cert_spec.rb +8 -30
  490. data/spec/unit/application/certificate_spec.rb +20 -0
  491. data/spec/unit/application/config_spec.rb +9 -0
  492. data/spec/unit/application/describe_spec.rb +2 -3
  493. data/spec/unit/application/device_spec.rb +342 -0
  494. data/spec/unit/application/doc_spec.rb +11 -18
  495. data/spec/unit/application/face_base_spec.rb +360 -0
  496. data/spec/unit/application/facts_spec.rb +27 -0
  497. data/spec/unit/application/filebucket_spec.rb +7 -18
  498. data/spec/unit/application/indirection_base_spec.rb +42 -0
  499. data/spec/unit/application/inspect_spec.rb +7 -13
  500. data/spec/unit/application/kick_spec.rb +15 -38
  501. data/spec/unit/application/master_spec.rb +25 -81
  502. data/spec/unit/application/queue_spec.rb +12 -22
  503. data/spec/unit/application/resource_spec.rb +19 -53
  504. data/spec/unit/application/secret_agent_spec.rb +32 -0
  505. data/spec/unit/application_spec.rb +65 -34
  506. data/spec/unit/configurer/downloader_spec.rb +2 -3
  507. data/spec/unit/configurer/fact_handler_spec.rb +39 -46
  508. data/spec/unit/configurer/plugin_handler_spec.rb +2 -3
  509. data/spec/unit/configurer_spec.rb +329 -411
  510. data/spec/unit/daemon_spec.rb +7 -14
  511. data/spec/unit/dsl/resource_api_spec.rb +2 -3
  512. data/spec/unit/dsl/resource_type_api_spec.rb +24 -37
  513. data/spec/unit/face/catalog_spec.rb +7 -0
  514. data/spec/unit/face/certificate_request_spec.rb +7 -0
  515. data/spec/unit/face/certificate_revocation_list_spec.rb +7 -0
  516. data/spec/unit/face/certificate_spec.rb +23 -0
  517. data/spec/unit/face/config_spec.rb +24 -0
  518. data/spec/unit/face/facts_spec.rb +23 -0
  519. data/spec/unit/face/file_spec.rb +12 -0
  520. data/spec/unit/face/help_spec.rb +129 -0
  521. data/spec/unit/face/key_spec.rb +7 -0
  522. data/spec/unit/face/node_spec.rb +7 -0
  523. data/spec/unit/face/plugin_spec.rb +10 -0
  524. data/spec/unit/face/report_spec.rb +7 -0
  525. data/spec/unit/face/resource_spec.rb +7 -0
  526. data/spec/unit/face/resource_type_spec.rb +7 -0
  527. data/spec/unit/face/secret_agent_spec.rb +25 -0
  528. data/spec/unit/face_spec.rb +1 -0
  529. data/spec/unit/file_bucket/dipper_spec.rb +7 -8
  530. data/spec/unit/file_bucket/file_spec.rb +7 -16
  531. data/spec/unit/file_collection/lookup_spec.rb +2 -3
  532. data/spec/unit/file_collection_spec.rb +2 -3
  533. data/spec/unit/file_serving/base_spec.rb +2 -3
  534. data/spec/unit/file_serving/configuration/parser_spec.rb +2 -3
  535. data/spec/unit/file_serving/configuration_spec.rb +31 -40
  536. data/spec/unit/file_serving/content_spec.rb +6 -3
  537. data/spec/unit/file_serving/fileset_spec.rb +2 -3
  538. data/spec/unit/file_serving/{terminus_selector_spec.rb → indirection_hooks_spec.rb} +14 -13
  539. data/spec/unit/file_serving/metadata_spec.rb +6 -3
  540. data/spec/unit/file_serving/mount/file_spec.rb +2 -3
  541. data/spec/unit/file_serving/mount/modules_spec.rb +2 -11
  542. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -3
  543. data/spec/unit/file_serving/mount_spec.rb +2 -3
  544. data/spec/unit/file_serving/terminus_helper_spec.rb +2 -2
  545. data/spec/unit/indirector/active_record_spec.rb +5 -7
  546. data/spec/unit/indirector/catalog/active_record_spec.rb +2 -3
  547. data/spec/unit/indirector/catalog/compiler_spec.rb +30 -50
  548. data/spec/unit/indirector/catalog/queue_spec.rb +2 -3
  549. data/spec/unit/indirector/catalog/rest_spec.rb +2 -3
  550. data/spec/unit/indirector/catalog/yaml_spec.rb +2 -3
  551. data/spec/unit/indirector/certificate/ca_spec.rb +2 -2
  552. data/spec/unit/indirector/certificate/file_spec.rb +2 -2
  553. data/spec/unit/indirector/certificate/rest_spec.rb +2 -3
  554. data/spec/unit/indirector/certificate_request/ca_spec.rb +47 -2
  555. data/spec/unit/indirector/certificate_request/file_spec.rb +2 -2
  556. data/spec/unit/indirector/certificate_request/rest_spec.rb +2 -3
  557. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +2 -2
  558. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +2 -2
  559. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +2 -3
  560. data/spec/unit/indirector/certificate_status/file_spec.rb +187 -0
  561. data/spec/unit/indirector/certificate_status/rest_spec.rb +14 -0
  562. data/spec/unit/indirector/code_spec.rb +6 -8
  563. data/spec/unit/indirector/direct_file_server_spec.rb +6 -7
  564. data/spec/unit/indirector/envelope_spec.rb +2 -3
  565. data/spec/unit/indirector/exec_spec.rb +12 -13
  566. data/spec/unit/indirector/face_spec.rb +68 -0
  567. data/spec/unit/indirector/facts/active_record_spec.rb +2 -3
  568. data/spec/unit/indirector/facts/couch_spec.rb +71 -66
  569. data/spec/unit/indirector/facts/facter_spec.rb +2 -2
  570. data/spec/unit/indirector/facts/inventory_active_record_spec.rb +20 -20
  571. data/spec/unit/indirector/facts/network_device_spec.rb +89 -0
  572. data/spec/unit/indirector/facts/rest_spec.rb +2 -3
  573. data/spec/unit/indirector/facts/yaml_spec.rb +2 -3
  574. data/spec/unit/indirector/file_bucket_file/file_spec.rb +17 -18
  575. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +2 -3
  576. data/spec/unit/indirector/file_content/file_server_spec.rb +2 -2
  577. data/spec/unit/indirector/file_content/file_spec.rb +2 -2
  578. data/spec/unit/indirector/file_content/rest_spec.rb +2 -3
  579. data/spec/unit/indirector/file_metadata/file_server_spec.rb +2 -2
  580. data/spec/unit/indirector/file_metadata/file_spec.rb +2 -2
  581. data/spec/unit/indirector/file_metadata/rest_spec.rb +2 -3
  582. data/spec/unit/indirector/file_server_spec.rb +8 -7
  583. data/spec/unit/indirector/file_spec.rb +179 -0
  584. data/spec/unit/indirector/indirection_spec.rb +3 -24
  585. data/spec/unit/indirector/inventory/yaml_spec.rb +220 -0
  586. data/spec/unit/indirector/key/ca_spec.rb +2 -2
  587. data/spec/unit/indirector/key/file_spec.rb +2 -2
  588. data/spec/unit/indirector/ldap_spec.rb +6 -8
  589. data/spec/unit/indirector/memory_spec.rb +5 -7
  590. data/spec/unit/indirector/node/active_record_spec.rb +2 -3
  591. data/spec/unit/indirector/node/exec_spec.rb +3 -4
  592. data/spec/unit/indirector/node/ldap_spec.rb +3 -4
  593. data/spec/unit/indirector/node/memory_spec.rb +2 -3
  594. data/spec/unit/indirector/node/plain_spec.rb +2 -3
  595. data/spec/unit/indirector/node/rest_spec.rb +2 -3
  596. data/spec/unit/indirector/node/yaml_spec.rb +2 -3
  597. data/spec/unit/indirector/plain_spec.rb +5 -7
  598. data/spec/unit/indirector/queue_spec.rb +11 -14
  599. data/spec/unit/indirector/report/processor_spec.rb +7 -9
  600. data/spec/unit/indirector/report/rest_spec.rb +2 -3
  601. data/spec/unit/indirector/report/yaml_spec.rb +3 -4
  602. data/spec/unit/indirector/request_spec.rb +3 -25
  603. data/spec/unit/indirector/resource/ral_spec.rb +3 -4
  604. data/spec/unit/indirector/resource/rest_spec.rb +2 -3
  605. data/spec/unit/indirector/resource_type/parser_spec.rb +87 -13
  606. data/spec/unit/indirector/resource_type/rest_spec.rb +2 -3
  607. data/spec/unit/indirector/rest_spec.rb +45 -16
  608. data/spec/unit/indirector/run/local_spec.rb +2 -3
  609. data/spec/unit/indirector/run/rest_spec.rb +2 -3
  610. data/spec/unit/indirector/ssl_file_spec.rb +9 -27
  611. data/spec/unit/indirector/status/rest_spec.rb +2 -3
  612. data/spec/unit/indirector/terminus_spec.rb +180 -187
  613. data/spec/unit/indirector/yaml_spec.rb +9 -23
  614. data/spec/unit/indirector_spec.rb +61 -79
  615. data/spec/unit/interface/action_builder_spec.rb +214 -0
  616. data/spec/unit/interface/action_manager_spec.rb +282 -0
  617. data/spec/unit/interface/action_spec.rb +545 -0
  618. data/spec/unit/interface/documentation_spec.rb +34 -0
  619. data/spec/unit/interface/face_collection_spec.rb +180 -0
  620. data/spec/unit/interface/option_builder_spec.rb +77 -0
  621. data/spec/unit/interface/option_spec.rb +100 -0
  622. data/spec/unit/interface_spec.rb +228 -0
  623. data/spec/unit/module_spec.rb +34 -10
  624. data/spec/unit/network/authconfig_spec.rb +3 -4
  625. data/spec/unit/network/authstore_spec.rb +3 -4
  626. data/spec/unit/network/client_spec.rb +45 -0
  627. data/spec/unit/network/format_handler_spec.rb +2 -3
  628. data/spec/unit/network/format_spec.rb +2 -3
  629. data/spec/unit/network/formats_spec.rb +107 -3
  630. data/spec/unit/network/handler/fileserver_spec.rb +3 -4
  631. data/spec/unit/network/http/api/v1_spec.rb +61 -27
  632. data/spec/unit/network/http/compression_spec.rb +2 -3
  633. data/spec/unit/network/http/handler_spec.rb +78 -109
  634. data/spec/unit/network/http/mongrel/rest_spec.rb +3 -4
  635. data/spec/unit/network/http/mongrel_spec.rb +6 -6
  636. data/spec/unit/network/http/rack/rest_spec.rb +2 -20
  637. data/spec/unit/network/http/rack/xmlrpc_spec.rb +2 -3
  638. data/spec/unit/network/http/rack_spec.rb +2 -3
  639. data/spec/unit/network/http/webrick/rest_spec.rb +3 -4
  640. data/spec/unit/network/http/webrick_spec.rb +4 -8
  641. data/spec/unit/network/http_pool_spec.rb +82 -95
  642. data/spec/unit/network/http_spec.rb +2 -2
  643. data/spec/unit/network/rest_authconfig_spec.rb +9 -42
  644. data/spec/unit/network/rights_spec.rb +6 -7
  645. data/spec/unit/network/server_spec.rb +2 -2
  646. data/spec/unit/network/xmlrpc/client_spec.rb +172 -0
  647. data/spec/unit/node/environment_spec.rb +63 -7
  648. data/spec/unit/node/facts_spec.rb +9 -13
  649. data/spec/unit/node_spec.rb +5 -13
  650. data/spec/unit/other/selinux_spec.rb +2 -3
  651. data/spec/unit/other/transbucket_spec.rb +2 -3
  652. data/spec/unit/other/transobject_spec.rb +2 -3
  653. data/spec/unit/parameter/path_spec.rb +2 -2
  654. data/spec/unit/parameter/value_collection_spec.rb +2 -3
  655. data/spec/unit/parameter/value_spec.rb +2 -3
  656. data/spec/unit/parameter_spec.rb +2 -3
  657. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +2 -13
  658. data/spec/unit/parser/ast/astarray_spec.rb +18 -36
  659. data/spec/unit/parser/ast/asthash_spec.rb +4 -4
  660. data/spec/unit/parser/ast/boolean_operator_spec.rb +2 -3
  661. data/spec/unit/parser/ast/casestatement_spec.rb +17 -14
  662. data/spec/unit/parser/ast/collection_spec.rb +2 -3
  663. data/spec/unit/parser/ast/collexpr_spec.rb +2 -3
  664. data/spec/unit/parser/ast/comparison_operator_spec.rb +4 -5
  665. data/spec/unit/parser/ast/definition_spec.rb +21 -0
  666. data/spec/unit/parser/ast/function_spec.rb +3 -4
  667. data/spec/unit/parser/ast/hostclass_spec.rb +72 -0
  668. data/spec/unit/parser/ast/ifstatement_spec.rb +2 -3
  669. data/spec/unit/parser/ast/in_operator_spec.rb +2 -3
  670. data/spec/unit/parser/ast/leaf_spec.rb +23 -19
  671. data/spec/unit/parser/ast/match_operator_spec.rb +2 -3
  672. data/spec/unit/parser/ast/minus_spec.rb +2 -3
  673. data/spec/unit/parser/ast/node_spec.rb +30 -0
  674. data/spec/unit/parser/ast/nop_spec.rb +2 -3
  675. data/spec/unit/parser/ast/not_spec.rb +2 -3
  676. data/spec/unit/parser/ast/relationship_spec.rb +2 -3
  677. data/spec/unit/parser/ast/resource_defaults_spec.rb +2 -3
  678. data/spec/unit/parser/ast/resource_override_spec.rb +2 -3
  679. data/spec/unit/parser/ast/resource_reference_spec.rb +21 -8
  680. data/spec/unit/parser/ast/resource_spec.rb +24 -13
  681. data/spec/unit/parser/ast/selector_spec.rb +3 -4
  682. data/spec/unit/parser/ast/vardef_spec.rb +15 -9
  683. data/spec/unit/parser/ast_spec.rb +2 -3
  684. data/spec/unit/parser/collector_spec.rb +2 -3
  685. data/spec/unit/parser/compiler_spec.rb +62 -35
  686. data/spec/unit/parser/files_spec.rb +2 -3
  687. data/spec/unit/parser/functions/create_resources_spec.rb +137 -0
  688. data/spec/unit/parser/functions/defined_spec.rb +5 -3
  689. data/spec/unit/parser/functions/extlookup_spec.rb +10 -10
  690. data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -13
  691. data/spec/unit/parser/functions/generate_spec.rb +5 -3
  692. data/spec/unit/parser/functions/include_spec.rb +5 -3
  693. data/spec/unit/parser/functions/inline_template_spec.rb +6 -17
  694. data/spec/unit/parser/functions/realize_spec.rb +5 -3
  695. data/spec/unit/parser/functions/regsubst_spec.rb +5 -3
  696. data/spec/unit/parser/functions/require_spec.rb +5 -3
  697. data/spec/unit/parser/functions/shellquote_spec.rb +8 -6
  698. data/spec/unit/parser/functions/split_spec.rb +5 -3
  699. data/spec/unit/parser/functions/sprintf_spec.rb +5 -3
  700. data/spec/unit/parser/functions/tag_spec.rb +5 -3
  701. data/spec/unit/parser/functions/template_spec.rb +6 -21
  702. data/spec/unit/parser/functions/versioncmp_spec.rb +5 -3
  703. data/spec/unit/parser/functions_spec.rb +2 -3
  704. data/spec/unit/parser/lexer_spec.rb +3 -7
  705. data/spec/unit/parser/parser_spec.rb +71 -90
  706. data/spec/unit/parser/relationship_spec.rb +2 -3
  707. data/spec/unit/parser/resource_spec.rb +6 -65
  708. data/spec/unit/parser/scope_spec.rb +28 -179
  709. data/spec/unit/parser/templatewrapper_spec.rb +25 -43
  710. data/spec/unit/parser/type_loader_spec.rb +120 -78
  711. data/spec/unit/property/ensure_spec.rb +2 -3
  712. data/spec/unit/property/keyvalue_spec.rb +4 -8
  713. data/spec/unit/property/list_spec.rb +2 -3
  714. data/spec/unit/property/ordered_list_spec.rb +2 -3
  715. data/spec/unit/property_spec.rb +2 -3
  716. data/spec/unit/provider/augeas/augeas_spec.rb +80 -3
  717. data/spec/unit/provider/cisco_spec.rb +16 -0
  718. data/spec/unit/provider/confine/exists_spec.rb +2 -3
  719. data/spec/unit/provider/confine/false_spec.rb +2 -3
  720. data/spec/unit/provider/confine/feature_spec.rb +2 -3
  721. data/spec/unit/provider/confine/true_spec.rb +2 -3
  722. data/spec/unit/provider/confine/variable_spec.rb +2 -3
  723. data/spec/unit/provider/confine_collection_spec.rb +2 -3
  724. data/spec/unit/provider/confine_spec.rb +2 -3
  725. data/spec/unit/provider/confiner_spec.rb +2 -3
  726. data/spec/unit/provider/exec/posix_spec.rb +2 -2
  727. data/spec/unit/provider/exec/shell_spec.rb +2 -2
  728. data/spec/unit/provider/group/groupadd_spec.rb +2 -3
  729. data/spec/unit/provider/group/ldap_spec.rb +2 -2
  730. data/spec/unit/provider/host/parsed_spec.rb +197 -0
  731. data/spec/unit/provider/interface/cisco_spec.rb +58 -0
  732. data/spec/unit/provider/ldap_spec.rb +2 -2
  733. data/spec/unit/provider/macauthorization_spec.rb +2 -2
  734. data/spec/unit/provider/mcx/mcxcontent_spec.rb +2 -21
  735. data/spec/unit/provider/mount/parsed_spec.rb +61 -86
  736. data/spec/unit/provider/mount_spec.rb +2 -3
  737. data/spec/unit/provider/naginator_spec.rb +2 -3
  738. data/spec/unit/provider/nameservice/directoryservice_spec.rb +2 -63
  739. data/spec/unit/provider/network_device_spec.rb +153 -0
  740. data/spec/unit/provider/package/aix_spec.rb +2 -3
  741. data/spec/unit/provider/package/apt_spec.rb +2 -3
  742. data/spec/unit/provider/package/dpkg_spec.rb +2 -3
  743. data/spec/unit/provider/package/freebsd_spec.rb +2 -3
  744. data/spec/unit/provider/package/gem_spec.rb +2 -3
  745. data/spec/unit/provider/package/hpux_spec.rb +2 -3
  746. data/spec/unit/provider/package/macports_spec.rb +2 -2
  747. data/spec/unit/provider/package/nim_spec.rb +2 -3
  748. data/spec/unit/provider/package/pip_spec.rb +180 -0
  749. data/spec/unit/provider/package/pkg_spec.rb +2 -3
  750. data/spec/unit/provider/package/pkgdmg_spec.rb +49 -56
  751. data/spec/unit/provider/package/pkgutil_spec.rb +182 -0
  752. data/spec/unit/provider/package/yum_spec.rb +66 -0
  753. data/spec/unit/provider/package/zypper_spec.rb +2 -3
  754. data/spec/unit/provider/parsedfile_spec.rb +2 -3
  755. data/spec/unit/provider/selboolean_spec.rb +2 -3
  756. data/spec/unit/provider/selmodule_spec.rb +2 -2
  757. data/spec/unit/provider/service/daemontools_spec.rb +2 -2
  758. data/spec/unit/provider/service/debian_spec.rb +2 -2
  759. data/spec/unit/provider/service/freebsd_spec.rb +2 -3
  760. data/spec/unit/provider/service/init_spec.rb +3 -3
  761. data/spec/unit/provider/service/launchd_spec.rb +2 -2
  762. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  763. data/spec/unit/provider/service/runit_spec.rb +2 -2
  764. data/spec/unit/provider/service/smf_spec.rb +137 -0
  765. data/spec/unit/provider/service/src_spec.rb +7 -7
  766. data/spec/unit/provider/service/upstart.rb +48 -0
  767. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +28 -47
  768. data/spec/unit/provider/sshkey/parsed_spec.rb +2 -3
  769. data/spec/unit/provider/user/hpux_spec.rb +2 -3
  770. data/spec/unit/provider/user/ldap_spec.rb +2 -2
  771. data/spec/unit/provider/user/user_role_add_spec.rb +15 -53
  772. data/spec/unit/provider/user/useradd_spec.rb +2 -3
  773. data/spec/unit/provider/vlan/cisco_spec.rb +56 -0
  774. data/spec/unit/provider/zfs/solaris_spec.rb +4 -4
  775. data/spec/unit/provider/zone/solaris_spec.rb +2 -3
  776. data/spec/unit/provider/zpool/solaris_spec.rb +33 -4
  777. data/spec/unit/provider_spec.rb +2 -3
  778. data/spec/unit/puppet/provider/README.markdown +4 -0
  779. data/spec/unit/puppet/type/README.markdown +4 -0
  780. data/spec/unit/puppet_spec.rb +2 -2
  781. data/spec/unit/rails/host_spec.rb +2 -11
  782. data/spec/unit/rails/param_value_spec.rb +2 -3
  783. data/spec/unit/rails/resource_spec.rb +2 -3
  784. data/spec/unit/rails_spec.rb +2 -3
  785. data/spec/unit/relationship_spec.rb +2 -2
  786. data/spec/unit/reports/http_spec.rb +2 -3
  787. data/spec/unit/reports/rrdgraph_spec.rb +2 -3
  788. data/spec/unit/reports/store_spec.rb +2 -17
  789. data/spec/unit/reports/tagmail_spec.rb +4 -8
  790. data/spec/unit/reports_spec.rb +2 -3
  791. data/spec/unit/resource/catalog_spec.rb +15 -74
  792. data/spec/unit/resource/status_spec.rb +3 -4
  793. data/spec/unit/resource/type_collection_helper_spec.rb +2 -3
  794. data/spec/unit/resource/type_collection_spec.rb +69 -81
  795. data/spec/unit/resource/type_spec.rb +26 -44
  796. data/spec/unit/resource_spec.rb +3 -4
  797. data/spec/unit/run_spec.rb +2 -3
  798. data/spec/unit/simple_graph_spec.rb +434 -80
  799. data/spec/unit/ssl/base_spec.rb +3 -4
  800. data/spec/unit/ssl/certificate_authority/interface_spec.rb +56 -96
  801. data/spec/unit/ssl/certificate_authority_spec.rb +71 -246
  802. data/spec/unit/ssl/certificate_factory_spec.rb +72 -93
  803. data/spec/unit/ssl/certificate_request_spec.rb +11 -76
  804. data/spec/unit/ssl/certificate_revocation_list_spec.rb +4 -5
  805. data/spec/unit/ssl/certificate_spec.rb +2 -34
  806. data/spec/unit/ssl/host_spec.rb +202 -207
  807. data/spec/unit/ssl/inventory_spec.rb +4 -5
  808. data/spec/unit/ssl/key_spec.rb +2 -3
  809. data/spec/unit/sslcertificates/ca_spec.rb +110 -0
  810. data/spec/unit/status_spec.rb +8 -5
  811. data/spec/unit/transaction/event_manager_spec.rb +2 -3
  812. data/spec/unit/transaction/event_spec.rb +7 -8
  813. data/spec/unit/transaction/report_spec.rb +25 -14
  814. data/spec/unit/transaction/resource_harness_spec.rb +2 -4
  815. data/spec/unit/transaction_spec.rb +31 -28
  816. data/spec/unit/transportable_spec.rb +0 -0
  817. data/spec/unit/type/augeas_spec.rb +3 -4
  818. data/spec/unit/type/component_spec.rb +2 -3
  819. data/spec/unit/type/computer_spec.rb +2 -3
  820. data/spec/unit/type/cron_spec.rb +12 -3
  821. data/spec/unit/type/exec_spec.rb +2 -32
  822. data/spec/unit/type/file/checksum_spec.rb +2 -3
  823. data/spec/unit/type/file/content_spec.rb +2 -3
  824. data/spec/unit/type/file/ctime.rb +2 -3
  825. data/spec/unit/type/file/ensure_spec.rb +2 -3
  826. data/spec/unit/type/file/group_spec.rb +2 -3
  827. data/spec/unit/type/file/mtime.rb +2 -3
  828. data/spec/unit/type/file/owner_spec.rb +2 -3
  829. data/spec/unit/type/file/selinux_spec.rb +2 -3
  830. data/spec/unit/type/file/source_spec.rb +9 -10
  831. data/spec/unit/type/file/type.rb +2 -3
  832. data/spec/unit/type/file_spec.rb +15 -30
  833. data/spec/unit/type/filebucket_spec.rb +2 -3
  834. data/spec/unit/type/group_spec.rb +4 -5
  835. data/spec/unit/type/host_spec.rb +129 -0
  836. data/spec/unit/type/interface_spec.rb +98 -0
  837. data/spec/unit/type/macauthorization_spec.rb +2 -3
  838. data/spec/unit/type/maillist_spec.rb +2 -3
  839. data/spec/unit/type/mcx_spec.rb +2 -23
  840. data/spec/unit/type/mount_spec.rb +41 -18
  841. data/spec/unit/type/nagios_spec.rb +2 -3
  842. data/spec/unit/type/noop_metaparam_spec.rb +2 -3
  843. data/spec/unit/type/package_spec.rb +2 -3
  844. data/spec/unit/type/resources_spec.rb +3 -4
  845. data/spec/unit/type/schedule_spec.rb +19 -12
  846. data/spec/unit/type/selboolean_spec.rb +2 -3
  847. data/spec/unit/type/selmodule_spec.rb +2 -3
  848. data/spec/unit/type/service_spec.rb +6 -3
  849. data/spec/unit/type/ssh_authorized_key_spec.rb +2 -3
  850. data/spec/unit/type/sshkey_spec.rb +70 -0
  851. data/spec/unit/type/stage_spec.rb +2 -3
  852. data/spec/unit/type/tidy_spec.rb +4 -4
  853. data/spec/unit/type/user_spec.rb +2 -11
  854. data/spec/unit/type/vlan_spec.rb +45 -0
  855. data/spec/unit/type/whit_spec.rb +4 -5
  856. data/spec/unit/type/zfs_spec.rb +2 -3
  857. data/spec/unit/type/zone_spec.rb +22 -3
  858. data/spec/unit/type/zpool_spec.rb +2 -3
  859. data/spec/unit/type_spec.rb +2 -69
  860. data/spec/unit/util/autoload/file_cache_spec.rb +2 -3
  861. data/spec/unit/util/autoload_spec.rb +6 -7
  862. data/spec/unit/util/backups_spec.rb +2 -3
  863. data/spec/unit/util/cache_accumulator_spec.rb +2 -3
  864. data/spec/unit/util/cacher_spec.rb +3 -4
  865. data/spec/unit/util/checksums_spec.rb +2 -2
  866. data/spec/unit/util/command_line_spec.rb +11 -8
  867. data/spec/unit/util/constant_inflector_spec.rb +2 -2
  868. data/spec/unit/util/errors_spec.rb +2 -3
  869. data/spec/unit/util/execution_spec.rb +2 -3
  870. data/spec/unit/util/execution_stub_spec.rb +2 -3
  871. data/spec/unit/util/feature_spec.rb +2 -3
  872. data/spec/unit/util/file_locking_spec.rb +4 -5
  873. data/spec/unit/util/filetype_spec.rb +2 -3
  874. data/spec/unit/util/inline_docs_spec.rb +2 -3
  875. data/spec/unit/util/ldap/connection_spec.rb +2 -2
  876. data/spec/unit/util/ldap/generator_spec.rb +2 -2
  877. data/spec/unit/util/ldap/manager_spec.rb +2 -2
  878. data/spec/unit/util/loadedfile_spec.rb +2 -3
  879. data/spec/unit/util/log/destinations_spec.rb +2 -3
  880. data/spec/unit/util/log_spec.rb +6 -7
  881. data/spec/unit/util/logging_spec.rb +27 -3
  882. data/spec/unit/util/metric_spec.rb +2 -3
  883. data/spec/unit/util/monkey_patches_spec.rb +48 -10
  884. data/spec/unit/util/nagios_maker_spec.rb +2 -2
  885. data/spec/unit/util/network_device/cisco/device_spec.rb +408 -0
  886. data/spec/unit/util/network_device/cisco/facts_spec.rb +63 -0
  887. data/spec/unit/util/network_device/cisco/interface_spec.rb +89 -0
  888. data/spec/unit/util/network_device/config_spec.rb +102 -0
  889. data/spec/unit/util/network_device/ipcalc_spec.rb +63 -0
  890. data/spec/unit/util/network_device/transport/base_spec.rb +42 -0
  891. data/spec/unit/util/network_device/transport/ssh_spec.rb +219 -0
  892. data/spec/unit/util/network_device/transport/telnet_spec.rb +76 -0
  893. data/spec/unit/util/network_device_spec.rb +50 -0
  894. data/spec/unit/util/package_spec.rb +2 -3
  895. data/spec/unit/util/posix_spec.rb +2 -3
  896. data/spec/unit/util/pson_spec.rb +3 -4
  897. data/spec/unit/util/queue/stomp_spec.rb +4 -5
  898. data/spec/unit/util/queue_spec.rb +2 -3
  899. data/spec/unit/util/rdoc/parser_spec.rb +17 -12
  900. data/spec/unit/util/rdoc_spec.rb +19 -58
  901. data/spec/unit/util/reference_serializer_spec.rb +2 -3
  902. data/spec/unit/util/resource_template_spec.rb +2 -3
  903. data/spec/unit/util/run_mode_spec.rb +2 -3
  904. data/spec/unit/util/selinux_spec.rb +4 -5
  905. data/spec/unit/util/settings/file_setting_spec.rb +2 -7
  906. data/spec/unit/util/settings_spec.rb +2 -24
  907. data/spec/unit/util/storage_spec.rb +2 -3
  908. data/spec/unit/util/tagging_spec.rb +2 -2
  909. data/spec/unit/util/user_attr_spec.rb +2 -3
  910. data/spec/unit/util/warnings_spec.rb +2 -3
  911. data/spec/unit/util/zaml_spec.rb +23 -53
  912. data/spec/watchr.rb +146 -0
  913. data/tasks/rake/gem.rake +5 -4
  914. data/tasks/rake/git_workflow.rake +62 -51
  915. data/tasks/rake/manpages.rake +69 -0
  916. data/test/certmgr/certmgr.rb +308 -0
  917. data/test/certmgr/inventory.rb +69 -0
  918. data/test/certmgr/support.rb +105 -0
  919. data/test/data/providers/host/parsed/valid_hosts +19 -0
  920. data/test/language/ast.rb +1 -1
  921. data/test/language/ast/variable.rb +1 -1
  922. data/test/language/functions.rb +8 -9
  923. data/test/language/parser.rb +44 -52
  924. data/test/language/scope.rb +13 -24
  925. data/test/language/snippets.rb +11 -2
  926. data/test/language/transportable.rb +1 -1
  927. data/test/lib/puppettest.rb +2 -2
  928. data/test/lib/puppettest/exetest.rb +1 -1
  929. data/test/lib/puppettest/parsertesting.rb +5 -8
  930. data/test/lib/puppettest/servertest.rb +1 -0
  931. data/test/lib/puppettest/support/assertions.rb +6 -1
  932. data/test/lib/puppettest/support/utils.rb +0 -19
  933. data/test/network/authconfig.rb +1 -1
  934. data/test/network/authorization.rb +1 -1
  935. data/test/network/authstore.rb +1 -1
  936. data/test/network/client/ca.rb +69 -0
  937. data/test/network/client/dipper.rb +34 -0
  938. data/test/network/client_request.rb +1 -1
  939. data/test/network/handler/ca.rb +273 -0
  940. data/test/network/handler/fileserver.rb +1 -1
  941. data/test/network/handler/master.rb +13 -9
  942. data/test/network/handler/report.rb +1 -1
  943. data/test/network/handler/runner.rb +1 -1
  944. data/test/network/rights.rb +1 -1
  945. data/test/network/server/mongrel_test.rb +99 -0
  946. data/test/network/server/webrick.rb +128 -0
  947. data/test/network/xmlrpc/client.rb +45 -0
  948. data/test/network/xmlrpc/processor.rb +1 -1
  949. data/test/network/xmlrpc/server.rb +1 -1
  950. data/test/network/xmlrpc/webrick_servlet.rb +1 -1
  951. data/test/other/provider.rb +1 -1
  952. data/test/other/puppet.rb +1 -1
  953. data/test/other/relationships.rb +11 -18
  954. data/test/other/report.rb +1 -1
  955. data/test/other/transactions.rb +2 -35
  956. data/test/puppet/defaults.rb +1 -1
  957. data/test/puppet/errortest.rb +1 -1
  958. data/test/puppet/tc_suidmanager.rb +120 -0
  959. data/test/rails/rails.rb +2 -1
  960. data/test/rails/railsparameter.rb +2 -2
  961. data/test/ral/manager/attributes.rb +1 -1
  962. data/test/ral/manager/instances.rb +1 -1
  963. data/test/ral/manager/manager.rb +1 -1
  964. data/test/ral/manager/provider.rb +1 -1
  965. data/test/ral/manager/type.rb +1 -1
  966. data/test/ral/providers/cron/crontab.rb +1 -1
  967. data/test/ral/providers/group.rb +1 -1
  968. data/test/ral/providers/host/parsed.rb +1 -203
  969. data/test/ral/providers/mailalias/aliases.rb +1 -1
  970. data/test/ral/providers/nameservice.rb +1 -1
  971. data/test/ral/providers/package.rb +1 -1
  972. data/test/ral/providers/package/aptitude.rb +1 -1
  973. data/test/ral/providers/package/aptrpm.rb +1 -1
  974. data/test/ral/providers/parsedfile.rb +1 -1
  975. data/test/ral/providers/port/parsed.rb +1 -1
  976. data/test/ral/providers/provider.rb +1 -1
  977. data/test/ral/providers/service/base.rb +1 -1
  978. data/test/ral/providers/sshkey/parsed.rb +1 -1
  979. data/test/ral/providers/user.rb +1 -1
  980. data/test/ral/providers/user/useradd.rb +1 -1
  981. data/test/ral/type/cron.rb +1 -1
  982. data/test/ral/type/exec.rb +1 -42
  983. data/test/ral/type/file.rb +1 -1
  984. data/test/ral/type/file/target.rb +6 -19
  985. data/test/ral/type/fileignoresource.rb +1 -1
  986. data/test/ral/type/filesources.rb +61 -1
  987. data/test/ral/type/host.rb +1 -1
  988. data/test/ral/type/mailalias.rb +1 -1
  989. data/test/ral/type/port.rb +1 -1
  990. data/test/ral/type/resources.rb +1 -1
  991. data/test/ral/type/service.rb +1 -1
  992. data/test/ral/type/sshkey.rb +1 -1
  993. data/test/ral/type/user.rb +1 -1
  994. data/test/ral/type/yumrepo.rb +1 -1
  995. data/test/ral/type/zone.rb +1 -1
  996. data/test/test +2 -2
  997. data/test/util/classgen.rb +1 -1
  998. data/test/util/execution.rb +1 -1
  999. data/test/util/fileparsing.rb +1 -1
  1000. data/test/util/inifile.rb +1 -1
  1001. data/test/util/instance_loader.rb +1 -1
  1002. data/test/util/log.rb +1 -1
  1003. data/test/util/metrics.rb +1 -1
  1004. data/test/util/package.rb +1 -1
  1005. data/test/util/pidlock.rb +1 -1
  1006. data/test/util/settings.rb +1 -1
  1007. data/test/util/storage.rb +1 -1
  1008. data/test/util/subclass_loader.rb +1 -1
  1009. data/test/util/utiltest.rb +1 -1
  1010. metadata +312 -48
  1011. data/CHANGELOG.old +0 -1705
  1012. data/CONTRIBUTING.md +0 -299
  1013. data/COPYING +0 -340
  1014. data/README.queueing +0 -126
  1015. data/ext/upload_facts.rb +0 -120
  1016. data/ext/vim/ftplugin/puppet.vim +0 -94
  1017. data/ext/vim/indent/puppet.vim +0 -76
  1018. data/lib/puppet/indirector/errors.rb +0 -5
  1019. data/lib/puppet/indirector/facts/inventory_service.rb +0 -20
  1020. data/lib/puppet/indirector/file_bucket_file/selector.rb +0 -53
  1021. data/lib/puppet/indirector/file_content/selector.rb +0 -30
  1022. data/lib/puppet/indirector/file_metadata/selector.rb +0 -30
  1023. data/lib/puppet/indirector/resource/validator.rb +0 -8
  1024. data/lib/puppet/util/command_line/filebucket +0 -97
  1025. data/lib/puppet/util/command_line/pi +0 -48
  1026. data/lib/puppet/util/command_line/puppet +0 -73
  1027. data/lib/puppet/util/command_line/puppetca +0 -131
  1028. data/lib/puppet/util/command_line/puppetd +0 -188
  1029. data/lib/puppet/util/command_line/puppetdoc +0 -67
  1030. data/lib/puppet/util/command_line/puppetmasterd +0 -70
  1031. data/lib/puppet/util/command_line/puppetqd +0 -53
  1032. data/lib/puppet/util/command_line/puppetrun +0 -125
  1033. data/lib/puppet/util/command_line/ralsh +0 -89
  1034. data/spec/integration/file_bucket/file_spec.rb +0 -44
  1035. data/spec/integration/indirector/bucket_file/rest_spec.rb +0 -77
  1036. data/spec/integration/indirector/certificate/rest_spec.rb +0 -69
  1037. data/spec/integration/indirector/certificate_request/rest_spec.rb +0 -89
  1038. data/spec/integration/indirector/certificate_revocation_list/rest_spec.rb +0 -85
  1039. data/spec/integration/indirector/report/rest_spec.rb +0 -93
  1040. data/spec/shared_behaviours/file_serving_model.rb +0 -73
  1041. data/spec/unit/indirector/facts/inventory_service_spec.rb +0 -22
  1042. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +0 -29
  1043. data/spec/unit/indirector/file_content/selector_spec.rb +0 -10
  1044. data/spec/unit/indirector/file_metadata/selector_spec.rb +0 -11
  1045. data/spec/unit/network/handler/ca_spec.rb +0 -87
  1046. data/spec/unit/network/rest_authorization_spec.rb +0 -43
  1047. data/spec/unit/provider/package/appdmg_spec.rb +0 -42
  1048. data/spec/unit/type/k5login_spec.rb +0 -115
  1049. data/spec/unit/util/suidmanager_spec.rb +0 -220
  1050. data/spec/unit/util_spec.rb +0 -104
@@ -13,8 +13,8 @@ class Puppet::Resource::Type
13
13
 
14
14
  RESOURCE_SUPERTYPES = [:hostclass, :node, :definition]
15
15
 
16
- attr_accessor :file, :line, :doc, :code, :ruby_code, :parent, :resource_type_collection, :module_name
17
- attr_reader :type, :namespace, :arguments, :behaves_like
16
+ attr_accessor :file, :line, :doc, :code, :ruby_code, :parent, :resource_type_collection
17
+ attr_reader :type, :namespace, :arguments, :behaves_like, :module_name
18
18
 
19
19
  RESOURCE_SUPERTYPES.each do |t|
20
20
  define_method("#{t}?") { self.type == t }
@@ -34,13 +34,13 @@ class Puppet::Resource::Type
34
34
  end
35
35
 
36
36
  def to_pson_data_hash
37
- data = [:code, :doc, :line, :file, :parent].inject({}) do |hash, param|
38
- next hash unless value = self.send(param)
37
+ data = [:doc, :line, :file, :parent].inject({}) do |hash, param|
38
+ next hash unless (value = self.send(param)) and (value != "")
39
39
  hash[param.to_s] = value
40
40
  hash
41
41
  end
42
42
 
43
- data['arguments'] = arguments.dup
43
+ data['arguments'] = arguments.dup unless arguments.empty?
44
44
 
45
45
  data['name'] = name
46
46
  data['type'] = type
@@ -62,13 +62,11 @@ class Puppet::Resource::Type
62
62
 
63
63
  # Now evaluate the code associated with this class or definition.
64
64
  def evaluate_code(resource)
65
- scope = resource.scope
66
65
 
67
- if tmp = evaluate_parent_type(resource)
68
- scope = tmp
69
- end
66
+ static_parent = evaluate_parent_type(resource)
67
+ scope = static_parent || resource.scope
70
68
 
71
- scope = subscope(scope, resource) unless resource.title == :main
69
+ scope = scope.newscope(:namespace => namespace, :source => self, :resource => resource, :dynamic => !static_parent) unless resource.title == :main
72
70
  scope.compiler.add_class(name) unless definition?
73
71
 
74
72
  set_resource_parameters(resource, scope)
@@ -92,6 +90,8 @@ class Puppet::Resource::Type
92
90
  end
93
91
 
94
92
  set_arguments(options[:arguments])
93
+
94
+ @module_name = options[:module_name]
95
95
  end
96
96
 
97
97
  # This is only used for node names, and really only when the node name
@@ -261,11 +261,6 @@ class Puppet::Resource::Type
261
261
 
262
262
  end
263
263
 
264
- # Create a new subscope in which to evaluate our code.
265
- def subscope(scope, resource)
266
- scope.newscope :resource => resource, :namespace => self.namespace, :source => self
267
- end
268
-
269
264
  # Check whether a given argument is valid.
270
265
  def valid_parameter?(param)
271
266
  param = param.to_s
@@ -1,10 +1,12 @@
1
1
  class Puppet::Resource::TypeCollection
2
2
  attr_reader :environment
3
+ attr_accessor :parse_failed
3
4
 
4
5
  def clear
5
6
  @hostclasses.clear
6
7
  @definitions.clear
7
8
  @nodes.clear
9
+ @watched_files.clear
8
10
  end
9
11
 
10
12
  def initialize(env)
@@ -19,6 +21,12 @@ class Puppet::Resource::TypeCollection
19
21
  @watched_files = {}
20
22
  end
21
23
 
24
+ def import_ast(ast, modname)
25
+ ast.instantiate(modname).each do |instance|
26
+ add(instance)
27
+ end
28
+ end
29
+
22
30
  def inspect
23
31
  "TypeCollection" + { :hostclasses => @hostclasses.keys, :definitions => @definitions.keys, :nodes => @nodes.keys }.inspect
24
32
  end
@@ -96,50 +104,8 @@ class Puppet::Resource::TypeCollection
96
104
  @definitions[munge_name(name)]
97
105
  end
98
106
 
99
- def find(namespaces, name, type)
100
- #Array("") == [] for some reason
101
- namespaces = [namespaces] unless namespaces.is_a?(Array)
102
-
103
- if name =~ /^::/
104
- return send(type, name.sub(/^::/, ''))
105
- end
106
-
107
- namespaces.each do |namespace|
108
- ary = namespace.split("::")
109
-
110
- while ary.length > 0
111
- tmp_namespace = ary.join("::")
112
- if r = find_partially_qualified(tmp_namespace, name, type)
113
- return r
114
- end
115
-
116
- # Delete the second to last object, which reduces our namespace by one.
117
- ary.pop
118
- end
119
-
120
- if result = send(type, name)
121
- return result
122
- end
123
- end
124
- nil
125
- end
126
-
127
- def find_or_load(namespaces, name, type)
128
- name = name.downcase
129
- namespaces = [namespaces] unless namespaces.is_a?(Array)
130
- namespaces = namespaces.collect { |ns| ns.downcase }
131
-
132
- # This could be done in the load_until, but the knowledge seems to
133
- # belong here.
134
- if r = find(namespaces, name, type)
135
- return r
136
- end
137
-
138
- loader.load_until(namespaces, name) { find(namespaces, name, type) }
139
- end
140
-
141
107
  def find_node(namespaces, name)
142
- find("", name, :node)
108
+ @nodes[munge_name(name)]
143
109
  end
144
110
 
145
111
  def find_hostclass(namespaces, name)
@@ -156,24 +122,6 @@ class Puppet::Resource::TypeCollection
156
122
  end
157
123
  end
158
124
 
159
- def perform_initial_import
160
- parser = Puppet::Parser::Parser.new(environment)
161
- if code = Puppet.settings.uninterpolated_value(:code, environment.to_s) and code != ""
162
- parser.string = code
163
- else
164
- file = Puppet.settings.value(:manifest, environment.to_s)
165
- parser.file = file
166
- end
167
- parser.parse
168
- rescue => detail
169
- @parse_failed = true
170
-
171
- msg = "Could not parse for environment #{environment}: #{detail}"
172
- error = Puppet::Error.new(msg)
173
- error.set_backtrace(detail.backtrace)
174
- raise error
175
- end
176
-
177
125
  def require_reparse?
178
126
  @parse_failed || stale?
179
127
  end
@@ -206,8 +154,52 @@ class Puppet::Resource::TypeCollection
206
154
 
207
155
  private
208
156
 
209
- def find_partially_qualified(namespace, name, type)
210
- send(type, [namespace, name].join("::"))
157
+ # Return a list of all possible fully-qualified names that might be
158
+ # meant by the given name, in the context of namespaces.
159
+ def resolve_namespaces(namespaces, name)
160
+ name = name.downcase
161
+ if name =~ /^::/
162
+ # name is explicitly fully qualified, so just return it, sans
163
+ # initial "::".
164
+ return [name.sub(/^::/, '')]
165
+ end
166
+ if name == ""
167
+ # The name "" has special meaning--it always refers to a "main"
168
+ # hostclass which contains all toplevel resources.
169
+ return [""]
170
+ end
171
+
172
+ namespaces = [namespaces] unless namespaces.is_a?(Array)
173
+ namespaces = namespaces.collect { |ns| ns.downcase }
174
+
175
+ result = []
176
+ namespaces.each do |namespace|
177
+ ary = namespace.split("::")
178
+
179
+ # Search each namespace nesting in innermost-to-outermost order.
180
+ while ary.length > 0
181
+ result << "#{ary.join("::")}::#{name}"
182
+ ary.pop
183
+ end
184
+
185
+ # Finally, search the toplevel namespace.
186
+ result << name
187
+ end
188
+
189
+ return result.uniq
190
+ end
191
+
192
+ # Resolve namespaces and find the given object. Autoload it if
193
+ # necessary.
194
+ def find_or_load(namespaces, name, type)
195
+ resolve_namespaces(namespaces, name).each do |fqname|
196
+ if result = send(type, fqname) || loader.try_load_fqname(type, fqname)
197
+ return result
198
+ end
199
+ end
200
+
201
+ # Nothing found.
202
+ return nil
211
203
  end
212
204
 
213
205
  def munge_name(name)
@@ -1,133 +1,48 @@
1
- # Created by Luke A. Kanies on 2007-11-07.
2
- # Copyright (c) 2007. All rights reserved.
3
-
4
1
  require 'puppet/external/dot'
5
2
  require 'puppet/relationship'
6
3
  require 'set'
7
4
 
8
5
  # A hopefully-faster graph class to replace the use of GRATR.
9
6
  class Puppet::SimpleGraph
10
- # An internal class for handling a vertex's edges.
11
- class VertexWrapper
12
- attr_accessor :in, :out, :vertex
13
-
14
- # Remove all references to everything.
15
- def clear
16
- @adjacencies[:in].clear
17
- @adjacencies[:out].clear
18
- @vertex = nil
19
- end
20
-
21
- def initialize(vertex)
22
- @vertex = vertex
23
- @adjacencies = {:in => {}, :out => {}}
24
- end
25
-
26
- # Find adjacent vertices or edges.
27
- def adjacent(options)
28
- direction = options[:direction] || :out
29
- options[:type] ||= :vertices
30
-
31
- return send(direction.to_s + "_edges") if options[:type] == :edges
32
-
33
- @adjacencies[direction].keys.reject { |vertex| @adjacencies[direction][vertex].empty? }
34
- end
35
-
36
- # Add an edge to our list.
37
- def add_edge(direction, edge)
38
- opposite_adjacencies(direction, edge) << edge
39
- end
40
-
41
- # Return all known edges.
42
- def edges
43
- in_edges + out_edges
44
- end
45
-
46
- # Test whether we share an edge with a given vertex.
47
- def has_edge?(direction, vertex)
48
- return(vertex_adjacencies(direction, vertex).length > 0 ? true : false)
49
- end
50
-
51
- # Create methods for returning the degree and edges.
52
- [:in, :out].each do |direction|
53
- # LAK:NOTE If you decide to create methods for directly
54
- # testing the degree, you'll have to get the values and flatten
55
- # the results -- you might have duplicate edges, which can give
56
- # a false impression of what the degree is. That's just
57
- # as expensive as just getting the edge list, so I've decided
58
- # to only add this method.
59
- define_method("#{direction}_edges") do
60
- @adjacencies[direction].values.inject([]) { |total, adjacent| total += adjacent.to_a; total }
61
- end
62
- end
63
-
64
- # The other vertex in the edge.
65
- def other_vertex(direction, edge)
66
- case direction
67
- when :in; edge.source
68
- else
69
- edge.target
70
- end
71
- end
72
-
73
- # Remove an edge from our list. Assumes that we've already checked
74
- # that the edge is valid.
75
- def remove_edge(direction, edge)
76
- opposite_adjacencies(direction, edge).delete(edge)
77
- end
78
-
79
- def to_s
80
- vertex.to_s
81
- end
82
-
83
- def inspect
84
- { :@adjacencies => @adjacencies, :@vertex => @vertex.to_s }.inspect
85
- end
86
-
87
- private
88
-
89
- # These methods exist so we don't need a Hash with a default proc.
90
-
91
- # Look up the adjacencies for a vertex at the other end of an
92
- # edge.
93
- def opposite_adjacencies(direction, edge)
94
- opposite_vertex = other_vertex(direction, edge)
95
- vertex_adjacencies(direction, opposite_vertex)
96
- end
97
-
98
- # Look up the adjacencies for a given vertex.
99
- def vertex_adjacencies(direction, vertex)
100
- @adjacencies[direction][vertex] ||= Set.new
101
- @adjacencies[direction][vertex]
102
- end
103
- end
104
-
7
+ #
8
+ # All public methods of this class must maintain (assume ^ ensure) the following invariants, where "=~=" means
9
+ # equiv. up to order:
10
+ #
11
+ # @in_to.keys =~= @out_to.keys =~= all vertices
12
+ # @in_to.values.collect { |x| x.values }.flatten =~= @out_from.values.collect { |x| x.values }.flatten =~= all edges
13
+ # @in_to[v1][v2] =~= @out_from[v2][v1] =~= all edges from v1 to v2
14
+ # @in_to [v].keys =~= vertices with edges leading to v
15
+ # @out_from[v].keys =~= vertices with edges leading from v
16
+ # no operation may shed reference loops (for gc)
17
+ # recursive operation must scale with the depth of the spanning trees, or better (e.g. no recursion over the set
18
+ # of all vertices, etc.)
19
+ #
20
+ # This class is intended to be used with DAGs. However, if the
21
+ # graph has a cycle, it will not cause non-termination of any of the
22
+ # algorithms.
23
+ #
105
24
  def initialize
106
- @vertices = {}
107
- @edges = []
25
+ @in_to = {}
26
+ @out_from = {}
27
+ @upstream_from = {}
28
+ @downstream_from = {}
108
29
  end
109
30
 
110
31
  # Clear our graph.
111
32
  def clear
112
- @vertices.each { |vertex, wrapper| wrapper.clear }
113
- @vertices.clear
114
- @edges.clear
115
- end
116
-
117
- # Which resources a given resource depends upon.
118
- def dependents(resource)
119
- tree_from_vertex(resource).keys
33
+ @in_to.clear
34
+ @out_from.clear
35
+ @upstream_from.clear
36
+ @downstream_from.clear
120
37
  end
121
38
 
122
39
  # Which resources depend upon the given resource.
123
40
  def dependencies(resource)
124
- # Cache the reversal graph, because it's somewhat expensive
125
- # to create.
126
- @reversal ||= reversal
127
- # Strangely, it's significantly faster to search a reversed
128
- # tree in the :out direction than to search a normal tree
129
- # in the :in direction.
130
- @reversal.tree_from_vertex(resource, :out).keys
41
+ vertex?(resource) ? upstream_from_vertex(resource).keys : []
42
+ end
43
+
44
+ def dependents(resource)
45
+ vertex?(resource) ? downstream_from_vertex(resource).keys : []
131
46
  end
132
47
 
133
48
  # Whether our graph is directed. Always true. Used to produce dot files.
@@ -137,8 +52,7 @@ class Puppet::SimpleGraph
137
52
 
138
53
  # Determine all of the leaf nodes below a given vertex.
139
54
  def leaves(vertex, direction = :out)
140
- tree = tree_from_vertex(vertex, direction)
141
- l = tree.keys.find_all { |c| adjacent(c, :direction => direction).empty? }
55
+ tree_from_vertex(vertex, direction).keys.find_all { |c| adjacent(c, :direction => direction).empty? }
142
56
  end
143
57
 
144
58
  # Collect all of the edges that the passed events match. Returns
@@ -153,9 +67,7 @@ class Puppet::SimpleGraph
153
67
  # Get all of the edges that this vertex should forward events
154
68
  # to, which is the same thing as saying all edges directly below
155
69
  # This vertex in the graph.
156
- adjacent(source, :direction => :out, :type => :edges).find_all do |edge|
157
- edge.match?(event.name)
158
- end
70
+ @out_from[source].values.flatten.find_all { |edge| edge.match?(event.name) }
159
71
  end
160
72
 
161
73
  # Return a reversed version of this graph.
@@ -163,197 +75,268 @@ class Puppet::SimpleGraph
163
75
  result = self.class.new
164
76
  vertices.each { |vertex| result.add_vertex(vertex) }
165
77
  edges.each do |edge|
166
- newedge = edge.class.new(edge.target, edge.source, edge.label)
167
- result.add_edge(newedge)
78
+ result.add_edge edge.class.new(edge.target, edge.source, edge.label)
168
79
  end
169
80
  result
170
81
  end
171
82
 
172
83
  # Return the size of the graph.
173
84
  def size
174
- @vertices.length
85
+ vertices.size
175
86
  end
176
87
 
177
- # Return the graph as an array.
178
88
  def to_a
179
- @vertices.keys
89
+ vertices
90
+ end
91
+
92
+ # This is a simple implementation of Tarjan's algorithm to find strongly
93
+ # connected components in the graph; this is a fairly ugly implementation,
94
+ # because I can't just decorate the vertices themselves.
95
+ #
96
+ # This method has an unhealthy relationship with the find_cycles_in_graph
97
+ # method below, which contains the knowledge of how the state object is
98
+ # maintained.
99
+ def tarjan(root, s)
100
+ # initialize the recursion stack we use to work around the nasty lack of a
101
+ # decent Ruby stack.
102
+ recur = [{ :node => root }]
103
+
104
+ while not recur.empty? do
105
+ frame = recur.last
106
+ vertex = frame[:node]
107
+
108
+ case frame[:step]
109
+ when nil then
110
+ s[:index][vertex] = s[:number]
111
+ s[:lowlink][vertex] = s[:number]
112
+ s[:number] = s[:number] + 1
113
+
114
+ s[:stack].push(vertex)
115
+ s[:seen][vertex] = true
116
+
117
+ frame[:children] = adjacent(vertex)
118
+ frame[:step] = :children
119
+
120
+ when :children then
121
+ if frame[:children].length > 0 then
122
+ child = frame[:children].shift
123
+ if ! s[:index][child] then
124
+ # Never seen, need to recurse.
125
+ frame[:step] = :after_recursion
126
+ frame[:child] = child
127
+ recur.push({ :node => child })
128
+ elsif s[:seen][child] then
129
+ s[:lowlink][vertex] = [s[:lowlink][vertex], s[:index][child]].min
130
+ end
131
+ else
132
+ if s[:lowlink][vertex] == s[:index][vertex] then
133
+ this_scc = []
134
+ begin
135
+ top = s[:stack].pop
136
+ s[:seen][top] = false
137
+ this_scc << top
138
+ end until top == vertex
139
+ # NOTE: if we don't reverse we get the components in the opposite
140
+ # order to what a human being would expect; reverse should be an
141
+ # O(1) operation, without even copying, because we know the length
142
+ # of the source, but I worry that an implementation will get this
143
+ # wrong. Still, the worst case is O(n) for n vertices as we can't
144
+ # possibly put a vertex into two SCCs.
145
+ #
146
+ # Also, my feeling is that most implementations are going to do
147
+ # better with a reverse operation than a string of 'unshift'
148
+ # insertions at the head of the array; if they were going to mess
149
+ # up the performance of one, it would be unshift.
150
+ s[:scc] << this_scc.reverse
151
+ end
152
+ recur.pop # done with this node, finally.
153
+ end
154
+
155
+ when :after_recursion then
156
+ s[:lowlink][vertex] = [s[:lowlink][vertex], s[:lowlink][frame[:child]]].min
157
+ frame[:step] = :children
158
+
159
+ else
160
+ fail "#{frame[:step]} is an unknown step"
161
+ end
162
+ end
180
163
  end
181
164
 
182
- # Provide a topological sort.
183
- def topsort
184
- degree = {}
185
- zeros = []
186
- result = []
165
+ # Find all cycles in the graph by detecting all the strongly connected
166
+ # components, then eliminating everything with a size of one as
167
+ # uninteresting - which it is, because it can't be a cycle. :)
168
+ #
169
+ # This has an unhealthy relationship with the 'tarjan' method above, which
170
+ # it uses to implement the detection of strongly connected components.
171
+ def find_cycles_in_graph
172
+ state = {
173
+ :number => 0, :index => {}, :lowlink => {}, :scc => [],
174
+ :stack => [], :seen => {}
175
+ }
176
+
177
+ # we usually have a disconnected graph, must walk all possible roots
178
+ vertices.each do |vertex|
179
+ if ! state[:index][vertex] then
180
+ tarjan vertex, state
181
+ end
182
+ end
183
+
184
+ state[:scc].select { |c| c.length > 1 }
185
+ end
187
186
 
188
- # Collect each of our vertices, with the number of in-edges each has.
189
- @vertices.each do |name, wrapper|
190
- edges = wrapper.in_edges
191
- zeros << wrapper if edges.length == 0
192
- degree[wrapper.vertex] = edges
187
+ # Perform a BFS on the sub graph representing the cycle, with a view to
188
+ # generating a sufficient set of paths to report the cycle meaningfully, and
189
+ # ideally usefully, for the end user.
190
+ #
191
+ # BFS is preferred because it will generally report the shortest paths
192
+ # through the graph first, which are more likely to be interesting to the
193
+ # user. I think; it would be interesting to verify that. --daniel 2011-01-23
194
+ def paths_in_cycle(cycle, max_paths = 1)
195
+ raise ArgumentError, "negative or zero max_paths" if max_paths < 1
196
+
197
+ # Calculate our filtered outbound vertex lists...
198
+ adj = {}
199
+ cycle.each do |vertex|
200
+ adj[vertex] = adjacent(vertex).select{|s| cycle.member? s}
193
201
  end
194
202
 
195
- # Iterate over each 0-degree vertex, decrementing the degree of
196
- # each of its out-edges.
197
- while wrapper = zeros.pop
198
- result << wrapper.vertex
199
- wrapper.out_edges.each do |edge|
200
- degree[edge.target].delete(edge)
201
- zeros << @vertices[edge.target] if degree[edge.target].length == 0
203
+ found = []
204
+
205
+ # frame struct is vertex, [path]
206
+ stack = [[cycle.first, []]]
207
+ while frame = stack.shift do
208
+ if frame[1].member?(frame[0]) then
209
+ found << frame[1] + [frame[0]]
210
+ break if found.length >= max_paths
211
+ else
212
+ adj[frame[0]].each do |to|
213
+ stack.push [to, frame[1] + [frame[0]]]
214
+ end
202
215
  end
203
216
  end
204
217
 
205
- # If we have any vertices left with non-zero in-degrees, then we've found a cycle.
206
- if cycles = degree.find_all { |vertex, edges| edges.length > 0 } and cycles.length > 0
207
- message = cycles.collect { |vertex, edges| edges.collect { |e| e.to_s }.join(", ") }.join(", ")
208
- raise Puppet::Error, "Found dependency cycles in the following relationships: #{message}; try using the '--graph' option and open the '.dot' files in OmniGraffle or GraphViz"
218
+ return found
219
+ end
220
+
221
+ def report_cycles_in_graph
222
+ cycles = find_cycles_in_graph
223
+ n = cycles.length # where is "pluralize"? --daniel 2011-01-22
224
+ return if n == 0
225
+ s = n == 1 ? '' : 's'
226
+
227
+ message = "Found #{n} dependency cycle#{s}:\n"
228
+ cycles.each do |cycle|
229
+ paths = paths_in_cycle(cycle)
230
+ message += paths.map{ |path| '(' + path.join(" => ") + ')'}.join("\n") + "\n"
209
231
  end
210
232
 
211
- result
233
+ if Puppet[:graph] then
234
+ filename = write_cycles_to_graph(cycles)
235
+ message += "Cycle graph written to #{filename}."
236
+ else
237
+ message += "Try the '--graph' option and opening the "
238
+ message += "resulting '.dot' file in OmniGraffle or GraphViz"
239
+ end
240
+
241
+ raise Puppet::Error, message
242
+ end
243
+
244
+ def write_cycles_to_graph(cycles)
245
+ # This does not use the DOT graph library, just writes the content
246
+ # directly. Given the complexity of this, there didn't seem much point
247
+ # using a heavy library to generate exactly the same content. --daniel 2011-01-27
248
+ Puppet.settings.use(:graphing)
249
+
250
+ graph = ["digraph Resource_Cycles {"]
251
+ graph << ' label = "Resource Cycles"'
252
+
253
+ cycles.each do |cycle|
254
+ paths_in_cycle(cycle, 10).each do |path|
255
+ graph << path.map { |v| '"' + v.to_s.gsub(/"/, '\\"') + '"' }.join(" -> ")
256
+ end
257
+ end
258
+
259
+ graph << '}'
260
+
261
+ filename = File.join(Puppet[:graphdir], "cycles.dot")
262
+ File.open(filename, "w") { |f| f.puts graph }
263
+ return filename
212
264
  end
213
265
 
214
266
  # Add a new vertex to the graph.
215
267
  def add_vertex(vertex)
216
- @reversal = nil
217
- return false if vertex?(vertex)
218
- setup_vertex(vertex)
219
- true # don't return the VertexWrapper instance.
268
+ @in_to[vertex] ||= {}
269
+ @out_from[vertex] ||= {}
220
270
  end
221
271
 
222
272
  # Remove a vertex from the graph.
223
- def remove_vertex!(vertex)
224
- return nil unless vertex?(vertex)
225
- @vertices[vertex].edges.each { |edge| remove_edge!(edge) }
226
- @edges -= @vertices[vertex].edges
227
- @vertices[vertex].clear
228
- @vertices.delete(vertex)
273
+ def remove_vertex!(v)
274
+ return unless vertex?(v)
275
+ @upstream_from.clear
276
+ @downstream_from.clear
277
+ (@in_to[v].values+@out_from[v].values).flatten.each { |e| remove_edge!(e) }
278
+ @in_to.delete(v)
279
+ @out_from.delete(v)
229
280
  end
230
281
 
231
282
  # Test whether a given vertex is in the graph.
232
- def vertex?(vertex)
233
- @vertices.include?(vertex)
283
+ def vertex?(v)
284
+ @in_to.include?(v)
234
285
  end
235
286
 
236
287
  # Return a list of all vertices.
237
288
  def vertices
238
- @vertices.keys
289
+ @in_to.keys
239
290
  end
240
291
 
241
292
  # Add a new edge. The graph user has to create the edge instance,
242
293
  # since they have to specify what kind of edge it is.
243
- def add_edge(source, target = nil, label = nil)
244
- @reversal = nil
245
- if target
246
- edge = Puppet::Relationship.new(source, target, label)
247
- else
248
- edge = source
249
- end
250
- [edge.source, edge.target].each { |vertex| setup_vertex(vertex) unless vertex?(vertex) }
251
- @vertices[edge.source].add_edge :out, edge
252
- @vertices[edge.target].add_edge :in, edge
253
- @edges << edge
254
- true
294
+ def add_edge(e,*a)
295
+ return add_relationship(e,*a) unless a.empty?
296
+ @upstream_from.clear
297
+ @downstream_from.clear
298
+ add_vertex(e.source)
299
+ add_vertex(e.target)
300
+ @in_to[ e.target][e.source] ||= []; @in_to[ e.target][e.source] |= [e]
301
+ @out_from[e.source][e.target] ||= []; @out_from[e.source][e.target] |= [e]
255
302
  end
256
303
 
257
- # Find a matching edge. Note that this only finds the first edge,
258
- # not all of them or whatever.
259
- def edge(source, target)
260
- @edges.each_with_index { |test_edge, index| return test_edge if test_edge.source == source and test_edge.target == target }
304
+ def add_relationship(source, target, label = nil)
305
+ add_edge Puppet::Relationship.new(source, target, label)
261
306
  end
262
307
 
263
- def edge_label(source, target)
264
- return nil unless edge = edge(source, target)
265
- edge.label
308
+ # Find all matching edges.
309
+ def edges_between(source, target)
310
+ (@out_from[source] || {})[target] || []
266
311
  end
267
312
 
268
313
  # Is there an edge between the two vertices?
269
314
  def edge?(source, target)
270
- return false unless vertex?(source) and vertex?(target)
271
-
272
- @vertices[source].has_edge?(:out, target)
315
+ vertex?(source) and vertex?(target) and @out_from[source][target]
273
316
  end
274
317
 
275
318
  def edges
276
- @edges.dup
319
+ @in_to.values.collect { |x| x.values }.flatten
277
320
  end
278
321
 
279
- # Remove an edge from our graph.
280
- def remove_edge!(edge)
281
- @vertices[edge.source].remove_edge(:out, edge)
282
- @vertices[edge.target].remove_edge(:in, edge)
322
+ def each_edge
323
+ @in_to.each { |t,ns| ns.each { |s,es| es.each { |e| yield e }}}
324
+ end
283
325
 
284
- @edges.delete(edge)
285
- nil
326
+ # Remove an edge from our graph.
327
+ def remove_edge!(e)
328
+ if edge?(e.source,e.target)
329
+ @upstream_from.clear
330
+ @downstream_from.clear
331
+ @in_to [e.target].delete e.source if (@in_to [e.target][e.source] -= [e]).empty?
332
+ @out_from[e.source].delete e.target if (@out_from[e.source][e.target] -= [e]).empty?
333
+ end
286
334
  end
287
335
 
288
336
  # Find adjacent edges.
289
- def adjacent(vertex, options = {})
290
- return [] unless wrapper = @vertices[vertex]
291
- wrapper.adjacent(options)
292
- end
293
-
294
- private
295
-
296
- # An internal method that skips the validation, so we don't have
297
- # duplicate validation calls.
298
- def setup_vertex(vertex)
299
- @vertices[vertex] = VertexWrapper.new(vertex)
300
- end
301
-
302
- public
303
-
304
- # # For some reason, unconnected vertices do not show up in
305
- # # this graph.
306
- # def to_jpg(path, name)
307
- # gv = vertices
308
- # Dir.chdir(path) do
309
- # induced_subgraph(gv).write_to_graphic_file('jpg', name)
310
- # end
311
- # end
312
-
313
- # Take container information from another graph and use it
314
- # to replace any container vertices with their respective leaves.
315
- # This creates direct relationships where there were previously
316
- # indirect relationships through the containers.
317
- def splice!(other, type)
318
- # We have to get the container list via a topological sort on the
319
- # configuration graph, because otherwise containers that contain
320
- # other containers will add those containers back into the
321
- # graph. We could get a similar affect by only setting relationships
322
- # to container leaves, but that would result in many more
323
- # relationships.
324
- stage_class = Puppet::Type.type(:stage)
325
- whit_class = Puppet::Type.type(:whit)
326
- containers = other.topsort.find_all { |v| (v.is_a?(type) or v.is_a?(stage_class)) and vertex?(v) }
327
- containers.each do |container|
328
- # Get the list of children from the other graph.
329
- children = other.adjacent(container, :direction => :out)
330
-
331
- # MQR TODO: Luke suggests that it should be possible to refactor the system so that
332
- # container nodes are retained, thus obviating the need for the whit.
333
- children = [whit_class.new(:name => container.name, :catalog => other)] if children.empty?
334
-
335
- # First create new edges for each of the :in edges
336
- [:in, :out].each do |dir|
337
- edges = adjacent(container, :direction => dir, :type => :edges)
338
- edges.each do |edge|
339
- children.each do |child|
340
- if dir == :in
341
- s = edge.source
342
- t = child
343
- else
344
- s = child
345
- t = edge.target
346
- end
347
-
348
- add_edge(s, t, edge.label)
349
- end
350
-
351
- # Now get rid of the edge, so remove_vertex! works correctly.
352
- remove_edge!(edge)
353
- end
354
- end
355
- remove_vertex!(container)
356
- end
337
+ def adjacent(v, options = {})
338
+ return [] unless ns = (options[:direction] == :in) ? @in_to[v] : @out_from[v]
339
+ (options[:type] == :edges) ? ns.values.flatten : ns.keys
357
340
  end
358
341
 
359
342
  # Just walk the tree and pass each edge.
@@ -385,6 +368,60 @@ class Puppet::SimpleGraph
385
368
  predecessor
386
369
  end
387
370
 
371
+ def downstream_from_vertex(v)
372
+ return @downstream_from[v] if @downstream_from[v]
373
+ result = @downstream_from[v] = {}
374
+ @out_from[v].keys.each do |node|
375
+ result[node] = 1
376
+ result.update(downstream_from_vertex(node))
377
+ end
378
+ result
379
+ end
380
+
381
+ def direct_dependents_of(v)
382
+ (@out_from[v] || {}).keys
383
+ end
384
+
385
+ def upstream_from_vertex(v)
386
+ return @upstream_from[v] if @upstream_from[v]
387
+ result = @upstream_from[v] = {}
388
+ @in_to[v].keys.each do |node|
389
+ result[node] = 1
390
+ result.update(upstream_from_vertex(node))
391
+ end
392
+ result
393
+ end
394
+
395
+ def direct_dependencies_of(v)
396
+ (@in_to[v] || {}).keys
397
+ end
398
+
399
+ # Return an array of the edge-sets between a series of n+1 vertices (f=v0,v1,v2...t=vn)
400
+ # connecting the two given verticies. The ith edge set is an array containing all the
401
+ # edges between v(i) and v(i+1); these are (by definition) never empty.
402
+ #
403
+ # * if f == t, the list is empty
404
+ # * if they are adjacent the result is an array consisting of
405
+ # a single array (the edges from f to t)
406
+ # * and so on by induction on a vertex m between them
407
+ # * if there is no path from f to t, the result is nil
408
+ #
409
+ # This implementation is not particularly efficient; it's used in testing where clarity
410
+ # is more important than last-mile efficiency.
411
+ #
412
+ def path_between(f,t)
413
+ if f==t
414
+ []
415
+ elsif direct_dependents_of(f).include?(t)
416
+ [edges_between(f,t)]
417
+ elsif dependents(f).include?(t)
418
+ m = (dependents(f) & direct_dependencies_of(t)).first
419
+ path_between(f,m) + path_between(m,t)
420
+ else
421
+ nil
422
+ end
423
+ end
424
+
388
425
  # LAK:FIXME This is just a paste of the GRATR code with slight modifications.
389
426
 
390
427
  # Return a DOT::DOTDigraph for directed graphs or a DOT::DOTSubgraph for an
@@ -426,18 +463,6 @@ class Puppet::SimpleGraph
426
463
  system('dotty', dotfile)
427
464
  end
428
465
 
429
- # Use +dot+ to create a graphical representation of the graph. Returns the
430
- # filename of the graphics file.
431
- def write_to_graphic_file (fmt='png', dotfile='graph')
432
- src = dotfile + '.dot'
433
- dot = dotfile + '.' + fmt
434
-
435
- File.open(src, 'w') {|f| f << self.to_dot << "\n"}
436
-
437
- system( "dot -T#{fmt} #{src} -o #{dot}" )
438
- dot
439
- end
440
-
441
466
  # Produce the graph files if requested.
442
467
  def write_graph(name)
443
468
  return unless Puppet[:graph]
@@ -449,4 +474,80 @@ class Puppet::SimpleGraph
449
474
  f.puts to_dot("name" => name.to_s.capitalize)
450
475
  }
451
476
  end
477
+
478
+ # This flag may be set to true to use the new YAML serialzation
479
+ # format (where @vertices is a simple list of vertices rather than a
480
+ # list of VertexWrapper objects). Deserialization supports both
481
+ # formats regardless of the setting of this flag.
482
+ class << self
483
+ attr_accessor :use_new_yaml_format
484
+ end
485
+ self.use_new_yaml_format = false
486
+
487
+ # Stub class to allow graphs to be represented in YAML using the old
488
+ # (version 2.6) format.
489
+ class VertexWrapper
490
+ attr_reader :vertex, :adjacencies
491
+ def initialize(vertex, adjacencies)
492
+ @vertex = vertex
493
+ @adjacencies = adjacencies
494
+ end
495
+
496
+ def inspect
497
+ { :@adjacencies => @adjacencies, :@vertex => @vertex.to_s }.inspect
498
+ end
499
+ end
500
+
501
+ # instance_variable_get is used by Object.to_zaml to get instance
502
+ # variables. Override it so that we can simulate the presence of
503
+ # instance variables @edges and @vertices for serialization.
504
+ def instance_variable_get(v)
505
+ case v.to_s
506
+ when '@edges' then
507
+ edges
508
+ when '@vertices' then
509
+ if self.class.use_new_yaml_format
510
+ vertices
511
+ else
512
+ result = {}
513
+ vertices.each do |vertex|
514
+ adjacencies = {}
515
+ [:in, :out].each do |direction|
516
+ adjacencies[direction] = {}
517
+ adjacent(vertex, :direction => direction, :type => :edges).each do |edge|
518
+ other_vertex = direction == :in ? edge.source : edge.target
519
+ (adjacencies[direction][other_vertex] ||= Set.new).add(edge)
520
+ end
521
+ end
522
+ result[vertex] = Puppet::SimpleGraph::VertexWrapper.new(vertex, adjacencies)
523
+ end
524
+ result
525
+ end
526
+ else
527
+ super(v)
528
+ end
529
+ end
530
+
531
+ def to_yaml_properties
532
+ other_vars = instance_variables.
533
+ map {|v| v.to_s}.
534
+ reject { |v| %w{@in_to @out_from @upstream_from @downstream_from}.include?(v) }
535
+
536
+ (other_vars + %w{@vertices @edges}).sort.uniq
537
+ end
538
+
539
+ def yaml_initialize(tag, var)
540
+ initialize()
541
+ vertices = var.delete('vertices')
542
+ edges = var.delete('edges')
543
+ if vertices.is_a?(Hash)
544
+ # Support old (2.6) format
545
+ vertices = vertices.keys
546
+ end
547
+ vertices.each { |v| add_vertex(v) }
548
+ edges.each { |e| add_edge(e) }
549
+ var.each do |varname, value|
550
+ instance_variable_set("@#{varname}", value)
551
+ end
552
+ end
452
553
  end