puppet 0.13.6 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (149) hide show
  1. data/CHANGELOG +57 -0
  2. data/Rakefile +38 -410
  3. data/bin/puppet +14 -12
  4. data/bin/puppetca +1 -3
  5. data/bin/puppetd +25 -7
  6. data/bin/puppetdoc +161 -104
  7. data/bin/puppetmasterd +4 -4
  8. data/conf/epm.list +8 -0
  9. data/conf/redhat/client.init +6 -1
  10. data/conf/redhat/no-chuser-0.15.1.patch +38 -0
  11. data/conf/redhat/puppet.spec +20 -5
  12. data/conf/redhat/puppetd.conf +1 -1
  13. data/conf/redhat/puppetmasterd.conf +1 -1
  14. data/conf/redhat/server.init +2 -4
  15. data/examples/code/snippets/{casestatement → casestatement.pp} +12 -1
  16. data/examples/code/snippets/selectorvalues.pp +15 -0
  17. data/examples/code/snippets/singleselector.pp +22 -0
  18. data/examples/code/snippets/tag.pp +9 -0
  19. data/ext/module_puppet +1 -1
  20. data/install.rb +303 -303
  21. data/lib/puppet.rb +7 -9
  22. data/lib/puppet/client.rb +18 -5
  23. data/lib/puppet/client/dipper.rb +12 -10
  24. data/lib/puppet/client/master.rb +113 -41
  25. data/lib/puppet/client/pelement.rb +20 -0
  26. data/lib/puppet/config.rb +113 -6
  27. data/lib/puppet/element.rb +1 -3
  28. data/lib/puppet/event.rb +12 -23
  29. data/lib/puppet/filetype.rb +93 -5
  30. data/lib/puppet/inifile.rb +201 -0
  31. data/lib/puppet/log.rb +18 -6
  32. data/lib/puppet/parameter.rb +80 -29
  33. data/lib/puppet/parser/ast.rb +6 -4
  34. data/lib/puppet/parser/ast/caseopt.rb +13 -4
  35. data/lib/puppet/parser/ast/casestatement.rb +2 -2
  36. data/lib/puppet/parser/ast/component.rb +4 -14
  37. data/lib/puppet/parser/ast/hostclass.rb +1 -1
  38. data/lib/puppet/parser/ast/leaf.rb +12 -0
  39. data/lib/puppet/parser/ast/node.rb +4 -4
  40. data/lib/puppet/parser/ast/objectdef.rb +5 -51
  41. data/lib/puppet/parser/ast/selector.rb +2 -0
  42. data/lib/puppet/parser/ast/tag.rb +26 -0
  43. data/lib/puppet/parser/interpreter.rb +89 -74
  44. data/lib/puppet/parser/lexer.rb +4 -3
  45. data/lib/puppet/parser/parser.rb +440 -378
  46. data/lib/puppet/parser/scope.rb +844 -887
  47. data/lib/puppet/server.rb +12 -1
  48. data/lib/puppet/server/authconfig.rb +166 -0
  49. data/lib/puppet/server/authstore.rb +8 -6
  50. data/lib/puppet/server/ca.rb +23 -26
  51. data/lib/puppet/server/filebucket.rb +24 -23
  52. data/lib/puppet/server/fileserver.rb +116 -47
  53. data/lib/puppet/server/master.rb +58 -19
  54. data/lib/puppet/server/pelement.rb +176 -0
  55. data/lib/puppet/server/rights.rb +78 -0
  56. data/lib/puppet/server/servlet.rb +19 -6
  57. data/lib/puppet/sslcertificates.rb +4 -2
  58. data/lib/puppet/sslcertificates/ca.rb +66 -34
  59. data/lib/puppet/storage.rb +20 -26
  60. data/lib/puppet/transaction.rb +49 -92
  61. data/lib/puppet/type.rb +142 -35
  62. data/lib/puppet/type/cron.rb +29 -14
  63. data/lib/puppet/type/exec.rb +92 -35
  64. data/lib/puppet/type/group.rb +29 -11
  65. data/lib/puppet/type/nameservice.rb +50 -1
  66. data/lib/puppet/type/nameservice/netinfo.rb +68 -1
  67. data/lib/puppet/type/nameservice/objectadd.rb +1 -0
  68. data/lib/puppet/type/package.rb +150 -109
  69. data/lib/puppet/type/package/apple.rb +27 -0
  70. data/lib/puppet/type/package/apt.rb +1 -0
  71. data/lib/puppet/type/package/darwinport.rb +97 -0
  72. data/lib/puppet/type/package/dpkg.rb +10 -2
  73. data/lib/puppet/type/package/freebsd.rb +19 -0
  74. data/lib/puppet/type/package/{bsd.rb → openbsd.rb} +36 -7
  75. data/lib/puppet/type/package/ports.rb +98 -0
  76. data/lib/puppet/type/package/rpm.rb +43 -7
  77. data/lib/puppet/type/package/sun.rb +53 -36
  78. data/lib/puppet/type/package/yum.rb +5 -16
  79. data/lib/puppet/type/parsedtype.rb +41 -29
  80. data/lib/puppet/type/parsedtype/host.rb +13 -5
  81. data/lib/puppet/type/parsedtype/mount.rb +250 -0
  82. data/lib/puppet/type/parsedtype/port.rb +8 -6
  83. data/lib/puppet/type/pfile.rb +284 -30
  84. data/lib/puppet/type/pfile/checksum.rb +96 -68
  85. data/lib/puppet/type/pfile/content.rb +16 -13
  86. data/lib/puppet/type/pfile/ensure.rb +64 -126
  87. data/lib/puppet/type/pfile/group.rb +12 -5
  88. data/lib/puppet/type/pfile/mode.rb +16 -4
  89. data/lib/puppet/type/pfile/source.rb +47 -73
  90. data/lib/puppet/type/pfile/target.rb +81 -0
  91. data/lib/puppet/type/pfile/uid.rb +10 -3
  92. data/lib/puppet/type/pfilebucket.rb +12 -3
  93. data/lib/puppet/type/schedule.rb +5 -1
  94. data/lib/puppet/type/service.rb +138 -66
  95. data/lib/puppet/type/service/debian.rb +9 -3
  96. data/lib/puppet/type/service/init.rb +51 -56
  97. data/lib/puppet/type/service/smf.rb +16 -6
  98. data/lib/puppet/type/state.rb +71 -32
  99. data/lib/puppet/type/symlink.rb +12 -7
  100. data/lib/puppet/type/tidy.rb +5 -1
  101. data/lib/puppet/type/user.rb +116 -20
  102. data/lib/puppet/type/yumrepo.rb +314 -0
  103. data/lib/puppet/util.rb +84 -14
  104. data/test/client/client.rb +41 -18
  105. data/test/client/master.rb +50 -4
  106. data/test/executables/puppetbin.rb +31 -4
  107. data/test/executables/puppetca.rb +18 -2
  108. data/test/language/ast.rb +201 -31
  109. data/test/language/interpreter.rb +8 -2
  110. data/test/{parser → language}/lexer.rb +1 -1
  111. data/test/language/node.rb +84 -0
  112. data/test/{parser → language}/parser.rb +1 -1
  113. data/test/language/scope.rb +101 -2
  114. data/test/language/snippets.rb +23 -2
  115. data/test/other/config.rb +99 -1
  116. data/test/other/filetype.rb +95 -0
  117. data/test/other/inifile.rb +114 -0
  118. data/test/other/log.rb +3 -2
  119. data/test/other/transactions.rb +55 -10
  120. data/test/puppet/utiltest.rb +25 -1
  121. data/test/puppettest.rb +140 -46
  122. data/test/server/authconfig.rb +56 -0
  123. data/test/server/bucket.rb +32 -18
  124. data/test/server/fileserver.rb +75 -30
  125. data/test/server/master.rb +27 -4
  126. data/test/server/pelement.rb +298 -0
  127. data/test/server/rights.rb +41 -0
  128. data/test/server/server.rb +2 -2
  129. data/test/tagging/tagging.rb +100 -1
  130. data/test/types/basic.rb +3 -3
  131. data/test/types/cron.rb +24 -1
  132. data/test/types/exec.rb +99 -1
  133. data/test/types/file.rb +298 -2
  134. data/test/types/filebucket.rb +4 -15
  135. data/test/types/filesources.rb +43 -14
  136. data/test/types/group.rb +1 -13
  137. data/test/types/mount.rb +277 -0
  138. data/test/types/package.rb +164 -33
  139. data/test/types/parameter.rb +107 -0
  140. data/test/types/port.rb +2 -1
  141. data/test/types/service.rb +37 -2
  142. data/test/types/state.rb +92 -0
  143. data/test/types/symlink.rb +30 -2
  144. data/test/types/tidy.rb +2 -14
  145. data/test/types/type.rb +35 -1
  146. data/test/types/user.rb +110 -1
  147. data/test/types/yumrepo.rb +95 -0
  148. metadata +316 -290
  149. data/test/types/filetype.rb +0 -160
