puppet 2.7.19 → 2.7.20.rc1

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 (324) hide show
  1. data/CONTRIBUTING.md +61 -238
  2. data/Gemfile +32 -0
  3. data/Gemfile.lock +44 -0
  4. data/LICENSE +1 -1
  5. data/README_DEVELOPER.md +300 -5
  6. data/Rakefile +41 -37
  7. data/ext/build_defaults.yaml +20 -0
  8. data/ext/debian/README.Debian +8 -0
  9. data/ext/debian/README.source +2 -0
  10. data/ext/debian/TODO.Debian +1 -0
  11. data/ext/debian/changelog.erb +1104 -0
  12. data/ext/debian/compat +1 -0
  13. data/ext/debian/control +142 -0
  14. data/ext/debian/copyright +361 -0
  15. data/ext/debian/docs +1 -0
  16. data/ext/debian/fileserver.conf +17 -0
  17. data/ext/debian/puppet-common.dirs +8 -0
  18. data/ext/debian/puppet-common.install +3 -0
  19. data/ext/debian/puppet-common.lintian-overrides +7 -0
  20. data/ext/debian/puppet-common.manpages +2 -0
  21. data/ext/debian/puppet-common.postinst +35 -0
  22. data/ext/debian/puppet-common.postrm +32 -0
  23. data/ext/debian/puppet-el.dirs +1 -0
  24. data/ext/debian/puppet-el.emacsen-install +25 -0
  25. data/ext/debian/puppet-el.emacsen-remove +11 -0
  26. data/ext/debian/puppet-el.emacsen-startup +9 -0
  27. data/ext/debian/puppet-el.install +1 -0
  28. data/ext/debian/puppet-testsuite.install +3 -0
  29. data/ext/debian/puppet-testsuite.lintian-overrides +4 -0
  30. data/ext/debian/puppet.NEWS +86 -0
  31. data/ext/debian/puppet.conf +14 -0
  32. data/ext/debian/puppet.default +7 -0
  33. data/ext/debian/puppet.dirs +1 -0
  34. data/ext/debian/puppet.init +118 -0
  35. data/ext/debian/puppet.install +4 -0
  36. data/ext/debian/puppet.lintian-overrides +3 -0
  37. data/ext/debian/puppet.logrotate +11 -0
  38. data/ext/debian/puppet.manpages +36 -0
  39. data/ext/debian/puppet.postinst +20 -0
  40. data/ext/debian/puppet.postrm +20 -0
  41. data/ext/debian/puppet.preinst +20 -0
  42. data/ext/debian/puppetmaster-common.install +5 -0
  43. data/ext/debian/puppetmaster-common.manpages +5 -0
  44. data/ext/debian/puppetmaster-common.puppetqd.default +27 -0
  45. data/ext/debian/puppetmaster-common.puppetqd.init +84 -0
  46. data/ext/debian/puppetmaster-passenger.dirs +4 -0
  47. data/ext/debian/puppetmaster-passenger.postinst +66 -0
  48. data/ext/debian/puppetmaster-passenger.postrm +33 -0
  49. data/ext/debian/puppetmaster.NEWS +13 -0
  50. data/ext/debian/puppetmaster.README.debian +16 -0
  51. data/ext/debian/puppetmaster.default +38 -0
  52. data/ext/debian/puppetmaster.dirs +1 -0
  53. data/ext/debian/puppetmaster.init +158 -0
  54. data/ext/debian/puppetmaster.install +1 -0
  55. data/ext/debian/puppetmaster.lintian-overrides +3 -0
  56. data/ext/debian/puppetmaster.manpages +1 -0
  57. data/ext/debian/puppetmaster.postinst +20 -0
  58. data/ext/debian/puppetmaster.postrm +5 -0
  59. data/ext/debian/puppetmaster.preinst +22 -0
  60. data/ext/debian/rules +127 -0
  61. data/ext/debian/source/format +1 -0
  62. data/ext/debian/source/options +1 -0
  63. data/ext/debian/vim-puppet.README.Debian +13 -0
  64. data/ext/debian/vim-puppet.dirs +3 -0
  65. data/ext/debian/vim-puppet.yaml +5 -0
  66. data/ext/debian/watch +2 -0
  67. data/ext/emacs/puppet-mode.el +1 -0
  68. data/{conf → ext}/osx/PackageInfo.plist +0 -0
  69. data/{conf → ext}/osx/createpackage.sh +0 -0
  70. data/ext/osx/file_mapping.yaml +38 -0
  71. data/ext/osx/preflight.erb +37 -0
  72. data/{tasks/rake/templates → ext/osx}/prototype.plist.erb +0 -0
  73. data/ext/packaging/README-Solaris.md +117 -0
  74. data/ext/packaging/README.md +255 -0
  75. data/ext/packaging/spec/spec_helper.rb +12 -0
  76. data/ext/packaging/spec/tasks/00_utils_spec.rb +66 -0
  77. data/ext/packaging/tasks/00_utils.rake +382 -0
  78. data/ext/packaging/tasks/10_setupvars.rake +71 -0
  79. data/ext/packaging/tasks/20_setupextravars.rake +25 -0
  80. data/ext/packaging/tasks/apple.rake +201 -0
  81. data/ext/packaging/tasks/clean.rake +5 -0
  82. data/ext/packaging/tasks/deb.rake +108 -0
  83. data/ext/packaging/tasks/doc.rake +20 -0
  84. data/ext/packaging/tasks/fetch.rake +18 -0
  85. data/ext/packaging/tasks/gem.rake +68 -0
  86. data/ext/packaging/tasks/ips.rake +80 -0
  87. data/ext/packaging/tasks/mock.rake +126 -0
  88. data/ext/packaging/tasks/pe_deb.rake +9 -0
  89. data/ext/packaging/tasks/pe_remote.rake +45 -0
  90. data/ext/packaging/tasks/pe_rpm.rake +21 -0
  91. data/ext/packaging/tasks/pe_ship.rake +30 -0
  92. data/ext/packaging/tasks/pe_sign.rake +27 -0
  93. data/ext/packaging/tasks/pe_sles.rake +96 -0
  94. data/ext/packaging/tasks/release.rake +73 -0
  95. data/ext/packaging/tasks/remote_build.rake +78 -0
  96. data/ext/packaging/tasks/rpm.rake +52 -0
  97. data/ext/packaging/tasks/ship.rake +78 -0
  98. data/ext/packaging/tasks/sign.rake +82 -0
  99. data/ext/packaging/tasks/tag.rake +8 -0
  100. data/ext/packaging/tasks/tar.rake +68 -0
  101. data/ext/packaging/tasks/template.rake +13 -0
  102. data/ext/packaging/tasks/update.rake +16 -0
  103. data/ext/packaging/tasks/version.rake +21 -0
  104. data/ext/project_data.yaml +24 -0
  105. data/{conf/redhat/puppet.spec → ext/redhat/puppet.spec.erb} +18 -10
  106. data/install.rb +8 -8
  107. data/lib/puppet.rb +2 -6
  108. data/lib/puppet/agent/locker.rb +2 -0
  109. data/lib/puppet/application.rb +1 -1
  110. data/lib/puppet/application/agent.rb +1 -1
  111. data/lib/puppet/application/apply.rb +1 -1
  112. data/lib/puppet/application/cert.rb +5 -6
  113. data/lib/puppet/application/describe.rb +1 -1
  114. data/lib/puppet/application/device.rb +1 -1
  115. data/lib/puppet/application/doc.rb +1 -1
  116. data/lib/puppet/application/filebucket.rb +1 -1
  117. data/lib/puppet/application/inspect.rb +1 -1
  118. data/lib/puppet/application/kick.rb +1 -1
  119. data/lib/puppet/application/master.rb +1 -1
  120. data/lib/puppet/application/resource.rb +1 -1
  121. data/lib/puppet/defaults.rb +21 -3
  122. data/lib/puppet/external/dot.rb +1 -1
  123. data/lib/puppet/face/help/global.erb +1 -1
  124. data/lib/puppet/face/module/install.rb +1 -1
  125. data/lib/puppet/face/module/list.rb +1 -1
  126. data/lib/puppet/face/module/uninstall.rb +1 -1
  127. data/lib/puppet/face/node/clean.rb +23 -18
  128. data/lib/puppet/face/parser.rb +11 -2
  129. data/lib/puppet/file_collection.rb +16 -27
  130. data/lib/puppet/file_collection/lookup.rb +6 -16
  131. data/lib/puppet/file_serving/base.rb +4 -4
  132. data/lib/puppet/indirector/catalog/static_compiler.rb +3 -4
  133. data/lib/puppet/indirector/certificate/disabled_ca.rb +22 -0
  134. data/lib/puppet/indirector/certificate_request/disabled_ca.rb +22 -0
  135. data/lib/puppet/indirector/certificate_revocation_list/disabled_ca.rb +22 -0
  136. data/lib/puppet/indirector/face.rb +2 -2
  137. data/lib/puppet/indirector/key/disabled_ca.rb +22 -0
  138. data/lib/puppet/indirector/node/exec.rb +13 -1
  139. data/lib/puppet/indirector/request.rb +4 -0
  140. data/lib/puppet/metatype/manager.rb +17 -10
  141. data/lib/puppet/network/authstore.rb +1 -1
  142. data/lib/puppet/network/rights.rb +1 -2
  143. data/lib/puppet/node/environment.rb +1 -0
  144. data/lib/puppet/parameter/value.rb +9 -3
  145. data/lib/puppet/parser/ast.rb +1 -4
  146. data/lib/puppet/parser/files.rb +1 -1
  147. data/lib/puppet/parser/functions.rb +68 -22
  148. data/lib/puppet/parser/functions/create_resources.rb +2 -3
  149. data/lib/puppet/parser/functions/shellquote.rb +21 -25
  150. data/lib/puppet/parser/lexer.rb +40 -6
  151. data/lib/puppet/parser/relationship.rb +3 -1
  152. data/lib/puppet/parser/resource.rb +2 -3
  153. data/lib/puppet/parser/resource/param.rb +3 -5
  154. data/lib/puppet/parser/scope.rb +7 -4
  155. data/lib/puppet/property.rb +5 -3
  156. data/lib/puppet/provider.rb +5 -5
  157. data/lib/puppet/provider/aixobject.rb +1 -1
  158. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  159. data/lib/puppet/provider/exec/windows.rb +1 -1
  160. data/lib/puppet/provider/file/windows.rb +10 -29
  161. data/lib/puppet/provider/group/groupadd.rb +2 -3
  162. data/lib/puppet/provider/group/ldap.rb +1 -1
  163. data/lib/puppet/provider/group/windows_adsi.rb +1 -1
  164. data/lib/puppet/provider/ldap.rb +5 -1
  165. data/lib/puppet/provider/nameservice.rb +3 -3
  166. data/lib/puppet/provider/nameservice/directoryservice.rb +2 -2
  167. data/lib/puppet/provider/package/gem.rb +6 -2
  168. data/lib/puppet/provider/package/portage.rb +4 -2
  169. data/lib/puppet/provider/parsedfile.rb +1 -1
  170. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +2 -2
  171. data/lib/puppet/provider/service/base.rb +2 -41
  172. data/lib/puppet/provider/service/daemontools.rb +1 -1
  173. data/lib/puppet/provider/service/launchd.rb +1 -1
  174. data/lib/puppet/provider/service/redhat.rb +6 -5
  175. data/lib/puppet/provider/service/runit.rb +1 -1
  176. data/lib/puppet/provider/service/service.rb +43 -0
  177. data/lib/puppet/provider/service/windows.rb +1 -8
  178. data/lib/puppet/provider/user/user_role_add.rb +2 -1
  179. data/lib/puppet/provider/user/useradd.rb +8 -3
  180. data/lib/puppet/provider/user/windows_adsi.rb +12 -1
  181. data/lib/puppet/provider/zone/solaris.rb +1 -1
  182. data/lib/puppet/rails/inventory_node.rb +26 -13
  183. data/lib/puppet/reports.rb +1 -1
  184. data/lib/puppet/resource.rb +20 -5
  185. data/lib/puppet/resource/status.rb +1 -1
  186. data/lib/puppet/ssl/certificate_authority.rb +2 -0
  187. data/lib/puppet/ssl/host.rb +31 -6
  188. data/lib/puppet/test/test_helper.rb +3 -1
  189. data/lib/puppet/transaction/event.rb +1 -1
  190. data/lib/puppet/transaction/report.rb +2 -2
  191. data/lib/puppet/type.rb +30 -25
  192. data/lib/puppet/type/augeas.rb +1 -1
  193. data/lib/puppet/type/cron.rb +2 -2
  194. data/lib/puppet/type/exec.rb +6 -6
  195. data/lib/puppet/type/file.rb +5 -15
  196. data/lib/puppet/type/file/content.rb +1 -1
  197. data/lib/puppet/type/file/ensure.rb +1 -1
  198. data/lib/puppet/type/file/mode.rb +1 -1
  199. data/lib/puppet/type/file/selcontext.rb +6 -2
  200. data/lib/puppet/type/file/source.rb +1 -1
  201. data/lib/puppet/type/mount.rb +1 -1
  202. data/lib/puppet/type/package.rb +1 -1
  203. data/lib/puppet/type/schedule.rb +1 -1
  204. data/lib/puppet/type/scheduled_task.rb +1 -1
  205. data/lib/puppet/type/tidy.rb +1 -1
  206. data/lib/puppet/type/whit.rb +16 -9
  207. data/lib/puppet/util.rb +27 -11
  208. data/lib/puppet/util/adsi.rb +25 -23
  209. data/lib/puppet/util/autoload.rb +1 -1
  210. data/lib/puppet/util/classgen.rb +1 -1
  211. data/lib/puppet/util/feature.rb +3 -1
  212. data/lib/puppet/util/fileparsing.rb +9 -9
  213. data/lib/puppet/util/filetype.rb +55 -40
  214. data/lib/puppet/util/instance_loader.rb +5 -5
  215. data/lib/puppet/util/instrumentation.rb +3 -5
  216. data/lib/puppet/util/log_paths.rb +1 -3
  217. data/lib/puppet/util/monkey_patches.rb +34 -8
  218. data/lib/puppet/util/platform.rb +7 -0
  219. data/lib/puppet/util/posix.rb +3 -3
  220. data/lib/puppet/util/provider_features.rb +2 -3
  221. data/lib/puppet/util/rdoc.rb +4 -3
  222. data/lib/puppet/util/reference.rb +1 -1
  223. data/lib/puppet/util/selinux.rb +31 -36
  224. data/lib/puppet/util/tagging.rb +28 -6
  225. data/lib/puppet/util/windows.rb +1 -0
  226. data/lib/puppet/util/windows/error.rb +1 -1
  227. data/lib/puppet/util/windows/process.rb +3 -3
  228. data/lib/puppet/util/windows/security.rb +9 -46
  229. data/lib/puppet/util/windows/sid.rb +96 -0
  230. data/lib/puppet/util/windows/user.rb +65 -2
  231. data/lib/puppet/util/zaml.rb +109 -59
  232. data/lib/puppet/version.rb +18 -0
  233. data/spec/fixtures/unit/util/filetype/aixtab_output +44 -0
  234. data/spec/fixtures/unit/util/filetype/suntab_output +9 -0
  235. data/spec/integration/defaults_spec.rb +26 -7
  236. data/spec/integration/parser/functions_spec.rb +0 -4
  237. data/spec/integration/util/file_locking_spec.rb +1 -1
  238. data/spec/integration/util/windows/security_spec.rb +3 -23
  239. data/spec/lib/puppet_spec/files.rb +3 -3
  240. data/spec/shared_contexts/platform.rb +8 -0
  241. data/spec/spec_helper.rb +6 -1
  242. data/spec/unit/application/queue_spec.rb +2 -1
  243. data/spec/unit/configurer_spec.rb +1 -1
  244. data/spec/unit/face/{instrumentation_data.rb → instrumentation_data_spec.rb} +0 -0
  245. data/spec/unit/face/{instrumentation_listener.rb → instrumentation_listener_spec.rb} +0 -0
  246. data/spec/unit/face/{instrumentation_probe.rb → instrumentation_probe_spec.rb} +0 -0
  247. data/spec/unit/indirector/catalog/static_compiler_spec.rb +194 -0
  248. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +33 -0
  249. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +33 -0
  250. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +33 -0
  251. data/spec/unit/indirector/key/disabled_ca_spec.rb +33 -0
  252. data/spec/unit/indirector/request_spec.rb +22 -0
  253. data/spec/unit/network/http/webrick_spec.rb +0 -7
  254. data/spec/unit/node/environment_spec.rb +8 -8
  255. data/spec/unit/parser/ast_spec.rb +0 -5
  256. data/spec/unit/parser/collector_spec.rb +1 -0
  257. data/spec/unit/parser/files_spec.rb +2 -2
  258. data/spec/unit/parser/functions/create_resources_spec.rb +3 -4
  259. data/spec/unit/parser/functions/require_spec.rb +0 -6
  260. data/spec/unit/parser/functions/shellquote_spec.rb +0 -5
  261. data/spec/unit/parser/functions/template_spec.rb +6 -1
  262. data/spec/unit/parser/functions_spec.rb +73 -23
  263. data/spec/unit/parser/lexer_spec.rb +133 -8
  264. data/spec/unit/parser/relationship_spec.rb +24 -0
  265. data/spec/unit/parser/resource_spec.rb +0 -4
  266. data/spec/unit/parser/scope_spec.rb +2 -2
  267. data/spec/unit/property_spec.rb +21 -1
  268. data/spec/unit/provider/exec/posix_spec.rb +7 -6
  269. data/spec/unit/provider/file/windows_spec.rb +29 -29
  270. data/spec/unit/provider/group/groupadd_spec.rb +36 -30
  271. data/spec/unit/provider/group/windows_adsi_spec.rb +2 -2
  272. data/spec/unit/provider/package/gem_spec.rb +12 -0
  273. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +14 -11
  274. data/spec/unit/provider/service/redhat_spec.rb +11 -1
  275. data/spec/unit/provider/service/windows_spec.rb +19 -0
  276. data/spec/unit/provider/user/ldap_spec.rb +22 -8
  277. data/spec/unit/provider/user/user_role_add_spec.rb +12 -0
  278. data/spec/unit/provider/user/useradd_spec.rb +146 -118
  279. data/spec/unit/provider/user/windows_adsi_spec.rb +24 -2
  280. data/spec/unit/puppet_spec.rb +10 -0
  281. data/spec/unit/resource/status_spec.rb +1 -1
  282. data/spec/unit/resource_spec.rb +73 -0
  283. data/spec/unit/ssl/certificate_authority_spec.rb +25 -1
  284. data/spec/unit/ssl/host_spec.rb +73 -27
  285. data/spec/unit/ssl/key_spec.rb +0 -4
  286. data/spec/unit/transaction/event_spec.rb +1 -1
  287. data/spec/unit/type/exec_spec.rb +1 -1
  288. data/spec/unit/type/file/content_spec.rb +6 -4
  289. data/spec/unit/type/file/{ctime.rb → ctime_spec.rb} +0 -0
  290. data/spec/unit/type/file/{mtime.rb → mtime_spec.rb} +0 -0
  291. data/spec/unit/type/file/{type.rb → type_spec.rb} +0 -0
  292. data/spec/unit/type/file_spec.rb +2 -12
  293. data/spec/unit/type/host_spec.rb +14 -5
  294. data/spec/unit/type/mount_spec.rb +8 -0
  295. data/spec/unit/type/scheduled_task_spec.rb +2 -2
  296. data/spec/unit/util/adsi_spec.rb +23 -8
  297. data/spec/unit/util/command_line_spec.rb +11 -2
  298. data/spec/unit/util/feature_spec.rb +12 -1
  299. data/spec/unit/util/filetype_spec.rb +161 -55
  300. data/spec/unit/util/log_spec.rb +1 -1
  301. data/spec/unit/util/monkey_patches_spec.rb +7 -0
  302. data/spec/unit/util/rdoc_spec.rb +8 -2
  303. data/spec/unit/util/selinux_spec.rb +24 -32
  304. data/spec/unit/util/windows/sid_spec.rb +100 -0
  305. data/spec/unit/util/zaml_spec.rb +165 -25
  306. data/spec/unit/util_spec.rb +3 -9
  307. data/spec/watchr.rb +2 -6
  308. data/tasks/rake/gem.rake +4 -2
  309. data/tasks/rake/sign.rake +1 -1
  310. data/test/language/parser.rb +1 -0
  311. data/test/language/scope.rb +0 -5
  312. data/test/language/snippets.rb +1 -2
  313. data/test/lib/puppettest.rb +16 -27
  314. data/test/lib/puppettest/parsertesting.rb +0 -1
  315. data/test/network/authstore.rb +2 -4
  316. data/test/puppet/defaults.rb +0 -4
  317. data/test/util/fileparsing.rb +2 -6
  318. metadata +1706 -1617
  319. data/conf/osx/preflight +0 -24
  320. data/spec/spec.opts +0 -4
  321. data/spec/unit/file_collection/lookup_spec.rb +0 -45
  322. data/spec/unit/file_collection_spec.rb +0 -52
  323. data/tasks/rake/apple.rake +0 -176
  324. data/test/puppet/errortest.rb +0 -19
