puppet 0.24.6 → 0.24.7

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 (383) hide show
  1. data/CHANGELOG +115 -0
  2. data/Rakefile +43 -14
  3. data/bin/puppetca +6 -5
  4. data/bin/puppetdoc +109 -15
  5. data/bin/ralsh +3 -1
  6. data/conf/redhat/puppet.spec +74 -48
  7. data/examples/mcx_dock_absent.pp +4 -0
  8. data/examples/mcx_dock_default.pp +118 -0
  9. data/examples/mcx_dock_full.pp +125 -0
  10. data/examples/mcx_dock_invalid.pp +9 -0
  11. data/examples/mcx_nogroup.pp +118 -0
  12. data/examples/mcx_notexists_absent.pp +4 -0
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/lib/puppet.rb +1 -1
  15. data/lib/puppet/external/nagios/base.rb +114 -71
  16. data/lib/puppet/feature/base.rb +6 -0
  17. data/lib/puppet/indirector/yaml.rb +12 -3
  18. data/lib/puppet/module.rb +1 -1
  19. data/lib/puppet/network/client/master.rb +1 -1
  20. data/lib/puppet/network/xmlrpc/client.rb +3 -1
  21. data/lib/puppet/parameter.rb +1 -1
  22. data/lib/puppet/parser/ast.rb +15 -0
  23. data/lib/puppet/parser/ast/astarray.rb +1 -2
  24. data/lib/puppet/parser/ast/casestatement.rb +2 -0
  25. data/lib/puppet/parser/ast/collection.rb +2 -0
  26. data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
  27. data/lib/puppet/parser/ast/definition.rb +2 -0
  28. data/lib/puppet/parser/ast/else.rb +3 -0
  29. data/lib/puppet/parser/ast/function.rb +19 -12
  30. data/lib/puppet/parser/ast/hostclass.rb +9 -1
  31. data/lib/puppet/parser/ast/ifstatement.rb +3 -0
  32. data/lib/puppet/parser/ast/node.rb +3 -0
  33. data/lib/puppet/parser/ast/resource.rb +3 -0
  34. data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
  35. data/lib/puppet/parser/ast/resource_override.rb +3 -0
  36. data/lib/puppet/parser/ast/vardef.rb +3 -0
  37. data/lib/puppet/parser/functions.rb +14 -0
  38. data/lib/puppet/parser/functions/inline_template.rb +21 -0
  39. data/lib/puppet/parser/functions/template.rb +3 -2
  40. data/lib/puppet/parser/lexer.rb +56 -7
  41. data/lib/puppet/parser/parser.rb +114 -98
  42. data/lib/puppet/parser/parser_support.rb +24 -4
  43. data/lib/puppet/parser/resource/reference.rb +4 -3
  44. data/lib/puppet/parser/templatewrapper.rb +30 -22
  45. data/lib/puppet/property.rb +1 -1
  46. data/lib/puppet/property/list.rb +7 -2
  47. data/lib/puppet/property/ordered_list.rb +22 -0
  48. data/lib/puppet/provider/augeas/augeas.rb +189 -0
  49. data/lib/puppet/provider/computer/computer.rb +22 -0
  50. data/lib/puppet/provider/confine.rb +4 -1
  51. data/lib/puppet/provider/confine/variable.rb +13 -2
  52. data/lib/puppet/provider/confine_collection.rb +4 -1
  53. data/lib/puppet/provider/confiner.rb +1 -1
  54. data/lib/puppet/provider/group/directoryservice.rb +6 -3
  55. data/lib/puppet/provider/group/groupadd.rb +5 -2
  56. data/lib/puppet/provider/group/ldap.rb +11 -9
  57. data/lib/puppet/provider/group/netinfo.rb +8 -4
  58. data/lib/puppet/provider/group/pw.rb +5 -1
  59. data/lib/puppet/provider/host/netinfo.rb +5 -2
  60. data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
  61. data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
  62. data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
  63. data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
  64. data/lib/puppet/provider/package/appdmg.rb +0 -3
  65. data/lib/puppet/provider/package/apt.rb +6 -0
  66. data/lib/puppet/provider/package/rpm.rb +2 -0
  67. data/lib/puppet/provider/package/yum.rb +5 -1
  68. data/lib/puppet/provider/package/yumhelper.py +9 -0
  69. data/lib/puppet/provider/service/base.rb +9 -6
  70. data/lib/puppet/provider/service/daemontools.rb +25 -15
  71. data/lib/puppet/provider/service/debian.rb +6 -2
  72. data/lib/puppet/provider/service/freebsd.rb +5 -2
  73. data/lib/puppet/provider/service/gentoo.rb +6 -3
  74. data/lib/puppet/provider/service/init.rb +31 -21
  75. data/lib/puppet/provider/service/launchd.rb +195 -0
  76. data/lib/puppet/provider/service/redhat.rb +5 -2
  77. data/lib/puppet/provider/service/runit.rb +30 -20
  78. data/lib/puppet/provider/service/smf.rb +7 -4
  79. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
  80. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  81. data/lib/puppet/provider/user/netinfo.rb +9 -3
  82. data/lib/puppet/provider/user/user_role_add.rb +43 -6
  83. data/lib/puppet/provider/zfs/solaris.rb +45 -0
  84. data/lib/puppet/provider/zone/solaris.rb +8 -4
  85. data/lib/puppet/provider/zpool/solaris.rb +116 -0
  86. data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
  87. data/lib/puppet/rails/database/schema.rb +1 -0
  88. data/lib/puppet/rails/host.rb +4 -0
  89. data/lib/puppet/reference/configuration.rb +1 -1
  90. data/lib/puppet/reports/tagmail.rb +15 -6
  91. data/lib/puppet/transaction/change.rb +3 -5
  92. data/lib/puppet/transportable.rb +1 -0
  93. data/lib/puppet/type/augeas.rb +155 -0
  94. data/lib/puppet/type/computer.rb +62 -0
  95. data/lib/puppet/type/exec.rb +2 -1
  96. data/lib/puppet/type/file.rb +1 -1
  97. data/lib/puppet/type/file/ensure.rb +8 -5
  98. data/lib/puppet/type/file/mode.rb +0 -14
  99. data/lib/puppet/type/file/owner.rb +32 -64
  100. data/lib/puppet/type/file/selcontext.rb +3 -8
  101. data/lib/puppet/type/group.rb +27 -45
  102. data/lib/puppet/type/k5login.rb +1 -1
  103. data/lib/puppet/type/macauthorization.rb +141 -0
  104. data/lib/puppet/type/mcx.rb +115 -0
  105. data/lib/puppet/type/mount.rb +1 -1
  106. data/lib/puppet/type/nagios_hostdependency.rb +3 -0
  107. data/lib/puppet/type/ssh_authorized_key.rb +16 -0
  108. data/lib/puppet/type/tidy.rb +43 -14
  109. data/lib/puppet/type/user.rb +25 -1
  110. data/lib/puppet/type/zfs.rb +51 -0
  111. data/lib/puppet/type/zone.rb +8 -0
  112. data/lib/puppet/type/zpool.rb +93 -0
  113. data/lib/puppet/util.rb +17 -38
  114. data/lib/puppet/util/file_locking.rb +44 -0
  115. data/lib/puppet/util/filetype.rb +3 -3
  116. data/lib/puppet/util/log.rb +1 -16
  117. data/lib/puppet/util/metric.rb +0 -5
  118. data/lib/puppet/util/rdoc.rb +85 -0
  119. data/lib/puppet/util/rdoc/code_objects.rb +219 -0
  120. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
  121. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
  122. data/lib/puppet/util/rdoc/parser.rb +437 -0
  123. data/lib/puppet/util/selinux.rb +135 -63
  124. data/lib/puppet/util/settings.rb +136 -126
  125. data/lib/puppet/util/storage.rb +4 -2
  126. data/spec/Rakefile +91 -0
  127. data/spec/integration/checksum.rb +47 -0
  128. data/spec/integration/defaults.rb +47 -0
  129. data/spec/integration/file_serving/configuration.rb +43 -0
  130. data/spec/integration/file_serving/content.rb +18 -0
  131. data/spec/integration/file_serving/metadata.rb +18 -0
  132. data/spec/integration/indirector/direct_file_server.rb +80 -0
  133. data/spec/integration/indirector/file_content/file_server.rb +18 -0
  134. data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
  135. data/spec/integration/indirector/module_files.rb +57 -0
  136. data/spec/integration/indirector/node/ldap.rb +15 -0
  137. data/spec/integration/indirector/rest.rb +464 -0
  138. data/spec/integration/network/server/mongrel.rb +48 -0
  139. data/spec/integration/network/server/webrick.rb +48 -0
  140. data/spec/integration/node.rb +93 -0
  141. data/spec/integration/node/catalog.rb +54 -0
  142. data/spec/integration/node/facts.rb +45 -0
  143. data/spec/integration/provider/package.rb +26 -0
  144. data/spec/integration/provider/service/init.rb +32 -0
  145. data/spec/integration/reference/providers.rb +17 -0
  146. data/spec/integration/reports.rb +14 -0
  147. data/spec/integration/transaction/report.rb +26 -0
  148. data/spec/integration/type/package.rb +22 -0
  149. data/spec/integration/util/file_locking.rb +36 -0
  150. data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
  151. data/spec/monkey_patches/alias_should_to_must.rb +5 -0
  152. data/spec/shared_behaviours/file_server_terminus.rb +42 -0
  153. data/spec/shared_behaviours/file_serving.rb +64 -0
  154. data/spec/shared_behaviours/memory_terminus.rb +32 -0
  155. data/spec/spec.opts +5 -0
  156. data/spec/spec_helper.rb +36 -0
  157. data/spec/unit/executables/client/certhandler.rb +122 -0
  158. data/spec/unit/file_serving/configuration.rb +224 -0
  159. data/spec/unit/file_serving/configuration/parser.rb +135 -0
  160. data/spec/unit/file_serving/content.rb +71 -0
  161. data/spec/unit/file_serving/file_base.rb +124 -0
  162. data/spec/unit/file_serving/fileset.rb +239 -0
  163. data/spec/unit/file_serving/indirection_hooks.rb +124 -0
  164. data/spec/unit/file_serving/metadata.rb +187 -0
  165. data/spec/unit/file_serving/mount.rb +143 -0
  166. data/spec/unit/file_serving/terminus_helper.rb +76 -0
  167. data/spec/unit/indirector.rb +152 -0
  168. data/spec/unit/indirector/catalog/compiler.rb +156 -0
  169. data/spec/unit/indirector/catalog/yaml.rb +25 -0
  170. data/spec/unit/indirector/checksum/file.rb +139 -0
  171. data/spec/unit/indirector/code.rb +33 -0
  172. data/spec/unit/indirector/direct_file_server.rb +89 -0
  173. data/spec/unit/indirector/envelope.rb +47 -0
  174. data/spec/unit/indirector/exec.rb +51 -0
  175. data/spec/unit/indirector/facts/facter.rb +76 -0
  176. data/spec/unit/indirector/facts/yaml.rb +26 -0
  177. data/spec/unit/indirector/file.rb +154 -0
  178. data/spec/unit/indirector/file_content/file.rb +18 -0
  179. data/spec/unit/indirector/file_content/file_server.rb +18 -0
  180. data/spec/unit/indirector/file_content/modules.rb +18 -0
  181. data/spec/unit/indirector/file_content/rest.rb +11 -0
  182. data/spec/unit/indirector/file_metadata/file.rb +52 -0
  183. data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
  184. data/spec/unit/indirector/file_metadata/modules.rb +42 -0
  185. data/spec/unit/indirector/file_metadata/rest.rb +9 -0
  186. data/spec/unit/indirector/file_server.rb +184 -0
  187. data/spec/unit/indirector/indirection.rb +731 -0
  188. data/spec/unit/indirector/ldap.rb +143 -0
  189. data/spec/unit/indirector/memory.rb +29 -0
  190. data/spec/unit/indirector/module_files.rb +259 -0
  191. data/spec/unit/indirector/node/exec.rb +69 -0
  192. data/spec/unit/indirector/node/ldap.rb +424 -0
  193. data/spec/unit/indirector/node/memory.rb +19 -0
  194. data/spec/unit/indirector/node/plain.rb +19 -0
  195. data/spec/unit/indirector/node/rest.rb +13 -0
  196. data/spec/unit/indirector/node/yaml.rb +25 -0
  197. data/spec/unit/indirector/plain.rb +29 -0
  198. data/spec/unit/indirector/report/processor.rb +81 -0
  199. data/spec/unit/indirector/request.rb +87 -0
  200. data/spec/unit/indirector/rest.rb +372 -0
  201. data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
  202. data/spec/unit/indirector/terminus.rb +245 -0
  203. data/spec/unit/indirector/yaml.rb +145 -0
  204. data/spec/unit/module.rb +247 -0
  205. data/spec/unit/network/client.rb +45 -0
  206. data/spec/unit/network/client/master.rb +442 -0
  207. data/spec/unit/network/handler/fileserver.rb +179 -0
  208. data/spec/unit/network/http.rb +35 -0
  209. data/spec/unit/network/http/mongrel.rb +117 -0
  210. data/spec/unit/network/http/mongrel/rest.rb +377 -0
  211. data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
  212. data/spec/unit/network/http/webrick.rb +127 -0
  213. data/spec/unit/network/http/webrick/rest.rb +323 -0
  214. data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
  215. data/spec/unit/network/http_pool.rb +238 -0
  216. data/spec/unit/network/server.rb +316 -0
  217. data/spec/unit/network/xmlrpc/client.rb +13 -0
  218. data/spec/unit/node.rb +167 -0
  219. data/spec/unit/node/catalog.rb +864 -0
  220. data/spec/unit/node/environment.rb +37 -0
  221. data/spec/unit/node/facts.rb +44 -0
  222. data/spec/unit/other/checksum.rb +92 -0
  223. data/spec/unit/other/pgraph.rb +210 -0
  224. data/spec/unit/other/transaction.rb +33 -0
  225. data/spec/unit/other/transbucket.rb +172 -0
  226. data/spec/unit/other/transobject.rb +92 -0
  227. data/spec/unit/parameter.rb +24 -0
  228. data/spec/unit/parser/ast.rb +37 -0
  229. data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
  230. data/spec/unit/parser/ast/astarray.rb +66 -0
  231. data/spec/unit/parser/ast/boolean_operator.rb +53 -0
  232. data/spec/unit/parser/ast/collexpr.rb +92 -0
  233. data/spec/unit/parser/ast/comparison_operator.rb +92 -0
  234. data/spec/unit/parser/ast/definition.rb +195 -0
  235. data/spec/unit/parser/ast/function.rb +77 -0
  236. data/spec/unit/parser/ast/hostclass.rb +148 -0
  237. data/spec/unit/parser/ast/minus.rb +36 -0
  238. data/spec/unit/parser/ast/node.rb +125 -0
  239. data/spec/unit/parser/ast/nop.rb +20 -0
  240. data/spec/unit/parser/ast/not.rb +30 -0
  241. data/spec/unit/parser/ast/resource_override.rb +51 -0
  242. data/spec/unit/parser/ast/resource_reference.rb +63 -0
  243. data/spec/unit/parser/ast/vardef.rb +47 -0
  244. data/spec/unit/parser/collector.rb +426 -0
  245. data/spec/unit/parser/compiler.rb +561 -0
  246. data/spec/unit/parser/functions.rb +83 -0
  247. data/spec/unit/parser/functions/inline_template.rb +59 -0
  248. data/spec/unit/parser/functions/template.rb +62 -0
  249. data/spec/unit/parser/interpreter.rb +138 -0
  250. data/spec/unit/parser/lexer.rb +646 -0
  251. data/spec/unit/parser/parser.rb +228 -0
  252. data/spec/unit/parser/resource.rb +336 -0
  253. data/spec/unit/parser/resource/reference.rb +95 -0
  254. data/spec/unit/parser/scope.rb +87 -0
  255. data/spec/unit/parser/templatewrapper.rb +129 -0
  256. data/spec/unit/property.rb +35 -0
  257. data/spec/unit/property/keyvalue.rb +168 -0
  258. data/spec/unit/property/list.rb +156 -0
  259. data/spec/unit/property/ordered_list.rb +64 -0
  260. data/spec/unit/provider/augeas/augeas.rb +238 -0
  261. data/spec/unit/provider/confine.rb +78 -0
  262. data/spec/unit/provider/confine/exists.rb +81 -0
  263. data/spec/unit/provider/confine/false.rb +53 -0
  264. data/spec/unit/provider/confine/feature.rb +60 -0
  265. data/spec/unit/provider/confine/true.rb +53 -0
  266. data/spec/unit/provider/confine/variable.rb +107 -0
  267. data/spec/unit/provider/confine_collection.rb +134 -0
  268. data/spec/unit/provider/confiner.rb +63 -0
  269. data/spec/unit/provider/group/groupadd.rb +31 -0
  270. data/spec/unit/provider/group/ldap.rb +105 -0
  271. data/spec/unit/provider/ldap.rb +248 -0
  272. data/spec/unit/provider/macauthorization.rb +147 -0
  273. data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
  274. data/spec/unit/provider/mount.rb +130 -0
  275. data/spec/unit/provider/mount/parsed.rb +185 -0
  276. data/spec/unit/provider/package/apt.rb +138 -0
  277. data/spec/unit/provider/package/dpkg.rb +163 -0
  278. data/spec/unit/provider/package/gem.rb +87 -0
  279. data/spec/unit/provider/package/hpux.rb +52 -0
  280. data/spec/unit/provider/selboolean.rb +37 -0
  281. data/spec/unit/provider/selmodule-example.pp +0 -0
  282. data/spec/unit/provider/selmodule.rb +66 -0
  283. data/spec/unit/provider/service/daemontools.rb +124 -0
  284. data/spec/unit/provider/service/launchd.rb +134 -0
  285. data/spec/unit/provider/service/runit.rb +117 -0
  286. data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
  287. data/spec/unit/provider/user/hpux.rb +25 -0
  288. data/spec/unit/provider/user/ldap.rb +279 -0
  289. data/spec/unit/provider/user/user_role_add.rb +249 -0
  290. data/spec/unit/provider/user/useradd.rb +115 -0
  291. data/spec/unit/provider/zfs/solaris.rb +87 -0
  292. data/spec/unit/provider/zone/solaris.rb +42 -0
  293. data/spec/unit/provider/zpool/solaris.rb +179 -0
  294. data/spec/unit/rails.rb +125 -0
  295. data/spec/unit/relationship.rb +149 -0
  296. data/spec/unit/reports.rb +61 -0
  297. data/spec/unit/resource_reference.rb +73 -0
  298. data/spec/unit/simple_graph.rb +280 -0
  299. data/spec/unit/transaction/change.rb +187 -0
  300. data/spec/unit/transaction/event.rb +25 -0
  301. data/spec/unit/transaction/report.rb +40 -0
  302. data/spec/unit/type.rb +64 -0
  303. data/spec/unit/type/augeas.rb +113 -0
  304. data/spec/unit/type/computer.rb +82 -0
  305. data/spec/unit/type/exec.rb +91 -0
  306. data/spec/unit/type/file.rb +155 -0
  307. data/spec/unit/type/file/ensure.rb +21 -0
  308. data/spec/unit/type/file/group.rb +118 -0
  309. data/spec/unit/type/file/owner.rb +132 -0
  310. data/spec/unit/type/file/selinux.rb +82 -0
  311. data/spec/unit/type/group.rb +40 -0
  312. data/spec/unit/type/macauthorization.rb +78 -0
  313. data/spec/unit/type/mcx.rb +108 -0
  314. data/spec/unit/type/mount.rb +219 -0
  315. data/spec/unit/type/nagios.rb +63 -0
  316. data/spec/unit/type/noop_metaparam.rb +38 -0
  317. data/spec/unit/type/package.rb +246 -0
  318. data/spec/unit/type/resources.rb +27 -0
  319. data/spec/unit/type/schedule.rb +339 -0
  320. data/spec/unit/type/selboolean.rb +47 -0
  321. data/spec/unit/type/selmodule.rb +18 -0
  322. data/spec/unit/type/service.rb +254 -0
  323. data/spec/unit/type/ssh_authorized_key.rb +106 -0
  324. data/spec/unit/type/tidy.rb +68 -0
  325. data/spec/unit/type/user.rb +260 -0
  326. data/spec/unit/type/zfs.rb +45 -0
  327. data/spec/unit/type/zone.rb +20 -0
  328. data/spec/unit/type/zpool.rb +110 -0
  329. data/spec/unit/util/checksums.rb +99 -0
  330. data/spec/unit/util/constant_inflector.rb +70 -0
  331. data/spec/unit/util/file_locking.rb +115 -0
  332. data/spec/unit/util/ldap/connection.rb +169 -0
  333. data/spec/unit/util/ldap/generator.rb +54 -0
  334. data/spec/unit/util/ldap/manager.rb +654 -0
  335. data/spec/unit/util/loadedfile.rb +65 -0
  336. data/spec/unit/util/log.rb +107 -0
  337. data/spec/unit/util/metric.rb +95 -0
  338. data/spec/unit/util/nagios_maker.rb +128 -0
  339. data/spec/unit/util/posix.rb +256 -0
  340. data/spec/unit/util/resource_template.rb +58 -0
  341. data/spec/unit/util/selinux.rb +219 -0
  342. data/spec/unit/util/settings.rb +847 -0
  343. data/spec/unit/util/storage.rb +248 -0
  344. data/spec/unit/util/tagging.rb +92 -0
  345. data/spec/unit/util/uri_helper.rb +41 -0
  346. data/spec/unit/util/user_attr.rb +47 -0
  347. data/spec/unit/util/warnings.rb +35 -0
  348. data/test/certmgr/support.rb +0 -6
  349. data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
  350. data/test/data/snippets/multilinecomments.pp +6 -0
  351. data/test/data/snippets/multipleclass.pp +9 -0
  352. data/test/language/functions.rb +11 -1
  353. data/test/language/snippets.rb +16 -0
  354. data/test/lib/puppettest/runnable_test.rb +1 -1
  355. data/test/network/handler/fileserver.rb +5 -0
  356. data/test/other/report.rb +0 -4
  357. data/test/ral/type/resources.rb +2 -19
  358. data/test/util/settings.rb +4 -4
  359. data/test/util/storage.rb +0 -24
  360. data/test/util/utiltest.rb +0 -33
  361. metadata +319 -26
  362. data/conf/debian/README.source +0 -2
  363. data/conf/debian/TODO.Debian +0 -1
  364. data/conf/debian/changelog +0 -257
  365. data/conf/debian/compat +0 -1
  366. data/conf/debian/control +0 -45
  367. data/conf/debian/copyright +0 -17
  368. data/conf/debian/docs +0 -1
  369. data/conf/debian/fileserver.conf +0 -12
  370. data/conf/debian/puppet.NEWS +0 -63
  371. data/conf/debian/puppet.conf +0 -8
  372. data/conf/debian/puppet.dirs +0 -7
  373. data/conf/debian/puppet.files +0 -6
  374. data/conf/debian/puppet.init +0 -64
  375. data/conf/debian/puppet.logrotate +0 -11
  376. data/conf/debian/puppet.postinst +0 -9
  377. data/conf/debian/puppet.postrm +0 -21
  378. data/conf/debian/puppet.preinst +0 -25
  379. data/conf/debian/puppetmaster.files +0 -4
  380. data/conf/debian/puppetmaster.init +0 -58
  381. data/conf/debian/rules +0 -115
  382. data/conf/debian/watch +0 -2
  383. data/lib/puppet/type/nagios_hostgroupescalation.rb +0 -3
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2008-3-28.
4
+ # Copyright (c) 2008. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/util/ldap/generator'
9
+
10
+ describe Puppet::Util::Ldap::Generator do
11
+ before do
12
+ @generator = Puppet::Util::Ldap::Generator.new(:uno)
13
+ end
14
+
15
+ it "should require a parameter name at initialization" do
16
+ lambda { Puppet::Util::Ldap::Generator.new }.should raise_error
17
+ end
18
+
19
+ it "should always return its name as a string" do
20
+ g = Puppet::Util::Ldap::Generator.new(:myname)
21
+ g.name.should == "myname"
22
+ end
23
+
24
+ it "should provide a method for declaring the source parameter" do
25
+ @generator.from(:dos)
26
+ end
27
+
28
+ it "should always return a set source as a string" do
29
+ @generator.from(:dos)
30
+ @generator.source.should == "dos"
31
+ end
32
+
33
+ it "should return the source as nil if there is no source" do
34
+ @generator.source.should be_nil
35
+ end
36
+
37
+ it "should return itself when declaring the source" do
38
+ @generator.from(:dos).should equal(@generator)
39
+ end
40
+
41
+ it "should run the provided block when asked to generate the value" do
42
+ @generator.with { "yayness" }
43
+ @generator.generate().should == "yayness"
44
+ end
45
+
46
+ it "should pass in any provided value to the block" do
47
+ @generator.with { |value| value.upcase }
48
+ @generator.generate("myval").should == "MYVAL"
49
+ end
50
+
51
+ it "should return itself when declaring the code used for generating" do
52
+ @generator.with { |value| value.upcase }.should equal(@generator)
53
+ end
54
+ end
@@ -0,0 +1,654 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Luke Kanies on 2008-3-19.
4
+ # Copyright (c) 2006. All rights reserved.
5
+
6
+ require File.dirname(__FILE__) + '/../../../spec_helper'
7
+
8
+ require 'puppet/util/ldap/manager'
9
+
10
+ # If the ldap classes aren't available, go ahead and
11
+ # create some, so our tests will pass.
12
+ unless defined?(LDAP::Mod)
13
+ class LDAP
14
+ LDAP_MOD_ADD = :adding
15
+ LDAP_MOD_REPLACE = :replacing
16
+ LDAP_MOD_DELETE = :deleting
17
+ class ResultError < RuntimeError; end
18
+ class Mod
19
+ def initialize(*args)
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ describe Puppet::Util::Ldap::Manager do
26
+ before do
27
+ @manager = Puppet::Util::Ldap::Manager.new
28
+ end
29
+
30
+ it "should return self when specifying objectclasses" do
31
+ @manager.manages(:one, :two).should equal(@manager)
32
+ end
33
+
34
+ it "should allow specification of what objectclasses are managed" do
35
+ @manager.manages(:one, :two).objectclasses.should == [:one, :two]
36
+ end
37
+
38
+ it "should return self when specifying the relative base" do
39
+ @manager.at("yay").should equal(@manager)
40
+ end
41
+
42
+ it "should allow specification of the relative base" do
43
+ @manager.at("yay").location.should == "yay"
44
+ end
45
+
46
+ it "should return self when specifying the attribute map" do
47
+ @manager.maps(:one => :two).should equal(@manager)
48
+ end
49
+
50
+ it "should allow specification of the rdn attribute" do
51
+ @manager.named_by(:uid).rdn.should == :uid
52
+ end
53
+
54
+ it "should allow specification of the attribute map" do
55
+ @manager.maps(:one => :two).puppet2ldap.should == {:one => :two}
56
+ end
57
+
58
+ it "should have a no-op 'and' method that just returns self" do
59
+ @manager.and.should equal(@manager)
60
+ end
61
+
62
+ it "should allow specification of generated attributes" do
63
+ @manager.generates(:thing).should be_instance_of(Puppet::Util::Ldap::Generator)
64
+ end
65
+
66
+ describe "when generating attributes" do
67
+ before do
68
+ @generator = stub 'generator', :source => "one", :name => "myparam"
69
+
70
+ Puppet::Util::Ldap::Generator.stubs(:new).with(:myparam).returns @generator
71
+ end
72
+
73
+ it "should create a generator to do the parameter generation" do
74
+ Puppet::Util::Ldap::Generator.expects(:new).with(:myparam).returns @generator
75
+ @manager.generates(:myparam)
76
+ end
77
+
78
+ it "should return the generator from the :generates method" do
79
+ @manager.generates(:myparam).should equal(@generator)
80
+ end
81
+
82
+ it "should not replace already present values" do
83
+ @manager.generates(:myparam)
84
+
85
+ attrs = {"myparam" => "testing"}
86
+ @generator.expects(:generate).never
87
+
88
+ @manager.generate attrs
89
+
90
+ attrs["myparam"].should == "testing"
91
+ end
92
+
93
+ it "should look for the parameter as a string, not a symbol" do
94
+ @manager.generates(:myparam)
95
+ @generator.expects(:generate).with("yay").returns %w{double yay}
96
+ attrs = {"one" => "yay"}
97
+ @manager.generate attrs
98
+
99
+ attrs["myparam"].should == %w{double yay}
100
+ end
101
+
102
+ it "should fail if a source is specified and no source value is not defined" do
103
+ @manager.generates(:myparam)
104
+ lambda { @manager.generate "two" => "yay" }.should raise_error(ArgumentError)
105
+ end
106
+
107
+ it "should use the source value to generate the new value if a source attribute is specified" do
108
+ @manager.generates(:myparam)
109
+ @generator.expects(:generate).with("yay").returns %w{double yay}
110
+ @manager.generate "one" => "yay"
111
+ end
112
+
113
+ it "should not pass in any value if no source attribute is specified" do
114
+ @generator.stubs(:source).returns nil
115
+ @manager.generates(:myparam)
116
+ @generator.expects(:generate).with().returns %w{double yay}
117
+ @manager.generate "one" => "yay"
118
+ end
119
+
120
+ it "should convert any results to arrays of strings if necessary" do
121
+ @generator.expects(:generate).returns :test
122
+ @manager.generates(:myparam)
123
+
124
+ attrs = {"one" => "two"}
125
+ @manager.generate(attrs)
126
+ attrs["myparam"].should == ["test"]
127
+ end
128
+
129
+ it "should add the result to the passed-in attribute hash" do
130
+ @generator.expects(:generate).returns %w{test}
131
+ @manager.generates(:myparam)
132
+
133
+ attrs = {"one" => "two"}
134
+ @manager.generate(attrs)
135
+ attrs["myparam"].should == %w{test}
136
+ end
137
+ end
138
+
139
+ it "should be considered invalid if it is missing a location" do
140
+ @manager.manages :me
141
+ @manager.maps :me => :you
142
+ @manager.should_not be_valid
143
+ end
144
+
145
+ it "should be considered invalid if it is missing an objectclass list" do
146
+ @manager.maps :me => :you
147
+ @manager.at "ou=yayness"
148
+ @manager.should_not be_valid
149
+ end
150
+
151
+ it "should be considered invalid if it is missing an attribute map" do
152
+ @manager.manages :me
153
+ @manager.at "ou=yayness"
154
+ @manager.should_not be_valid
155
+ end
156
+
157
+ it "should be considered valid if it has an attribute map, location, and objectclass list" do
158
+ @manager.maps :me => :you
159
+ @manager.manages :me
160
+ @manager.at "ou=yayness"
161
+ @manager.should be_valid
162
+ end
163
+
164
+ it "should calculate an instance's dn using the :ldapbase setting and the relative base" do
165
+ Puppet.settings.expects(:value).with(:ldapbase).returns "dc=testing"
166
+ @manager.at "ou=mybase"
167
+ @manager.dn("me").should == "cn=me,ou=mybase,dc=testing"
168
+ end
169
+
170
+ it "should use the specified rdn when calculating an instance's dn" do
171
+ Puppet.settings.expects(:value).with(:ldapbase).returns "dc=testing"
172
+ @manager.named_by :uid
173
+ @manager.at "ou=mybase"
174
+ @manager.dn("me").should =~ /^uid=me/
175
+ end
176
+
177
+ it "should calculate its base using the :ldapbase setting and the relative base" do
178
+ Puppet.settings.expects(:value).with(:ldapbase).returns "dc=testing"
179
+ @manager.at "ou=mybase"
180
+ @manager.base.should == "ou=mybase,dc=testing"
181
+ end
182
+
183
+ describe "when generating its search filter" do
184
+ it "should using a single 'objectclass=<name>' filter if a single objectclass is specified" do
185
+ @manager.manages("testing")
186
+ @manager.filter.should == "objectclass=testing"
187
+ end
188
+
189
+ it "should create an LDAP AND filter if multiple objectclasses are specified" do
190
+ @manager.manages "testing", "okay", "done"
191
+ @manager.filter.should == "(&(objectclass=testing)(objectclass=okay)(objectclass=done))"
192
+ end
193
+ end
194
+
195
+ it "should have a method for converting a Puppet attribute name to an LDAP attribute name as a string" do
196
+ @manager.maps :puppet_attr => :ldap_attr
197
+ @manager.ldap_name(:puppet_attr).should == "ldap_attr"
198
+ end
199
+
200
+ it "should have a method for converting an LDAP attribute name to a Puppet attribute name" do
201
+ @manager.maps :puppet_attr => :ldap_attr
202
+ @manager.puppet_name(:ldap_attr).should == :puppet_attr
203
+ end
204
+
205
+ it "should have a :create method for creating ldap entries" do
206
+ @manager.should respond_to(:create)
207
+ end
208
+
209
+ it "should have a :delete method for deleting ldap entries" do
210
+ @manager.should respond_to(:delete)
211
+ end
212
+
213
+ it "should have a :modify method for modifying ldap entries" do
214
+ @manager.should respond_to(:modify)
215
+ end
216
+
217
+ it "should have a method for finding an entry by name in ldap" do
218
+ @manager.should respond_to(:find)
219
+ end
220
+
221
+ describe "when converting ldap entries to hashes for providers" do
222
+ before do
223
+ @manager.maps :uno => :one, :dos => :two
224
+
225
+ @result = @manager.entry2provider("dn" => ["cn=one,ou=people,dc=madstop"], "one" => ["two"], "three" => %w{four}, "objectclass" => %w{yay ness})
226
+ end
227
+
228
+ it "should set the name to the short portion of the dn" do
229
+ @result[:name].should == "one"
230
+ end
231
+
232
+ it "should remove the objectclasses" do
233
+ @result["objectclass"].should be_nil
234
+ end
235
+
236
+ it "should remove any attributes that are not mentioned in the map" do
237
+ @result["three"].should be_nil
238
+ end
239
+
240
+ it "should rename convert to symbols all attributes to their puppet names" do
241
+ @result[:uno].should == %w{two}
242
+ end
243
+
244
+ it "should set the value of all unset puppet attributes as :absent" do
245
+ @result[:dos].should == :absent
246
+ end
247
+ end
248
+
249
+ describe "when using an ldap connection" do
250
+ before do
251
+ @ldapconn = mock 'ldapconn'
252
+ @conn = stub 'connection', :connection => @ldapconn, :start => nil, :close => nil
253
+ Puppet::Util::Ldap::Connection.stubs(:new).returns(@conn)
254
+ end
255
+
256
+ it "should fail unless a block is given" do
257
+ lambda { @manager.connect }.should raise_error(ArgumentError)
258
+ end
259
+
260
+ it "should open the connection with its server set to :ldapserver" do
261
+ Puppet.settings.stubs(:value).returns(false)
262
+ Puppet.settings.expects(:value).with(:ldapserver).returns("myserver")
263
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[0] == "myserver" }.returns @conn
264
+
265
+ @manager.connect { |c| }
266
+ end
267
+
268
+ it "should open the connection with its port set to the :ldapport" do
269
+ Puppet.settings.stubs(:value).returns(false)
270
+ Puppet.settings.expects(:value).with(:ldapport).returns("28")
271
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[1] == "28" }.returns @conn
272
+
273
+ @manager.connect { |c| }
274
+ end
275
+
276
+ it "should open the connection with no user if :ldapuser is not set" do
277
+ Puppet.settings.stubs(:value).returns(false)
278
+ Puppet.settings.expects(:value).with(:ldapuser).returns("")
279
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:user].nil? }.returns @conn
280
+
281
+ @manager.connect { |c| }
282
+ end
283
+
284
+ it "should open the connection with its user set to the :ldapuser if it is set" do
285
+ Puppet.settings.stubs(:value).returns(false)
286
+ Puppet.settings.expects(:value).with(:ldapuser).returns("mypass")
287
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:user] == "mypass" }.returns @conn
288
+
289
+ @manager.connect { |c| }
290
+ end
291
+
292
+ it "should open the connection with no password if :ldappassword is not set" do
293
+ Puppet.settings.stubs(:value).returns(false)
294
+ Puppet.settings.expects(:value).with(:ldappassword).returns("")
295
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:password].nil? }.returns @conn
296
+
297
+ @manager.connect { |c| }
298
+ end
299
+
300
+ it "should open the connection with its password set to the :ldappassword if it is set" do
301
+ Puppet.settings.stubs(:value).returns(false)
302
+ Puppet.settings.expects(:value).with(:ldappassword).returns("mypass")
303
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:password] == "mypass" }.returns @conn
304
+
305
+ @manager.connect { |c| }
306
+ end
307
+
308
+ it "should set ssl to :tls if ldaptls is enabled" do
309
+ Puppet.settings.stubs(:value).returns(false)
310
+ Puppet.settings.expects(:value).with(:ldaptls).returns(true)
311
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:ssl] == :tls }.returns @conn
312
+
313
+ @manager.connect { |c| }
314
+ end
315
+
316
+ it "should set ssl to true if ldapssl is enabled" do
317
+ Puppet.settings.stubs(:value).returns(false)
318
+ Puppet.settings.expects(:value).with(:ldapssl).returns(true)
319
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:ssl] == true }.returns @conn
320
+
321
+ @manager.connect { |c| }
322
+ end
323
+
324
+ it "should set ssl to false if neither ldaptls nor ldapssl is enabled" do
325
+ Puppet.settings.stubs(:value).returns(false)
326
+ Puppet.settings.expects(:value).with(:ldapssl).returns(false)
327
+ Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:ssl] == false }.returns @conn
328
+
329
+ @manager.connect { |c| }
330
+ end
331
+
332
+ it "should open, yield, and then close the connection" do
333
+ @conn.expects(:start)
334
+ @conn.expects(:close)
335
+ Puppet::Util::Ldap::Connection.expects(:new).returns(@conn)
336
+ @ldapconn.expects(:test)
337
+ @manager.connect { |c| c.test }
338
+ end
339
+
340
+ it "should close the connection even if there's an exception in the passed block" do
341
+ @conn.expects(:close)
342
+ lambda { @manager.connect { |c| raise ArgumentError } }.should raise_error(ArgumentError)
343
+ end
344
+ end
345
+
346
+ describe "when using ldap" do
347
+ before do
348
+ @conn = mock 'connection'
349
+ @manager.stubs(:connect).yields @conn
350
+ @manager.stubs(:objectclasses).returns [:oc1, :oc2]
351
+ @manager.maps :one => :uno, :two => :dos, :three => :tres, :four => :quatro
352
+ end
353
+
354
+ describe "to create entries" do
355
+ it "should convert the first argument to its :create method to a full dn and pass the resulting argument list to its connection" do
356
+ @manager.expects(:dn).with("myname").returns "mydn"
357
+ @conn.expects(:add).with { |name, attrs| name == "mydn" }
358
+
359
+ @manager.create("myname", {"attr" => "myattrs"})
360
+ end
361
+
362
+ it "should add the objectclasses to the attributes" do
363
+ @manager.expects(:dn).with("myname").returns "mydn"
364
+ @conn.expects(:add).with { |name, attrs| attrs["objectClass"].include?("oc1") and attrs["objectClass"].include?("oc2") }
365
+
366
+ @manager.create("myname", {:one => :testing})
367
+ end
368
+
369
+ it "should add the rdn to the attributes" do
370
+ @manager.expects(:dn).with("myname").returns "mydn"
371
+ @conn.expects(:add).with { |name, attrs| attrs["cn"] == %w{myname} }
372
+
373
+ @manager.create("myname", {:one => :testing})
374
+ end
375
+
376
+ it "should add 'top' to the objectclasses if it is not listed" do
377
+ @manager.expects(:dn).with("myname").returns "mydn"
378
+ @conn.expects(:add).with { |name, attrs| attrs["objectClass"].include?("top") }
379
+
380
+ @manager.create("myname", {:one => :testing})
381
+ end
382
+
383
+ it "should add any generated values that are defined" do
384
+ generator = stub 'generator', :source => :one, :name => "myparam"
385
+
386
+ Puppet::Util::Ldap::Generator.expects(:new).with(:myparam).returns generator
387
+
388
+ @manager.generates(:myparam)
389
+
390
+ @manager.stubs(:dn).with("myname").returns "mydn"
391
+
392
+ generator.expects(:generate).with(:testing).returns ["generated value"]
393
+ @conn.expects(:add).with { |name, attrs| attrs["myparam"] == ["generated value"] }
394
+
395
+ @manager.create("myname", {:one => :testing})
396
+ end
397
+
398
+ it "should convert any generated values to arrays of strings if necessary" do
399
+ generator = stub 'generator', :source => :one, :name => "myparam"
400
+
401
+ Puppet::Util::Ldap::Generator.expects(:new).with(:myparam).returns generator
402
+
403
+ @manager.generates(:myparam)
404
+
405
+ @manager.stubs(:dn).returns "mydn"
406
+
407
+ generator.expects(:generate).returns :generated
408
+ @conn.expects(:add).with { |name, attrs| attrs["myparam"] == ["generated"] }
409
+
410
+ @manager.create("myname", {:one => :testing})
411
+ end
412
+ end
413
+
414
+ describe "do delete entries" do
415
+ it "should convert the first argument to its :delete method to a full dn and pass the resulting argument list to its connection" do
416
+ @manager.expects(:dn).with("myname").returns "mydn"
417
+ @conn.expects(:delete).with("mydn")
418
+
419
+ @manager.delete("myname")
420
+ end
421
+ end
422
+
423
+ describe "to modify entries" do
424
+ it "should convert the first argument to its :modify method to a full dn and pass the resulting argument list to its connection" do
425
+ @manager.expects(:dn).with("myname").returns "mydn"
426
+ @conn.expects(:modify).with("mydn", :mymods)
427
+
428
+ @manager.modify("myname", :mymods)
429
+ end
430
+ end
431
+
432
+ describe "to find a single entry" do
433
+ it "should use the dn of the provided name as the search base, a scope of 0, and 'objectclass=*' as the filter for a search2 call" do
434
+ @manager.expects(:dn).with("myname").returns "mydn"
435
+ @conn.expects(:search2).with("mydn", 0, "objectclass=*")
436
+
437
+ @manager.find("myname")
438
+ end
439
+
440
+ it "should return nil if an exception is thrown because no result is found" do
441
+ @manager.expects(:dn).with("myname").returns "mydn"
442
+ @conn.expects(:search2).raises LDAP::ResultError
443
+
444
+ @manager.find("myname").should be_nil
445
+ end
446
+
447
+ it "should return a converted provider hash if the result is found" do
448
+ @manager.expects(:dn).with("myname").returns "mydn"
449
+ result = {"one" => "two"}
450
+ @conn.expects(:search2).yields result
451
+
452
+ @manager.expects(:entry2provider).with(result).returns "myprovider"
453
+
454
+ @manager.find("myname").should == "myprovider"
455
+ end
456
+ end
457
+
458
+ describe "to search for multiple entries" do
459
+ before do
460
+ @manager.stubs(:filter).returns "myfilter"
461
+ end
462
+
463
+ it "should use the manager's search base as the dn of the provided name as the search base" do
464
+ @manager.expects(:base).returns "mybase"
465
+ @conn.expects(:search2).with { |base, scope, filter| base == "mybase" }
466
+
467
+ @manager.search
468
+ end
469
+
470
+ it "should use a scope of 1" do
471
+ @conn.expects(:search2).with { |base, scope, filter| scope == 1 }
472
+
473
+ @manager.search
474
+ end
475
+
476
+ it "should use any specified search filter" do
477
+ @manager.expects(:filter).never
478
+ @conn.expects(:search2).with { |base, scope, filter| filter == "boo" }
479
+
480
+ @manager.search("boo")
481
+ end
482
+
483
+ it "should turn its objectclass list into its search filter if one is not specified" do
484
+ @manager.expects(:filter).returns "yay"
485
+ @conn.expects(:search2).with { |base, scope, filter| filter == "yay" }
486
+
487
+ @manager.search
488
+ end
489
+
490
+ it "should return nil if no result is found" do
491
+ @conn.expects(:search2)
492
+
493
+ @manager.search.should be_nil
494
+ end
495
+
496
+ it "should return an array of the found results converted to provider hashes" do
497
+ # LAK: AFAICT, it's impossible to yield multiple times in an expectation.
498
+ one = {"dn" => "cn=one,dc=madstop,dc=com", "one" => "two"}
499
+ @conn.expects(:search2).yields(one)
500
+
501
+ @manager.expects(:entry2provider).with(one).returns "myprov"
502
+
503
+ @manager.search.should == ["myprov"]
504
+ end
505
+ end
506
+ end
507
+
508
+ describe "when an instance" do
509
+ before do
510
+ @name = "myname"
511
+ @manager.maps :one => :uno, :two => :dos, :three => :tres, :four => :quatro
512
+ end
513
+
514
+ describe "is being updated" do
515
+ it "should get created if the current attribute list is empty and the desired attribute list has :ensure == :present" do
516
+ @manager.expects(:create)
517
+ @manager.update(@name, {}, {:ensure => :present})
518
+ end
519
+
520
+ it "should get created if the current attribute list has :ensure == :absent and the desired attribute list has :ensure == :present" do
521
+ @manager.expects(:create)
522
+ @manager.update(@name, {:ensure => :absent}, {:ensure => :present})
523
+ end
524
+
525
+ it "should get deleted if the current attribute list has :ensure == :present and the desired attribute list has :ensure == :absent" do
526
+ @manager.expects(:delete)
527
+ @manager.update(@name, {:ensure => :present}, {:ensure => :absent})
528
+ end
529
+
530
+ it "should get modified if both attribute lists have :ensure == :present" do
531
+ @manager.expects(:modify)
532
+ @manager.update(@name, {:ensure => :present, :one => :two}, {:ensure => :present, :one => :three})
533
+ end
534
+ end
535
+
536
+ describe "is being deleted" do
537
+ it "should call the :delete method with its name and manager" do
538
+ @manager.expects(:delete).with(@name)
539
+
540
+ @manager.update(@name, {}, {:ensure => :absent})
541
+ end
542
+ end
543
+
544
+ describe "is being created" do
545
+ before do
546
+ @is = {}
547
+ @should = {:ensure => :present, :one => :yay, :two => :absent}
548
+ end
549
+
550
+ it "should call the :create method with its name" do
551
+ @manager.expects(:create).with { |name, attrs| name == @name }
552
+ @manager.update(@name, @is, @should)
553
+ end
554
+
555
+ it "should call the :create method with its property hash converted to ldap attribute names" do
556
+ @manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
557
+ @manager.update(@name, @is, @should)
558
+ end
559
+
560
+ it "should convert the property names to strings" do
561
+ @manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
562
+ @manager.update(@name, @is, @should)
563
+ end
564
+
565
+ it "should convert the property values to arrays if necessary" do
566
+ @manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
567
+ @manager.update(@name, @is, @should)
568
+ end
569
+
570
+ it "should convert the property values to strings if necessary" do
571
+ @manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
572
+ @manager.update(@name, @is, @should)
573
+ end
574
+
575
+ it "should not include :ensure in the properties sent" do
576
+ @manager.expects(:create).with { |*args| args[1][:ensure].nil? }
577
+ @manager.update(@name, @is, @should)
578
+ end
579
+
580
+ it "should not include attributes set to :absent in the properties sent" do
581
+ @manager.expects(:create).with { |*args| args[1][:dos].nil? }
582
+ @manager.update(@name, @is, @should)
583
+ end
584
+ end
585
+
586
+ describe "is being modified" do
587
+ it "should call the :modify method with its name and an array of LDAP::Mod instances" do
588
+ LDAP::Mod.stubs(:new).returns "whatever"
589
+
590
+ @is = {:one => :yay}
591
+ @should = {:one => :yay, :two => :foo}
592
+
593
+ @manager.expects(:modify).with { |name, mods| name == @name }
594
+ @manager.update(@name, @is, @should)
595
+ end
596
+
597
+ it "should create the LDAP::Mod with the property name converted to the ldap name as a string" do
598
+ @is = {:one => :yay}
599
+ @should = {:one => :yay, :two => :foo}
600
+ mod = mock 'module'
601
+ LDAP::Mod.expects(:new).with { |form, name, value| name == "dos" }.returns mod
602
+
603
+ @manager.stubs(:modify)
604
+
605
+ @manager.update(@name, @is, @should)
606
+ end
607
+
608
+ it "should create an LDAP::Mod instance of type LDAP_MOD_ADD for each attribute being added, with the attribute value converted to a string of arrays" do
609
+ @is = {:one => :yay}
610
+ @should = {:one => :yay, :two => :foo}
611
+ mod = mock 'module'
612
+ LDAP::Mod.expects(:new).with(LDAP::LDAP_MOD_ADD, "dos", ["foo"]).returns mod
613
+
614
+ @manager.stubs(:modify)
615
+
616
+ @manager.update(@name, @is, @should)
617
+ end
618
+
619
+ it "should create an LDAP::Mod instance of type LDAP_MOD_DELETE for each attribute being deleted" do
620
+ @is = {:one => :yay, :two => :foo}
621
+ @should = {:one => :yay, :two => :absent}
622
+ mod = mock 'module'
623
+ LDAP::Mod.expects(:new).with(LDAP::LDAP_MOD_DELETE, "dos", []).returns mod
624
+
625
+ @manager.stubs(:modify)
626
+
627
+ @manager.update(@name, @is, @should)
628
+ end
629
+
630
+ it "should create an LDAP::Mod instance of type LDAP_MOD_REPLACE for each attribute being modified, with the attribute converted to a string of arrays" do
631
+ @is = {:one => :yay, :two => :four}
632
+ @should = {:one => :yay, :two => :five}
633
+ mod = mock 'module'
634
+ LDAP::Mod.expects(:new).with(LDAP::LDAP_MOD_REPLACE, "dos", ["five"]).returns mod
635
+
636
+ @manager.stubs(:modify)
637
+
638
+ @manager.update(@name, @is, @should)
639
+ end
640
+
641
+ it "should pass all created Mod instances to the modify method" do
642
+ @is = {:one => :yay, :two => :foo, :three => :absent}
643
+ @should = {:one => :yay, :two => :foe, :three => :fee, :four => :fie}
644
+ LDAP::Mod.expects(:new).times(3).returns("mod1").then.returns("mod2").then.returns("mod3")
645
+
646
+ @manager.expects(:modify).with do |name, mods|
647
+ mods.sort == %w{mod1 mod2 mod3}.sort
648
+ end
649
+
650
+ @manager.update(@name, @is, @should)
651
+ end
652
+ end
653
+ end
654
+ end