@@ -41,7 +41,7 @@ class TestBasic < Test::Unit::TestCase
41
41
  :type => "init",
42
42
  :path => File.join($puppetbase,"examples/root/etc/init.d"),
43
43
  :hasstatus => true,
44
- :running => 1
44
+ :ensure => :running
45
45
  )
46
46
  }
47
47
  assert_nothing_raised() {
@@ -95,7 +95,7 @@ class TestBasic < Test::Unit::TestCase
95
95
  transaction.evaluate
96
96
  }
97
97
  assert_nothing_raised() {
98
- @sleeper[:running] = 0
98
+ @sleeper[:ensure] = :running
99
99
  }
100
100
  assert_nothing_raised() {
101
101
  transaction = @component.evaluate
@@ -114,4 +114,4 @@ class TestBasic < Test::Unit::TestCase
114
114
  end
115
115
  end
116
116
 
117
- # $Id: basic.rb 873 2006-02-07 23:12:33Z luke $
117
+ # $Id: basic.rb 1113 2006-04-17 16:15:33Z luke $
@@ -382,6 +382,29 @@ class TestCron < Test::Unit::TestCase
382
382
  }
383
383
  assert_equal(:absent, cron.is(:minute))
384
384
  end
385
+
386
+ def test_listing
387
+ @crontype.filetype = @oldfiletype
388
+
389
+ crons = []
390
+ assert_nothing_raised {
391
+ Puppet::Type.type(:cron).list.each do |cron|
392
+ crons << cron
393
+ end
394
+ }
395
+
396
+ crons.each do |cron|
397
+ assert(cron, "Did not receive a real cron object")
398
+ assert_instance_of(String, cron[:user],
399
+ "Cron user is not a string")
400
+ end
401
+ end
402
+
403
+ def verify_failonnouser
404
+ assert_raise(Puppet::Error) do
405
+ @crontype.retrieve("nosuchuser")
406
+ end
407
+ end
385
408
  end