@@ -283,6 +283,7 @@ describe Puppet::Type.type(:mount), "when modifying an existing mount entry", :u
283
283
  before do
284
284
  @provider = stub 'provider', :class => Puppet::Type.type(:mount).defaultprovider, :clear => nil, :satisfies? => true, :name => :mock, :remount => nil
285
285
  Puppet::Type.type(:mount).defaultprovider.stubs(:new).returns(@provider)
286
+
286
287
  @mount = Puppet::Type.type(:mount).new(:name => "yay", :ensure => :mounted)
287
288
 
288
289
  {:device => "/foo/bar", :blockdevice => "/other/bar", :target => "/what/ever", :fstype => 'eh', :options => "", :pass => 0, :dump => 0, :atboot => 0,
@@ -304,6 +305,8 @@ describe Puppet::Type.type(:mount), "when modifying an existing mount entry", :u
304
305
  it "should use the provider to change the dump value" do
305
306
  @mount.provider.expects(:dump).returns 0
306
307
  @mount.provider.expects(:dump=).with(1)
308
+ @mount.provider.stubs(:respond_to?).returns(false)
309
+ @mount.provider.stubs(:respond_to?).with("dump=").returns(true)
307
310
 
308
311
  @mount[:dump] = 1
309
312
 
@@ -315,11 +318,16 @@ describe Puppet::Type.type(:mount), "when modifying an existing mount entry", :u
315
318
  @mount.provider.expects(:options).returns 'soft'
316
319
  @mount.provider.expects(:ensure).returns :mounted
317
320
 
321
+ @mount.provider.stubs(:respond_to?).returns(false)
322
+ @mount.provider.stubs(:respond_to?).with("options=").returns(true)
323
+
318
324
  @mount.provider.expects(:unmount).in_sequence(syncorder)
319
325
  @mount.provider.expects(:options=).in_sequence(syncorder).with 'hard'
320
326
  @mount.expects(:flush).in_sequence(syncorder) # Call inside syncothers
321
327
  @mount.expects(:flush).in_sequence(syncorder) # I guess transaction or anything calls flush again
322
328
 
329
+ @mount.provider.stubs(:respond_to?).with(:options=).returns(true)
330
+
323
331
  @mount[:ensure] = :unmounted
324
332
  @mount[:options] = 'hard'
325
333
 
@@ -34,7 +34,7 @@ describe Puppet::Type.type(:scheduled_task), :if => Puppet.features.microsoft_wi
34
34
  described_class.new(:name => 'Test Task', :command => 'notepad.exe')
35
35
  }.to raise_error(
36
36
  Puppet::Error,
37
- /Parameter command failed: Must be specified using an absolute path\./
37
+ /Parameter command failed on Scheduled_task\[Test Task\]: Must be specified using an absolute path\./
38
38
  )