386
409
 
387
- # $Id: cron.rb 910 2006-02-15 07:20:36Z luke $
410
+ # $Id: cron.rb 1125 2006-04-20 19:38:48Z luke $
@@ -432,6 +432,104 @@ class TestExec < Test::Unit::TestCase
432
432
  assert(FileTest.exists?(path), "Exec ran first")
433
433
  assert(File.stat(path).mode & 007777 == 0755)
434
434
  end
435
+
436
+ def test_falsevals
437
+ exec = nil
438
+ assert_nothing_raised do
439
+ exec = Puppet.type(:exec).create(
440
+ :command => "/bin/touch yayness"
441
+ )
442
+ end
443
+
444
+ Puppet.type(:exec).checks.each do |check|
445
+ klass = Puppet.type(:exec).paramclass(check)
446
+ next if klass.values.include? :false
447
+ assert_raise(Puppet::Error, "Check %s did not fail on false" % check) do
448
+ exec[check] = false
449
+ end
450
+ end
451
+ end
452
+
453
+ def test_createcwdandexe
454
+ exec1 = exec2 = nil
455
+ dir = tempfile()
456
+ file = tempfile()
457
+
458
+ assert_nothing_raised {
459
+ exec1 = Puppet.type(:exec).create(
460
+ :path => ENV["PATH"],
461
+ :command => "mkdir #{dir}"
462
+ )
463
+ }
464
+
465
+ assert_nothing_raised("Could not create exec w/out existing cwd") {
466
+ exec2 = Puppet.type(:exec).create(
467
+ :path => ENV["PATH"],
468
+ :command => "touch #{file}",
469
+ :cwd => dir
470
+ )
471
+ }
472
+
473
+ # Throw a check in there with our cwd and make sure it works
474
+ assert_nothing_raised("Could not check with a missing cwd") do
475
+ exec2[:unless] = "test -f /this/file/does/not/exist"
476
+ exec2.retrieve
477
+ end
478
+
479
+ assert_raise(Puppet::Error) do
480
+ exec2.state(:returns).sync
481
+ end
482
+
483
+ assert_nothing_raised do
484
+ exec2[:require] = ["exec", exec1.name]
485
+ exec2.finish
486
+ end
487
+
488
+ assert_apply(exec1, exec2)
489
+
490
+ assert(FileTest.exists?(file))
491
+ end
492
+
493
+ def test_checkarrays
494
+ exec = nil
495
+ file = tempfile()
496
+
497
+ test = "test -f #{file}"
498
+
499
+ assert_nothing_raised {
500
+ exec = Puppet.type(:exec).create(
501
+ :path => ENV["PATH"],
502
+ :command => "touch #{file}"
503
+ )
504
+ }
505
+
506
+ assert_nothing_raised {
507
+ exec[:unless] = test
508
+ }
509
+
510
+ assert_nothing_raised {
511
+ assert(exec.check, "Check did not pass")
512
+ }
513
+
514
+ assert_nothing_raised {
515
+ exec[:unless] = [test, test]
516
+ }
517
+
518
+
519
+ assert_nothing_raised {
520
+ exec.finish
521
+ }
522
+
523
+ assert_nothing_raised {
524
+ assert(exec.check, "Check did not pass")
525
+ }
526
+
527
+ assert_apply(exec)
528
+
529
+ assert_nothing_raised {
530
+ assert(! exec.check, "Check passed")
531
+ }
532
+ end
435
533
  end
436
534
 
437
- # $Id: exec.rb 965 2006-03-02 07:30:14Z luke $
535
+ # $Id: exec.rb 1089 2006-04-05 23:38:33Z luke $
@@ -41,7 +41,6 @@ class TestFile < Test::Unit::TestCase
41
41
  end
42
42
 
43
43
  def teardown
44
- clearstorage
45
44
  Puppet::Storage.clear
46
45
  system("rm -rf %s" % Puppet[:statefile])
47
46
  super
@@ -134,6 +133,78 @@ class TestFile < Test::Unit::TestCase
134
133
  assert_events([:file_created], comp)
135
134
  end
136
135
 
136
+ def test_nofollowlinks
137
+ basedir = tempfile()
138
+ Dir.mkdir(basedir)
139
+ file = File.join(basedir, "file")
140
+ link = File.join(basedir, "link")
141
+
142
+ File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
143
+ File.symlink(file, link)
144
+
145
+ # First test 'user'
146
+ user = nonrootuser()
147
+
148
+ inituser = File.lstat(link).uid
149
+ File.lchown(inituser, nil, link)
150
+
151
+ obj = nil
152
+ assert_nothing_raised {
153
+ obj = Puppet.type(:file).create(
154
+ :name => link,
155
+ :owner => user.name
156
+ )
157
+ }
158
+ obj.retrieve
159
+
160
+ # Make sure it defaults to managing the link
161
+ assert_events([:file_changed], obj)
162
+ assert_equal(user.uid, File.lstat(link).uid)
163
+ assert_equal(inituser, File.stat(file).uid)
164
+ File.chown(inituser, nil, file)
165
+ File.lchown(inituser, nil, link)
166
+
167
+ # Try following
168
+ obj[:links] = :follow
169
+ assert_events([:file_changed], obj)
170
+ assert_equal(user.uid, File.stat(file).uid)
171
+ assert_equal(inituser, File.lstat(link).uid)
172
+
173
+ # And then explicitly managing
174
+ File.chown(inituser, nil, file)
175
+ File.lchown(inituser, nil, link)
176
+ obj[:links] = :manage
177
+ assert_events([:file_changed], obj)
178
+ assert_equal(user.uid, File.lstat(link).uid)
179
+ assert_equal(inituser, File.stat(file).uid)
180
+
181
+ obj.delete(:owner)
182
+ obj[:links] = :ignore
183
+
184
+ # And then test 'group'
185
+ group = nonrootgroup
186
+
187
+ initgroup = File.stat(file).gid
188
+ obj[:group] = group.name
189
+
190
+ assert_events([:file_changed], obj)
191
+ assert_equal(initgroup, File.stat(file).gid)
192
+ assert_equal(group.gid, File.lstat(link).gid)
193
+ File.chown(nil, initgroup, file)
194
+ File.lchown(nil, initgroup, link)
195
+
196
+ obj[:links] = :follow
197
+ assert_events([:file_changed], obj)
198
+ assert_equal(group.gid, File.stat(file).gid)
199
+ File.chown(nil, initgroup, file)
200
+ File.lchown(nil, initgroup, link)
201
+
202
+ obj[:links] = :manage
203
+ assert_events([:file_changed], obj)
204
+ assert_equal(group.gid, File.lstat(link).gid)
205
+ assert_equal(initgroup, File.stat(file).gid)
206
+ end
207
+
137
208
  def test_ownerasroot