39
39
  end
40
40
  end
@@ -77,7 +77,7 @@ describe Puppet::Type.type(:scheduled_task), :if => Puppet.features.microsoft_wi
77
77
  )
78
78
  }.to raise_error(
79
79
  Puppet::Error,
80
- /Parameter working_dir failed: Must be specified using an absolute path/
80
+ /Parameter working_dir failed on Scheduled_task\[Test Task\]: Must be specified using an absolute path/
81
81
  )
82
82
  end
83
83
 
@@ -28,25 +28,21 @@ describe Puppet::Util::ADSI do
28
28
  Puppet::Util::ADSI.computer_uri.should == "WinNT://testcomputername"
29
29
  end
30
30
 
31
- describe ".sid_for_account" do
31
+ describe ".sid_for_account", :if => Puppet.features.microsoft_windows? do
32
32
  it "should return nil if the account does not exist" do
33
- connection.expects(:execquery).returns([])
33
+ Puppet::Util::Windows::Security.expects(:name_to_sid).with('foobar').returns nil
34
34
 
35
35
  Puppet::Util::ADSI.sid_for_account('foobar').should be_nil
36
36
  end
37
37
 
38
38
  it "should return a SID for a passed user or group name" do
39
- Puppet::Util::ADSI.expects(:execquery).with(
40
- "SELECT Sid from Win32_Account WHERE Name = 'testers' AND LocalAccount = true"
41
- ).returns([stub('acct_id', :Sid => 'S-1-5-32-547')])
39
+ Puppet::Util::Windows::Security.expects(:name_to_sid).with('testers').returns 'S-1-5-32-547'
42
40
 