138
209
  file = mktestfile()
139
210
 
@@ -781,6 +852,231 @@ class TestFile < Test::Unit::TestCase
781
852
  assert_apply(file)
782
853
  assert_equal(0777, File.stat(path).mode & 007777)
783
854
  end
855
+
856
+ def test_followlinks
857
+ basedir = tempfile()
858
+ Dir.mkdir(basedir)
859
+ file = File.join(basedir, "file")
860
+ link = File.join(basedir, "link")
861
+
862
+ File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
863
+ File.symlink(file, link)
864
+
865
+ obj = nil
866
+ assert_nothing_raised {
867
+ obj = Puppet.type(:file).create(
868
+ :name => link,
869
+ :mode => "755"
870
+ )
871
+ }
872
+ obj.retrieve
873
+
874
+ assert_events([], obj)
875
+
876
+ # Assert that we default to not following links
877
+ assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
878
+
879
+ # Assert that we can manage the link directly, but modes still don't change
880
+ obj[:links] = :manage
881
+ assert_events([], obj)
882
+
883
+ assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
884
+
885
+ obj[:links] = :follow
886
+ assert_events([:file_changed], obj)
887
+
888
+ assert_equal("%o" % 0755, "%o" % (File.stat(file).mode & 007777))
889
+
890
+ # Now verify that content and checksum don't update, either
891
+ obj.delete(:mode)
892
+ obj[:checksum] = "md5"
893
+ obj[:links] = :ignore
894
+
895
+ assert_events([], obj)
896
+ File.open(file, "w") { |f| f.puts "more text" }
897
+ assert_events([], obj)
898
+ obj[:links] = :follow
899
+ assert_events([], obj)
900
+ File.open(file, "w") { |f| f.puts "even more text" }
901
+ assert_events([:file_changed], obj)
902
+
903
+ obj.delete(:checksum)
904
+ obj[:content] = "this is some content"
905
+ obj[:links] = :ignore
906
+
907
+ assert_events([], obj)
908
+ File.open(file, "w") { |f| f.puts "more text" }
909
+ assert_events([], obj)
910
+ obj[:links] = :follow
911
+ assert_events([:file_changed], obj)
912
+ end
913
+
914
+ # If both 'ensure' and 'content' are used, make sure that all of the other
915
+ # states are handled correctly.
916
+ def test_contentwithmode
917
+ path = tempfile()
918
+
919
+ file = nil
920
+ assert_nothing_raised {
921
+ file = Puppet.type(:file).create(
922
+ :path => path,
923
+ :ensure => "file",
924
+ :content => "some text\n",
925
+ :mode => 0755
926
+ )
927
+ }
928
+
929
+ assert_apply(file)
930
+ assert_equal("%o" % 0755, "%o" % (File.stat(path).mode & 007777))
931
+ end
932
+
933
+ # Make sure we can create symlinks
934
+ def test_symlinks
935
+ path = tempfile()
936
+ link = tempfile()
937
+
938
+ File.open(path, "w") { |f| f.puts "yay" }
939
+
940
+ file = nil
941
+ assert_nothing_raised {
942
+ file = Puppet.type(:file).create(
943
+ :ensure => path,
944
+ :path => link
945
+ )
946
+ }
947
+
948
+ assert_events([:link_created], file)
949
+
950
+ assert(FileTest.symlink?(link), "Link was not created")
951
+
952
+ assert_equal(path, File.readlink(link), "Link was created incorrectly")
953
+
954
+ # Make sure running it again works
955
+ assert_events([], file)
956
+ end
957
+
958
+ def test_simplerecursivelinking
959
+ source = tempfile()
960
+ dest = tempfile()
961
+ subdir = File.join(source, "subdir")
962
+ file = File.join(subdir, "file")
963
+
964
+ system("mkdir -p %s" % subdir)
965
+ system("touch %s" % file)
966
+
967
+ link = nil
968
+ assert_nothing_raised {
969
+ link = Puppet.type(:file).create(
970
+ :ensure => source,
971
+ :path => dest,
972
+ :recurse => true
973
+ )
974
+ }
975
+
976
+ assert_apply(link)
977
+
978
+ subdest = File.join(dest, "subdir")
979
+ linkpath = File.join(subdest, "file")
980
+ assert(File.directory?(dest), "dest is not a dir")
981
+ assert(File.directory?(subdest), "subdest is not a dir")
982
+ assert(File.symlink?(linkpath), "path is not a link")
983
+ assert_equal(file, File.readlink(linkpath))
984
+
985
+ assert_events([], link)
986
+ end
987
+
988
+ def test_recursivelinking
989
+ source = tempfile()
990
+ dest = tempfile()
991
+
992
+ files = []
993
+ dirs = []
994
+
995
+ # Make a bunch of files and dirs
996
+ Dir.mkdir(source)
997
+ Dir.chdir(source) do
998
+ system("mkdir -p %s" % "some/path/of/dirs")
999
+ system("mkdir -p %s" % "other/path/of/dirs")
1000
+ system("touch %s" % "file")
1001
+ system("touch %s" % "other/file")
1002
+ system("touch %s" % "some/path/of/file")
1003
+ system("touch %s" % "some/path/of/dirs/file")
1004
+ system("touch %s" % "other/path/of/file")
1005
+
1006
+ files = %x{find . -type f}.chomp.split(/\n/)
1007
+ dirs = %x{find . -type d}.chomp.split(/\n/).reject{|d| d =~ /^\.+$/ }
1008
+ end
1009
+
1010
+ link = nil
1011
+ assert_nothing_raised {
1012
+ link = Puppet.type(:file).create(
1013
+ :ensure => source,
1014
+ :path => dest,
1015
+ :recurse => true
1016
+ )
1017
+ }
1018
+
1019
+ assert_apply(link)
1020
+
1021
+ files.each do |f|
1022
+ f.sub!(/^\.#{File::SEPARATOR}/, '')
1023
+ path = File.join(dest, f)
1024
+ assert(FileTest.exists?(path), "Link %s was not created" % path)
1025
+ assert(FileTest.symlink?(path), "%s is not a link" % f)
1026
+ target = File.readlink(path)
1027
+ assert_equal(File.join(source, f), target)
1028
+ end
1029
+
1030
+ dirs.each do |d|
1031
+ d.sub!(/^\.#{File::SEPARATOR}/, '')
1032
+ path = File.join(dest, d)
1033
+ assert(FileTest.exists?(path), "Dir %s was not created" % path)
1034
+ assert(FileTest.directory?(path), "%s is not a directory" % d)
1035
+ end
1036
+ end
1037
+
1038
+ def test_localrelativelinks
1039
+ dir = tempfile()
1040
+ Dir.mkdir(dir)
1041
+ source = File.join(dir, "source")
1042
+ File.open(source, "w") { |f| f.puts "yay" }
1043
+ dest = File.join(dir, "link")
1044
+
1045
+ link = nil
1046
+ assert_nothing_raised {
1047
+ link = Puppet.type(:file).create(
1048
+ :path => dest,
1049
+ :ensure => "source"
1050
+ )
1051
+ }
1052
+
1053
+ assert_events([:link_created], link)
1054
+ assert(FileTest.symlink?(dest), "Did not create link")
1055
+ assert_equal("source", File.readlink(dest))
1056
+ assert_equal("yay\n", File.read(dest))
1057
+ end
1058
+
1059
+ def test_recursivelinkingmissingtarget
1060
+ source = tempfile()
1061
+ dest = tempfile()
1062
+
1063
+ objects = []
1064
+ objects << Puppet.type(:exec).create(
1065
+ :command => "mkdir %s; touch %s/file" % [source, source],
1066
+ :path => ENV["PATH"]
1067
+ )
1068
+ objects << Puppet.type(:file).create(
1069
+ :ensure => source,
1070
+ :path => dest,
1071
+ :recurse => true
1072
+ )
1073
+
1074
+ assert_apply(*objects)
1075
+
1076
+ link = File.join(dest, "file")
1077
+ assert(FileTest.symlink?(link), "Did not make link")
1078
+ assert_equal(File.join(source, "file"), File.readlink(link))
1079
+ end
784
1080
  end
785
1081
 
786
- # $Id: file.rb 966 2006-03-02 17:12:26Z luke $
1082
+ # $Id: file.rb 1001 2006-03-10 21:46:00Z luke $