43
41
  Puppet::Util::ADSI.sid_for_account('testers').should == 'S-1-5-32-547'
44
42
  end
45
43
 
46
44
  it "should return a SID for a passed fully-qualified user or group name" do
47
- Puppet::Util::ADSI.expects(:execquery).with(
48
- "SELECT Sid from Win32_Account WHERE Name = 'testers' AND Domain = 'MACHINE' AND LocalAccount = true"
49
- ).returns([stub('acct_id', :Sid => 'S-1-5-32-547')])
45
+ Puppet::Util::Windows::Security.expects(:name_to_sid).with('MACHINE\testers').returns 'S-1-5-32-547'
50
46
 
51
47
  Puppet::Util::ADSI.sid_for_account('MACHINE\testers').should == 'S-1-5-32-547'
52
48
  end
@@ -229,4 +225,23 @@ describe Puppet::Util::ADSI do
229
225
  Puppet::Util::ADSI::Group.delete(groupname)
230
226
  end
231
227
  end
228
+
229
+ describe Puppet::Util::ADSI::UserProfile do
230
+ it "should be able to delete a user profile" do
231
+ connection.expects(:Delete).with("Win32_UserProfile.SID='S-A-B-C'")
232
+ Puppet::Util::ADSI::UserProfile.delete('S-A-B-C')
233
+ end
234
+
235
+ it "should warn on 2003" do
236
+ connection.expects(:Delete).raises(RuntimeError,
237
+ "Delete (WIN32OLERuntimeError)
238
+ OLE error code:80041010 in SWbemServicesEx
239
+ Invalid class
240
+ HRESULT error code:0x80020009
241
+ Exception occurred.")
242
+
243
+ Puppet.expects(:warning).with("Cannot delete user profile for 'S-A-B-C' prior to Vista SP1")
244
+ Puppet::Util::ADSI::UserProfile.delete('S-A-B-C')
245
+ end
246
+ end
232
247
  end
@@ -87,9 +87,18 @@ describe Puppet::Util::CommandLine do
87
87
  it "should find and invoke an executable with a hyphenated name" do
88
88
  commandline = Puppet::Util::CommandLine.new("puppet", ['whatever', 'argument'], @tty)
89
89
  Puppet::Util.expects(:which).with('puppet-whatever').returns('/dev/null/puppet-whatever')
90
- commandline.expects(:exec).with('/dev/null/puppet-whatever', 'argument')
91
90
 
92
- commandline.execute
91
+ # It is important that we abort at the point exec is called, because
92
+ # the code (reasonably) assumes that if `exec` is called processing
93
+ # immediately terminates, and we are replaced by the executed process.
94
+ #
95
+ # This raise isn't a perfect simulation of that, but it is enough to
96
+ # validate that the system works, and ... well, if exec is broken we
97
+ # have two problems, y'know.
98
+ commandline.expects(:exec).with('/dev/null/puppet-whatever', 'argument').
99
+ raises(SystemExit)
100
+
101
+ expect { commandline.execute }.to raise_error SystemExit
93
102
  end
94
103
 
95
104
  describe "and an external implementation cannot be found" do
@@ -39,7 +39,7 @@ describe Puppet::Util::Feature do
39
39
  @features.should be_available
40
40
  end
41
41
 
42
- it "should cache the results of a feature load" do
42
+ it "should cache the results of a feature load via code block" do
43
43
  $loaded_feature = 0
44
44
  @features.add(:myfeature) { $loaded_feature += 1 }
45
45
  @features.myfeature?
@@ -68,4 +68,15 @@ describe Puppet::Util::Feature do
68
68
 
69
69
  @features.should_not be_myfeature
70
70
  end
71
+
72
+ it "should change the feature to be present when its libraries become available" do
73
+ @features.add(:myfeature, :libs => %w{foo bar})
74
+ @features.expects(:require).twice().with("foo").raises(LoadError).then.returns(nil)
75
+ @features.stubs(:require).with("bar")
76
+
77
+ Puppet.expects(:debug)
78
+
79
+ @features.should_not be_myfeature
80
+ @features.should be_myfeature
81
+ end
71
82
  end
@@ -5,58 +5,26 @@ require 'puppet/util/filetype'
5
5
 
6
6
  # XXX Import all of the tests into this file.
7
7
  describe Puppet::Util::FileType do
8
- describe "when backing up a file" do
9
- before do
10
- @file = Puppet::Util::FileType.filetype(:flat).new("/my/file")
11
- end
12
-
13
- it "should do nothing if the file does not exist" do
14
- File.expects(:exists?).with("/my/file").returns false
15
- @file.expects(:bucket).never
16
- @file.backup
17
- end
18
-
19
- it "should use its filebucket to backup the file if it exists" do
20
- File.expects(:exists?).with("/my/file").returns true
21
-
22
- bucket = mock 'bucket'
23
- bucket.expects(:backup).with("/my/file")
24
-
25
- @file.expects(:bucket).returns bucket
26
- @file.backup
27
- end
28
-
29
- it "should use the default filebucket" do
30
- bucket = mock 'bucket'
31
- bucket.expects(:bucket).returns "mybucket"
32
-
33
- Puppet::Type.type(:filebucket).expects(:mkdefaultbucket).returns bucket
34
-
35
- @file.bucket.should == "mybucket"
36
- end
37
- end
38
-
39
8
  describe "the flat filetype" do
40
- before do
41
- @type = Puppet::Util::FileType.filetype(:flat)
42
- end
9
+ let(:path) { '/my/file' }
10
+ let(:type) { Puppet::Util::FileType.filetype(:flat) }
11
+ let(:file) { type.new(path) }
12
+
43
13
  it "should exist" do
44
- @type.should_not be_nil
14
+ type.should_not be_nil
45
15
  end
46
16
 
47
17
  describe "when the file already exists" do
48
18
  it "should return the file's contents when asked to read it" do
49
- file = @type.new("/my/file")
50
- File.expects(:exist?).with("/my/file").returns true
51
- File.expects(:read).with("/my/file").returns "my text"
19
+ File.expects(:exist?).with(path).returns true
20
+ File.expects(:read).with(path).returns "my text"
52
21
 
53
22
  file.read.should == "my text"
54
23
  end
55
24
 
56
25
  it "should unlink the file when asked to remove it" do
57
- file = @type.new("/my/file")
58
- File.expects(:exist?).with("/my/file").returns true
59
- File.expects(:unlink).with("/my/file")
26
+ File.expects(:exist?).with(path).returns true
27
+ File.expects(:unlink).with(path)
60
28
 
61
29
  file.remove
62
30
  end
@@ -64,36 +32,174 @@ describe Puppet::Util::FileType do
64
32
 
65
33
  describe "when the file does not exist" do
66
34
  it "should return an empty string when asked to read the file" do
67
- file = @type.new("/my/file")
68
- File.expects(:exist?).with("/my/file").returns false
35
+ File.expects(:exist?).with(path).returns false
69
36
 
70
37
  file.read.should == ""
71
38
  end
72
39
  end
73
40
 
74
41
  describe "when writing the file" do
42
+ let(:tempfile) { stub 'tempfile', :print => nil, :close => nil, :flush => nil, :path => "/other/file" }
75
43
  before do
76
- @file = @type.new("/my/file")
77
44
  FileUtils.stubs(:cp)
78
-
79
- @tempfile = stub 'tempfile', :print => nil, :close => nil, :flush => nil, :path => "/other/file"
80
- Tempfile.stubs(:new).returns @tempfile
45
+ Tempfile.stubs(:new).returns tempfile
81
46
  end
82
47
 
83
48
  it "should first create a temp file and copy its contents over to the file location" do
84
- Tempfile.expects(:new).with("puppet").returns @tempfile
85
- @tempfile.expects(:print).with("my text")
86
- @tempfile.expects(:flush)
87
- @tempfile.expects(:close)
88
- FileUtils.expects(:cp).with(@tempfile.path, "/my/file")
49
+ Tempfile.expects(:new).with("puppet").returns tempfile
50
+ tempfile.expects(:print).with("my text")
51
+ tempfile.expects(:flush)
52
+ tempfile.expects(:close)
53
+ FileUtils.expects(:cp).with(tempfile.path, path)
89
54
 
90
- @file.write "my text"
55
+ file.write "my text"
91
56
  end
92
57
 
93
58
  it "should set the selinux default context on the file" do
94
- @file.expects(:set_selinux_default_context).with("/my/file")
95
- @file.write "eh"
59
+ file.expects(:set_selinux_default_context).with(path)
60
+ file.write "eh"
96
61
  end
97
62
  end
63
+
64
+ describe "when backing up a file" do
65
+ it "should do nothing if the file does not exist" do
66
+ File.expects(:exists?).with(path).returns false
67
+ file.expects(:bucket).never
68
+ file.backup
69
+ end
70
+
71
+ it "should use its filebucket to backup the file if it exists" do
72
+ File.expects(:exists?).with(path).returns true
73
+
74
+ bucket = mock 'bucket'
75
+ bucket.expects(:backup).with(path)
76
+
77
+ file.expects(:bucket).returns bucket
78
+ file.backup
79
+ end
80
+
81
+ it "should use the default filebucket" do
82
+ bucket = mock 'bucket'
83
+ bucket.expects(:bucket).returns "mybucket"
84
+
85
+ Puppet::Type.type(:filebucket).expects(:mkdefaultbucket).returns bucket
86
+
87
+ file.bucket.should == "mybucket"
88
+ end
89
+ end
90
+ end
91
+
92
+ shared_examples_for "crontab provider" do
93
+ let(:cron) { type.new('no_such_user') }
94
+ let(:crontab) { File.read(my_fixture(crontab_output)) }
95
+ let(:options) { { :failonfail => true, :combine => true } }
96
+ let(:uid) { 'no_such_user' }
97
+ let(:user_options) { options.merge({:uid => uid}) }
98
+
99
+ it "should exist" do
100
+ type.should_not be_nil
101
+ end
102
+
103
+ describe "#read" do
104
+ it "should run crontab -l as the target user" do
105
+ Puppet::Util.expects(:execute).with(['crontab', '-l'], user_options).returns crontab
106
+ cron.read.should == crontab
107
+ end
108
+
109
+ it "should not switch user if current user is the target user" do
110
+ Puppet::Util.expects(:uid).with(uid).returns 9000
111
+ Puppet::Util::SUIDManager.expects(:uid).returns 9000
112
+ Puppet::Util.expects(:execute).with(['crontab', '-l'], options).returns crontab
113
+ cron.read.should == crontab
114
+ end
115
+
116
+ it "should treat an absent crontab as empty" do
117
+ Puppet::Util.expects(:execute).with(['crontab', '-l'], user_options).raises(Puppet::ExecutionFailure, absent_crontab)
118
+ cron.read.should == ''
119
+ end
120
+
121
+ it "should raise an error if the user is not authorized to use cron" do
122
+ Puppet::Util.expects(:execute).with(['crontab', '-l'], user_options).raises(Puppet::ExecutionFailure, unauthorized_crontab)
123
+ expect {
124
+ cron.read
125
+ }.to raise_error Puppet::Error, /User #{uid} not authorized to use cron/
126
+ end
127
+ end
128
+
129
+ describe "#remove" do
130
+ it "should run crontab -r as the target user" do
131
+ Puppet::Util.expects(:execute).with(['crontab', '-r'], user_options)
132
+ cron.remove
133
+ end
134
+
135
+ it "should not switch user if current user is the target user" do
136
+ Puppet::Util.expects(:uid).with(uid).returns 9000
137
+ Puppet::Util::SUIDManager.expects(:uid).returns 9000
138
+ Puppet::Util.expects(:execute).with(['crontab','-r'], options)
139
+ cron.remove
140
+ end
141
+ end
142
+
143
+ describe "#write" do
144
+ before :each do
145
+ @tmp_cron = Tempfile.new("puppet_crontab_spec")
146
+ @tmp_cron_path = @tmp_cron.path
147
+ Puppet::Util.stubs(:uid).with(uid).returns 9000
148
+ Tempfile.expects(:new).with("puppet_#{name}").returns @tmp_cron
149
+ end
150
+
151
+ after :each do
152
+ File.should_not be_exist @tmp_cron_path
153
+ end
154
+
155
+ it "should run crontab as the target user on a temporary file" do
156
+ File.expects(:chown).with(9000, nil, @tmp_cron_path)
157
+ Puppet::Util.expects(:execute).with(["crontab", @tmp_cron_path], user_options)
158
+
159
+ @tmp_cron.expects(:print).with("foo\n")
160
+ cron.write "foo\n"
161
+ end
162
+
163
+ it "should not switch user if current user is the target user" do
164
+ Puppet::Util::SUIDManager.expects(:uid).returns 9000
165
+ File.expects(:chown).with(9000, nil, @tmp_cron_path)
166
+ Puppet::Util.expects(:execute).with(["crontab", @tmp_cron_path], options)
167
+
168
+ @tmp_cron.expects(:print).with("foo\n")
169
+ cron.write "foo\n"
170
+ end
171
+ end
172
+ end
173
+
174
+ describe "the suntab filetype", :unless => Puppet.features.microsoft_windows? do
175
+ let(:type) { Puppet::Util::FileType.filetype(:suntab) }
176
+ let(:name) { type.name }
177
+ let(:crontab_output) { 'suntab_output' }
178
+
179
+ # possible crontab output was taken from here:
180
+ # http://docs.oracle.com/cd/E19082-01/819-2380/sysrescron-60/index.html
181
+ let(:absent_crontab) do
182
+ 'crontab: can\'t open your crontab file'
183
+ end
184
+ let(:unauthorized_crontab) do
185
+ 'crontab: you are not authorized to use cron. Sorry.'
186
+ end
187
+
188
+ it_should_behave_like "crontab provider"
189
+ end
190
+
191
+ describe "the aixtab filetype", :unless => Puppet.features.microsoft_windows? do
192
+ let(:type) { Puppet::Util::FileType.filetype(:aixtab) }
193
+ let(:name) { type.name }
194
+ let(:crontab_output) { 'aixtab_output' }
195
+
196
+ let(:absent_crontab) do
197
+ '0481-103 Cannot open a file in the /var/spool/cron/crontabs directory.'
198
+ end
199
+ let(:unauthorized_crontab) do
200
+ '0481-109 You are not authorized to use the cron command.'
201
+ end
202
+
203
+ it_should_behave_like "crontab provider"
98
204
  end
99
205
  end
@@ -295,7 +295,7 @@ describe Puppet::Util::Log do
295
295
 
296
296
  it "should include attributes @level, @message, @source, @tags, and @time" do
297
297
  log = Puppet::Util::Log.new(:level => "notice", :message => :foo, :version => 100)
298
- log.to_yaml_properties.should == %w{@level @message @source @tags @time}
298
+ log.to_yaml_properties.should =~ %w{@level @message @source @tags @time}
299
299
  end
300
300
 
301
301
  it "should include attributes @file and @line if specified" do
@@ -4,6 +4,13 @@ require 'spec_helper'
4
4
  require 'puppet/util/monkey_patches'
5
5
 
6
6
 
7
+ describe Symbol do
8
+ it "should return self from #intern" do
9
+ symbol = :foo
10
+ symbol.should equal symbol.intern
11
+ end
12
+ end
13
+
7
14
 
8
15
  describe "yaml deserialization" do
9
16
  it "should call yaml_initialize when deserializing objects that have that method defined" do
@@ -62,8 +62,14 @@ describe Puppet::Util::RDoc do
62
62
  Puppet::Util::RDoc.rdoc("myoutputdir", [])
63
63
  end
64
64
 
65
- it "should tell RDoc to exclude .pp files under any modules/<mod>/files section" do
66
- @rdoc.expects(:document).with { |args| args.include?("--exclude") and args.include?("/modules/[^/]*/files/.*\.pp$") }
65
+ it "should tell RDoc to exclude all files under any modules/<mod>/files section" do
66
+ @rdoc.expects(:document).with { |args| args.include?("--exclude") and args.include?("/modules/[^/]*/files/.*$") }
67
+
68
+ Puppet::Util::RDoc.rdoc("myoutputdir", [])
69
+ end
70
+
71
+ it "should tell RDoc to exclude all files under any modules/<mod>/templates section" do
72
+ @rdoc.expects(:document).with { |args| args.include?("--exclude") and args.include?("/modules/[^/]*/templates/.*$") }
67
73
 
68
74
  Puppet::Util::RDoc.rdoc("myoutputdir", [])
69
75
  end