puppet 2.7.6 → 2.7.8

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 (206) hide show
  1. data/CHANGELOG +168 -0
  2. data/conf/auth.conf +5 -4
  3. data/conf/redhat/puppet.spec +16 -1
  4. data/conf/solaris/pkginfo +2 -2
  5. data/conf/suse/puppet.spec +9 -3
  6. data/ext/upload_facts.rb +120 -0
  7. data/install.rb +11 -16
  8. data/lib/puppet.rb +1 -1
  9. data/lib/puppet/application/agent.rb +0 -3
  10. data/lib/puppet/application/apply.rb +0 -3
  11. data/lib/puppet/application/queue.rb +21 -1
  12. data/lib/puppet/defaults.rb +6 -4
  13. data/lib/puppet/face/file/store.rb +1 -1
  14. data/lib/puppet/feature/base.rb +2 -1
  15. data/lib/puppet/file_bucket/dipper.rb +3 -2
  16. data/lib/puppet/file_serving/content.rb +1 -1
  17. data/lib/puppet/file_serving/metadata.rb +5 -2
  18. data/lib/puppet/indirector/facts/inventory_service.rb +20 -0
  19. data/lib/puppet/indirector/file_bucket_file/file.rb +3 -2
  20. data/lib/puppet/indirector/report/processor.rb +1 -1
  21. data/lib/puppet/network/handler/filebucket.rb +2 -0
  22. data/lib/puppet/network/handler/fileserver.rb +1 -1
  23. data/lib/puppet/network/handler/master.rb +1 -0
  24. data/lib/puppet/network/handler/report.rb +2 -0
  25. data/lib/puppet/network/handler/runner.rb +1 -0
  26. data/lib/puppet/network/handler/status.rb +2 -0
  27. data/lib/puppet/network/http/mongrel/rest.rb +8 -1
  28. data/lib/puppet/network/http_server.rb +3 -0
  29. data/lib/puppet/network/http_server/mongrel.rb +129 -0
  30. data/lib/puppet/network/rest_authconfig.rb +12 -4
  31. data/lib/puppet/parameter.rb +18 -0
  32. data/lib/puppet/parser/compiler.rb +1 -1
  33. data/lib/puppet/parser/grammar.ra +1 -1
  34. data/lib/puppet/parser/parser.rb +360 -350
  35. data/lib/puppet/property.rb +3 -3
  36. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  37. data/lib/puppet/provider/exec/windows.rb +6 -7
  38. data/lib/puppet/provider/file/windows.rb +9 -2
  39. data/lib/puppet/provider/group/aix.rb +8 -8
  40. data/lib/puppet/provider/group/groupadd.rb +1 -3
  41. data/lib/puppet/provider/group/ldap.rb +8 -10
  42. data/lib/puppet/provider/group/windows_adsi.rb +8 -2
  43. data/lib/puppet/provider/package/aix.rb +1 -1
  44. data/lib/puppet/provider/package/macports.rb +3 -3
  45. data/lib/puppet/provider/package/msi.rb +12 -5
  46. data/lib/puppet/provider/package/nim.rb +1 -1
  47. data/lib/puppet/provider/package/pkgdmg.rb +3 -3
  48. data/lib/puppet/provider/package/ports.rb +1 -1
  49. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +560 -0
  50. data/lib/puppet/provider/service/base.rb +2 -2
  51. data/lib/puppet/provider/service/bsd.rb +4 -3
  52. data/lib/puppet/provider/service/daemontools.rb +25 -25
  53. data/lib/puppet/provider/service/debian.rb +6 -4
  54. data/lib/puppet/provider/service/freebsd.rb +1 -1
  55. data/lib/puppet/provider/service/gentoo.rb +4 -3
  56. data/lib/puppet/provider/service/init.rb +3 -8
  57. data/lib/puppet/provider/service/launchd.rb +129 -96
  58. data/lib/puppet/provider/service/redhat.rb +2 -3
  59. data/lib/puppet/provider/service/runit.rb +20 -20
  60. data/lib/puppet/provider/service/smf.rb +8 -7
  61. data/lib/puppet/provider/service/src.rb +5 -6
  62. data/lib/puppet/provider/service/systemd.rb +1 -1
  63. data/lib/puppet/provider/service/upstart.rb +3 -5
  64. data/lib/puppet/provider/service/windows.rb +7 -7
  65. data/lib/puppet/provider/sshkey/parsed.rb +2 -3
  66. data/lib/puppet/provider/user/aix.rb +21 -21
  67. data/lib/puppet/provider/user/hpux.rb +3 -1
  68. data/lib/puppet/provider/user/ldap.rb +7 -7
  69. data/lib/puppet/provider/user/user_role_add.rb +10 -6
  70. data/lib/puppet/provider/user/useradd.rb +3 -1
  71. data/lib/puppet/provider/user/windows_adsi.rb +4 -3
  72. data/lib/puppet/rb_tree_map.rb +388 -0
  73. data/lib/puppet/reference/configuration.rb +7 -7
  74. data/lib/puppet/reference/indirection.rb +5 -6
  75. data/lib/puppet/reference/metaparameter.rb +3 -1
  76. data/lib/puppet/reference/network.rb +8 -8
  77. data/lib/puppet/reference/providers.rb +17 -21
  78. data/lib/puppet/reference/type.rb +12 -9
  79. data/lib/puppet/resource.rb +2 -5
  80. data/lib/puppet/resource/catalog.rb +1 -1
  81. data/lib/puppet/ssl/certificate_request.rb +70 -0
  82. data/lib/puppet/ssl/host.rb +6 -0
  83. data/lib/puppet/transaction.rb +158 -55
  84. data/lib/puppet/transaction/event_manager.rb +1 -1
  85. data/lib/puppet/type.rb +60 -30
  86. data/lib/puppet/type/augeas.rb +83 -49
  87. data/lib/puppet/type/computer.rb +1 -1
  88. data/lib/puppet/type/cron.rb +11 -11
  89. data/lib/puppet/type/exec.rb +28 -21
  90. data/lib/puppet/type/file.rb +17 -7
  91. data/lib/puppet/type/file/content.rb +2 -2
  92. data/lib/puppet/type/file/ensure.rb +15 -12
  93. data/lib/puppet/type/file/mode.rb +30 -5
  94. data/lib/puppet/type/file/source.rb +11 -10
  95. data/lib/puppet/type/file/target.rb +2 -2
  96. data/lib/puppet/type/filebucket.rb +1 -1
  97. data/lib/puppet/type/group.rb +4 -5
  98. data/lib/puppet/type/host.rb +1 -1
  99. data/lib/puppet/type/interface.rb +13 -10
  100. data/lib/puppet/type/k5login.rb +6 -6
  101. data/lib/puppet/type/macauthorization.rb +37 -36
  102. data/lib/puppet/type/maillist.rb +2 -2
  103. data/lib/puppet/type/mcx.rb +6 -6
  104. data/lib/puppet/type/mount.rb +3 -2
  105. data/lib/puppet/type/notify.rb +1 -1
  106. data/lib/puppet/type/package.rb +24 -23
  107. data/lib/puppet/type/router.rb +4 -1
  108. data/lib/puppet/type/schedule.rb +52 -44
  109. data/lib/puppet/type/scheduled_task.rb +222 -0
  110. data/lib/puppet/type/selmodule.rb +10 -6
  111. data/lib/puppet/type/service.rb +11 -11
  112. data/lib/puppet/type/ssh_authorized_key.rb +2 -5
  113. data/lib/puppet/type/sshkey.rb +1 -1
  114. data/lib/puppet/type/stage.rb +1 -1
  115. data/lib/puppet/type/tidy.rb +10 -8
  116. data/lib/puppet/type/user.rb +61 -53
  117. data/lib/puppet/type/vlan.rb +4 -4
  118. data/lib/puppet/type/whit.rb +6 -2
  119. data/lib/puppet/type/yumrepo.rb +33 -31
  120. data/lib/puppet/type/zfs.rb +34 -32
  121. data/lib/puppet/type/zone.rb +21 -19
  122. data/lib/puppet/type/zpool.rb +3 -3
  123. data/lib/puppet/util.rb +24 -6
  124. data/lib/puppet/util/adsi.rb +12 -7
  125. data/lib/puppet/util/checksums.rb +1 -1
  126. data/lib/puppet/util/diff.rb +1 -1
  127. data/lib/puppet/util/nagios_maker.rb +2 -2
  128. data/lib/puppet/util/reference.rb +16 -17
  129. data/lib/puppet/util/settings/file_setting.rb +14 -2
  130. data/lib/puppet/util/windows/security.rb +96 -32
  131. data/spec/integration/file_serving/terminus_helper_spec.rb +1 -1
  132. data/spec/integration/indirector/direct_file_server_spec.rb +9 -15
  133. data/spec/integration/indirector/file_content/file_server_spec.rb +1 -1
  134. data/spec/integration/indirector/file_metadata/file_server_spec.rb +1 -1
  135. data/spec/integration/provider/package_spec.rb +4 -0
  136. data/spec/integration/provider/service/init_spec.rb +8 -2
  137. data/spec/integration/reference/providers_spec.rb +1 -1
  138. data/spec/integration/ssl/certificate_request_spec.rb +1 -2
  139. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -2
  140. data/spec/integration/ssl/host_spec.rb +1 -2
  141. data/spec/integration/transaction_spec.rb +25 -17
  142. data/spec/integration/type/exec_spec.rb +77 -0
  143. data/spec/integration/type/file_spec.rb +322 -2
  144. data/spec/integration/util/windows/security_spec.rb +393 -230
  145. data/spec/integration/util_spec.rb +16 -0
  146. data/spec/lib/puppet_spec/files.rb +3 -7
  147. data/spec/unit/application/apply_spec.rb +0 -9
  148. data/spec/unit/application/inspect_spec.rb +1 -0
  149. data/spec/unit/configurer/downloader_spec.rb +3 -3
  150. data/spec/unit/face/certificate_spec.rb +6 -2
  151. data/spec/unit/file_bucket/dipper_spec.rb +67 -10
  152. data/spec/unit/file_bucket/file_spec.rb +22 -28
  153. data/spec/unit/file_serving/content_spec.rb +1 -1
  154. data/spec/unit/file_serving/metadata_spec.rb +30 -3
  155. data/spec/unit/indirector/facts/inventory_service_spec.rb +22 -0
  156. data/spec/unit/indirector/file_bucket_file/file_spec.rb +21 -24
  157. data/spec/unit/indirector/node/store_configs_spec.rb +1 -0
  158. data/spec/unit/indirector/resource/ral_spec.rb +1 -1
  159. data/spec/unit/indirector/resource_type/parser_spec.rb +2 -2
  160. data/spec/unit/indirector/rest_spec.rb +1 -1
  161. data/spec/unit/network/handler/ca_spec.rb +1 -1
  162. data/spec/unit/network/http/mongrel/rest_spec.rb +54 -25
  163. data/spec/unit/parameter_spec.rb +36 -0
  164. data/spec/unit/parser/parser_spec.rb +4 -0
  165. data/spec/unit/property_spec.rb +2 -2
  166. data/spec/unit/provider/exec/windows_spec.rb +2 -8
  167. data/spec/unit/provider/file/posix_spec.rb +6 -0
  168. data/spec/unit/provider/file/windows_spec.rb +18 -0
  169. data/spec/unit/provider/group/windows_adsi_spec.rb +22 -6
  170. data/spec/unit/provider/mount/parsed_spec.rb +1 -1
  171. data/spec/unit/provider/package/msi_spec.rb +2 -2
  172. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +1571 -0
  173. data/spec/unit/provider/service/launchd_spec.rb +143 -130
  174. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +5 -0
  175. data/spec/unit/provider/user/user_role_add_spec.rb +39 -9
  176. data/spec/unit/provider/user/useradd_spec.rb +1 -1
  177. data/spec/unit/provider/user/windows_adsi_spec.rb +8 -1
  178. data/spec/unit/rb_tree_map_spec.rb +572 -0
  179. data/spec/unit/resource/catalog_spec.rb +1 -1
  180. data/spec/unit/simple_graph_spec.rb +9 -9
  181. data/spec/unit/ssl/host_spec.rb +60 -12
  182. data/spec/unit/transaction/report_spec.rb +3 -3
  183. data/spec/unit/transaction_spec.rb +394 -11
  184. data/spec/unit/type/exec_spec.rb +35 -15
  185. data/spec/unit/type/file/content_spec.rb +11 -10
  186. data/spec/unit/type/file/mode_spec.rb +73 -19
  187. data/spec/unit/type/file/source_spec.rb +1 -1
  188. data/spec/unit/type/file_spec.rb +15 -0
  189. data/spec/unit/type/group_spec.rb +1 -1
  190. data/spec/unit/type/mount_spec.rb +5 -5
  191. data/spec/unit/type/resources_spec.rb +3 -3
  192. data/spec/unit/type/scheduled_task_spec.rb +102 -0
  193. data/spec/unit/type/ssh_authorized_key_spec.rb +2 -3
  194. data/spec/unit/type/user_spec.rb +2 -1
  195. data/spec/unit/type_spec.rb +48 -4
  196. data/spec/unit/util/adsi_spec.rb +18 -7
  197. data/spec/unit/util/checksums_spec.rb +20 -2
  198. data/spec/unit/util/execution_stub_spec.rb +10 -5
  199. data/spec/unit/util/logging_spec.rb +6 -6
  200. data/spec/unit/util/rdoc/parser_spec.rb +1 -1
  201. data/spec/unit/util/reference_spec.rb +29 -0
  202. data/spec/unit/util/settings/file_setting_spec.rb +8 -2
  203. data/spec/unit/util_spec.rb +115 -0
  204. data/test/other/transactions.rb +5 -11
  205. data/test/ral/type/exec.rb +1 -1
  206. metadata +24 -11
@@ -1,203 +1,216 @@
1
- #!/usr/bin/env rspec
2
- #
3
- # Unit testing for the launchd service provider
1
+ # Spec Tests for the Launchd provider
4
2
  #
5
3
 
6
4
  require 'spec_helper'
7
5
 
8
- require 'puppet'
9
-
10
- provider_class = Puppet::Type.type(:service).provider(:launchd)
11
-
12
- describe provider_class do
13
-
14
- before :each do
15
- # Create a mock resource
16
- @resource = stub 'resource'
17
-
18
- @provider = provider_class.new
19
- @joblabel = "com.foo.food"
20
- @jobplist = {}
21
-
22
- # A catch all; no parameters set
23
- @resource.stubs(:[]).returns(nil)
24
-
25
- # But set name, ensure and enable
26
- @resource.stubs(:[]).with(:name).returns @joblabel
27
- @resource.stubs(:[]).with(:ensure).returns :enabled
28
- @resource.stubs(:[]).with(:enable).returns :true
29
- @resource.stubs(:ref).returns "Service[#{@joblabel}]"
30
-
31
- # stub out the provider methods that actually touch the filesystem
32
- # or execute commands
33
- @provider.stubs(:plist_from_label).returns([@joblabel, @jobplist])
34
- @provider.stubs(:execute).returns("")
35
- @provider.stubs(:resource).returns @resource
36
-
37
- # We stub this out for the normal case as 10.6 is "special".
38
- provider_class.stubs(:get_macosx_version_major).returns("10.5")
39
-
40
- end
41
-
42
- it "should have a start method for #{@provider.object_id}" do
43
- @provider.should respond_to(:start)
44
- end
45
-
46
- it "should have a stop method" do
47
- @provider.should respond_to(:stop)
48
- end
6
+ describe Puppet::Type.type(:service).provider(:launchd) do
7
+ let (:joblabel) { "com.foo.food" }
8
+ let (:provider) { subject.class }
9
+ let (:launchd_overrides) { '/var/db/launchd.db/com.apple.launchd/overrides.plist' }
49
10
 
50
- it "should have an enabled? method" do
51
- @provider.should respond_to(:enabled?)
52
- end
53
-
54
- it "should have an enable method" do
55
- @provider.should respond_to(:enable)
56
- end
57
-
58
- it "should have a disable method" do
59
- @provider.should respond_to(:disable)
60
- end
61
-
62
- it "should have a status method" do
63
- @provider.should respond_to(:status)
11
+ describe "the type interface" do
12
+ %w{ start stop enabled? enable disable status}.each do |method|
13
+ it { should respond_to method.to_sym }
14
+ end
64
15
  end
65
16
 
66
-
67
- describe "when checking status" do
17
+ describe 'the status of the services' do
68
18
  it "should call the external command 'launchctl list' once" do
69
- @provider.expects(:launchctl).with(:list).returns("rotating-strawberry-madonnas")
70
- @provider.status
19
+ provider.expects(:launchctl).with(:list).returns(joblabel)
20
+ provider.expects(:jobsearch).with(nil).returns({joblabel => "/Library/LaunchDaemons/#{joblabel}"})
21
+ provider.prefetch({})
71
22
  end
72
23
  it "should return stopped if not listed in launchctl list output" do
73
- @provider.stubs(:launchctl).with(:list).returns("rotating-strawberry-madonnas")
74
- @provider.status.should == :stopped
24
+ provider.expects(:launchctl).with(:list).returns('com.bar.is_running')
25
+ provider.expects(:jobsearch).with(nil).returns({'com.bar.is_not_running' => "/Library/LaunchDaemons/com.bar.is_not_running"})
26
+ provider.prefetch({}).last.status.should eq :stopped
75
27
  end
76
28
  it "should return running if listed in launchctl list output" do
77
- @provider.stubs(:launchctl).with(:list).returns(@joblabel)
78
- @provider.status.should == :running
29
+ provider.expects(:launchctl).with(:list).returns('com.bar.is_running')
30
+ provider.expects(:jobsearch).with(nil).returns({'com.bar.is_running' => "/Library/LaunchDaemons/com.bar.is_running"})
31
+ provider.prefetch({}).last.status.should eq :running
32
+ end
33
+ after :each do
34
+ provider.instance_variable_set(:@job_list, nil)
79
35
  end
80
36
  end
81
37
 
82
- describe "when checking whether the service is enabled" do
83
- it "should return true if the job plist says disabled is false" do
84
- @provider.stubs(:plist_from_label).returns(["foo", {"Disabled" => false}])
85
- @provider.enabled?.should == :true
38
+ describe "when checking whether the service is enabled on OS X 10.5" do
39
+ it "should return true in if the job plist says disabled is false" do
40
+ Facter.stubs(:value).with(:macosx_productversion_major).returns('10.5')
41
+ Facter.stubs(:value).with(:kernel).returns('Darwin')
42
+ Facter.stubs(:value).with(:macaddress).returns('')
43
+ Facter.stubs(:value).with(:arp).returns('')
44
+ subject.expects(:plist_from_label).with(joblabel).returns(["foo", {"Disabled" => false}])
45
+ subject.expects(:resource).returns({:name => joblabel})
46
+ subject.enabled?.should == :true
86
47
  end
87
- it "should return true if the job plist has no disabled key" do
88
- @provider.stubs(:plist_from_label).returns(["foo", {}])
89
- @provider.enabled?.should == :true
48
+ it "should return true in if the job plist has no disabled key" do
49
+ subject.expects(:resource).returns({:name => joblabel})
50
+ subject.stubs(:plist_from_label).returns(["foo", {}])
51
+ subject.enabled?.should == :true
90
52
  end
91
- it "should return false if the job plist says disabled is true" do
92
- @provider.stubs(:plist_from_label).returns(["foo", {"Disabled" => true}])
93
- @provider.enabled?.should == :false
53
+ it "should return false in if the job plist says disabled is true" do
54
+ subject.expects(:resource).returns({:name => joblabel})
55
+ subject.stubs(:plist_from_label).returns(["foo", {"Disabled" => true}])
56
+ subject.enabled?.should == :false
94
57
  end
95
58
  end
96
59
 
97
60
  describe "when checking whether the service is enabled on OS X 10.6" do
98
61
  it "should return true if the job plist says disabled is true and the global overrides says disabled is false" do
99
- provider_class.stubs(:get_macosx_version_major).returns("10.6")
100
- @provider.stubs(:plist_from_label).returns(["foo", {"Disabled" => true}])
101
- @provider.class.stubs(:read_plist).returns({@resource[:name] => {"Disabled" => false}})
102
- FileTest.expects(:file?).with(Launchd_Overrides).returns(true)
103
- @provider.enabled?.should == :true
62
+ provider.expects(:get_macosx_version_major).returns("10.6")
63
+ subject.expects(:plist_from_label).returns([joblabel, {"Disabled" => true}])
64
+ provider.stubs(:read_plist).returns({joblabel => {"Disabled" => false}})
65
+ FileTest.expects(:file?).with(launchd_overrides).returns(true)
66
+ subject.stubs(:resource).returns({:name => joblabel})
67
+ subject.enabled?.should == :true
104
68
  end
105
69
  it "should return false if the job plist says disabled is false and the global overrides says disabled is true" do
106
- provider_class.stubs(:get_macosx_version_major).returns("10.6")
107
- @provider.stubs(:plist_from_label).returns(["foo", {"Disabled" => false}])
108
- @provider.class.stubs(:read_plist).returns({@resource[:name] => {"Disabled" => true}})
109
- FileTest.expects(:file?).with(Launchd_Overrides).returns(true)
110
- @provider.enabled?.should == :false
70
+ provider.expects(:get_macosx_version_major).returns("10.6")
71
+ subject.expects(:plist_from_label).returns([joblabel, {"Disabled" => false}])
72
+ provider.stubs(:read_plist).returns({joblabel => {"Disabled" => true}})
73
+ FileTest.expects(:file?).with(launchd_overrides).returns(true)
74
+ subject.stubs(:resource).returns({:name => joblabel})
75
+ subject.enabled?.should == :false
111
76
  end
112
77
  it "should return true if the job plist and the global overrides have no disabled keys" do
113
- provider_class.stubs(:get_macosx_version_major).returns("10.6")
114
- @provider.stubs(:plist_from_label).returns(["foo", {}])
115
- @provider.class.stubs(:read_plist).returns({})
116
- FileTest.expects(:file?).with(Launchd_Overrides).returns(true)
117
- @provider.enabled?.should == :true
78
+ provider.expects(:get_macosx_version_major).returns("10.6")
79
+ subject.expects(:plist_from_label).returns([joblabel, {}])
80
+ provider.stubs(:read_plist).returns({})
81
+ FileTest.expects(:file?).with(launchd_overrides).returns(true)
82
+ subject.stubs(:resource).returns({:name => joblabel})
83
+ subject.enabled?.should == :true
118
84
  end
119
85
  end
120
86
 
121
87
  describe "when starting the service" do
122
88
  it "should look for the relevant plist once" do
123
- @provider.expects(:plist_from_label).once
124
- @provider.start
125
- end
126
- it "should execute 'launchctl load' once without writing to the plist if the job is enabled" do
127
- @provider.stubs(:enabled?).returns :true
128
- @provider.expects(:execute).with([:launchctl, :load, @resource[:name]]).once
129
- @provider.start
89
+ subject.expects(:plist_from_label).returns([joblabel, {}]).once
90
+ subject.stubs(:enabled?).returns :true
91
+ subject.stubs(:execute).with([:launchctl, :load, joblabel])
92
+ subject.stubs(:resource).returns({:name => joblabel})
93
+ subject.start
94
+ end
95
+ it "should execute 'launchctl load' once without writing to the plist if the job is enabled" do
96
+ subject.stubs(:plist_from_label).returns([joblabel, {}])
97
+ subject.stubs(:enabled?).returns :true
98
+ subject.expects(:execute).with([:launchctl, :load, joblabel]).once
99
+ subject.stubs(:resource).returns({:name => joblabel})
100
+ subject.start
130
101
  end
131
102
  it "should execute 'launchctl load' with writing to the plist once if the job is disabled" do
132
- @provider.stubs(:enabled?).returns :false
133
- @provider.expects(:execute).with([:launchctl, :load, "-w", @resource[:name]]).once
134
- @provider.start
103
+ subject.stubs(:plist_from_label).returns([joblabel, {}])
104
+ subject.stubs(:enabled?).returns(:false)
105
+ subject.stubs(:resource).returns({:name => joblabel})
106
+ subject.expects(:execute).with([:launchctl, :load, "-w", joblabel]).once
107
+ subject.start
135
108
  end
136
109
  it "should disable the job once if the job is disabled and should be disabled at boot" do
137
- @provider.stubs(:enabled?).returns :false
138
- @resource.stubs(:[]).with(:enable).returns :false
139
- @provider.expects(:disable).once
140
- @provider.start
110
+ subject.stubs(:plist_from_label).returns([joblabel, {"Disabled" => true}])
111
+ subject.stubs(:enabled?).returns :false
112
+ subject.stubs(:execute).with([:launchctl, :load, "-w", joblabel])
113
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :false})
114
+ subject.expects(:disable).once
115
+ subject.start
141
116
  end
142
117
  end
143
118
 
144
119
  describe "when stopping the service" do
145
120
  it "should look for the relevant plist once" do
146
- @provider.expects(:plist_from_label).once
147
- @provider.stop
121
+ subject.expects(:plist_from_label).returns([joblabel, {}]).once
122
+ subject.stubs(:enabled?).returns :true
123
+ subject.stubs(:execute).with([:launchctl, :unload, '-w', joblabel])
124
+ subject.stubs(:resource).returns({:name => joblabel})
125
+ subject.stop
148
126
  end
149
127
  it "should execute 'launchctl unload' once without writing to the plist if the job is disabled" do
150
- @provider.stubs(:enabled?).returns :false
151
- @provider.expects(:execute).with([:launchctl, :unload, @resource[:name]]).once
152
- @provider.stop
128
+ subject.stubs(:plist_from_label).returns([joblabel, {}])
129
+ subject.stubs(:enabled?).returns :false
130
+ subject.expects(:execute).with([:launchctl, :unload, joblabel]).once
131
+ subject.stubs(:resource).returns({:name => joblabel})
132
+ subject.stop
153
133
  end
154
134
  it "should execute 'launchctl unload' with writing to the plist once if the job is enabled" do
155
- @provider.stubs(:enabled?).returns :true
156
- @provider.expects(:execute).with([:launchctl, :unload, "-w", @resource[:name]]).once
157
- @provider.stop
135
+ subject.stubs(:plist_from_label).returns([joblabel, {}])
136
+ subject.stubs(:enabled?).returns :true
137
+ subject.expects(:execute).with([:launchctl, :unload, '-w', joblabel]).once
138
+ subject.stubs(:resource).returns({:name => joblabel})
139
+ subject.stop
158
140
  end
159
141
  it "should enable the job once if the job is enabled and should be enabled at boot" do
160
- @provider.stubs(:enabled?).returns :true
161
- @resource.stubs(:[]).with(:enable).returns :true
162
- @provider.expects(:enable).once
163
- @provider.stop
142
+ subject.stubs(:plist_from_label).returns([joblabel, {"Disabled" => false}])
143
+ subject.stubs(:enabled?).returns :true
144
+ subject.stubs(:execute).with([:launchctl, :unload, "-w", joblabel])
145
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :true})
146
+ subject.expects(:enable).once
147
+ subject.stop
164
148
  end
165
149
  end
166
150
 
167
151
  describe "when enabling the service" do
168
- it "should look for the relevant plist once" do
169
- @provider.expects(:plist_from_label).once
170
- @provider.stop
152
+ it "should look for the relevant plist once" do ### Do we need this test? Differentiating it?
153
+ subject.expects(:plist_from_label).returns([joblabel, {}]).once
154
+ subject.stubs(:enabled?).returns :false
155
+ subject.stubs(:execute).with([:launchctl, :unload, joblabel])
156
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :true})
157
+ subject.stop
171
158
  end
172
159
  it "should check if the job is enabled once" do
173
- @provider.expects(:enabled?).once
174
- @provider.stop
160
+ subject.stubs(:plist_from_label).returns([joblabel, {}]).once
161
+ subject.expects(:enabled?).once
162
+ subject.stubs(:execute).with([:launchctl, :unload, joblabel])
163
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :true})
164
+ subject.stop
175
165
  end
176
166
  end
177
167
 
178
168
  describe "when disabling the service" do
179
169
  it "should look for the relevant plist once" do
180
- @provider.expects(:plist_from_label).once
181
- @provider.stop
170
+ subject.expects(:plist_from_label).returns([joblabel, {}]).once
171
+ subject.stubs(:enabled?).returns :true
172
+ subject.stubs(:execute).with([:launchctl, :unload, '-w', joblabel])
173
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :false})
174
+ subject.stop
182
175
  end
183
176
  end
184
177
 
185
178
  describe "when enabling the service on OS X 10.6" do
186
179
  it "should write to the global launchd overrides file once" do
187
- provider_class.stubs(:get_macosx_version_major).returns("10.6")
188
- @provider.class.stubs(:read_plist).returns({})
180
+ provider.stubs(:get_macosx_version_major).returns("10.6")
181
+ provider.stubs(:read_plist).returns({})
189
182
  Plist::Emit.expects(:save_plist).once
190
- @provider.enable
183
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :true})
184
+ subject.enable
191
185
  end
192
186
  end
193
187
 
194
188
  describe "when disabling the service on OS X 10.6" do
195
189
  it "should write to the global launchd overrides file once" do
196
- provider_class.stubs(:get_macosx_version_major).returns("10.6")
197
- @provider.class.stubs(:read_plist).returns({})
190
+ provider.stubs(:get_macosx_version_major).returns("10.6")
191
+ provider.stubs(:read_plist).returns({})
198
192
  Plist::Emit.expects(:save_plist).once
199
- @provider.enable
193
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :false})
194
+ subject.enable
200
195
  end
201
196
  end
202
197
 
198
+ describe "when using an incompatible version of Facter" do
199
+ before :each do
200
+ provider.instance_variable_set(:@macosx_version_major, nil)
201
+ end
202
+ it "should display a deprecation warning" do
203
+ Facter.stubs(:value).with(:macosx_productversion_major).returns(nil)
204
+ Facter.stubs(:value).with(:kernel).returns('Darwin')
205
+ Facter.stubs(:value).with(:macosx_productversion).returns('10.5.8')
206
+ Puppet::Util::Warnings.expects(:maybe_log)
207
+ provider.stubs(:read_plist).returns({joblabel => {"Disabled" => false}})
208
+ subject.stubs(:plist_from_label).returns([joblabel, {"Disabled" => false}])
209
+ subject.stubs(:enabled?).returns :false
210
+ subject.stubs(:execute).with([:launchctl, :load, '-w', joblabel]).returns('')
211
+ File.stubs(:open).returns('')
212
+ subject.stubs(:resource).returns({:name => joblabel, :enable => :true})
213
+ subject.enable
214
+ end
215
+ end
203
216
  end
@@ -63,6 +63,11 @@ describe provider_class, :unless => Puppet.features.microsoft_windows? do
63
63
  genkey(key).should == "from=\"192.168.1.1\",no-pty,no-X11-forwarding ssh-rsa AAAAfsfddsjldjgksdflgkjsfdlgkj root@localhost\n"
64
64
  end
65
65
 
66
+ it "should be able to parse name if it includes whitespace" do
67
+ @provider_class.parse_line('ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7pHZ1XRj3tXbFpPFhMGU1bVwz7jr13zt/wuE+pVIJA8GlmHYuYtIxHPfDHlkixdwLachCpSQUL9NbYkkRFRn9m6PZ7125ohE4E4m96QS6SGSQowTiRn4Lzd9LV38g93EMHjPmEkdSq7MY4uJEd6DUYsLvaDYdIgBiLBIWPA3OrQ== fancy user')[:name].should == 'fancy user'
68
+ @provider_class.parse_line('from="host1.reductlivelabs.com,host.reductivelabs.com",command="/usr/local/bin/run",ssh-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7pHZ1XRj3tXbFpPFhMGU1bVwz7jr13zt/wuE+pVIJA8GlmHYuYtIxHPfDHlkixdwLachCpSQUL9NbYkkRFRn9m6PZ7125ohE4E4m96QS6SGSQowTiRn4Lzd9LV38g93EMHjPmEkdSq7MY4uJEd6DUYsLvaDYdIgBiLBIWPA3OrQ== fancy user')[:name].should == 'fancy user'
69
+ end
70
+
66
71
  it "should be able to parse options containing commas via its parse_options method" do
67
72
  options = %w{from="host1.reductlivelabs.com,host.reductivelabs.com" command="/usr/local/bin/run" ssh-pty}
68
73
  optionstr = options.join(", ")
@@ -1,9 +1,12 @@
1
1
  #!/usr/bin/env rspec
2
2
  require 'spec_helper'
3
+ require 'puppet_spec/files'
3
4
 
4
5
  provider_class = Puppet::Type.type(:user).provider(:user_role_add)
5
6
 
6
- describe provider_class, :fails_on_windows => true do
7
+ describe provider_class do
8
+ include PuppetSpec::Files
9
+
7
10
  before do
8
11
  @resource = stub("resource", :name => "myuser", :managehome? => nil)
9
12
  @resource.stubs(:should).returns "fakeval"
@@ -243,17 +246,44 @@ describe provider_class, :fails_on_windows => true do
243
246
  end
244
247
 
245
248
  describe "when setting the password" do
246
- #how can you mock these blocks up?
247
- it "should open /etc/shadow for reading and /etc/shadow_tmp for writing" do
248
- File.expects(:open).with("/etc/shadow", "r")
249
+ before :each do
250
+ @shadow_file = tmpfile('shadow')
251
+ File.open(@shadow_file, 'w') do |f|
252
+ f.puts 'fakeval:password:0'
253
+ end
254
+ @provider.stubs(:shadow_file).returns(@shadow_file)
255
+ end
256
+
257
+ it 'opens #shadow_file for reading' do
258
+ File.expects(:open).with(@shadow_file, "r")
249
259
  File.stubs(:rename)
250
- @provider.password=("hashedpassword")
260
+
261
+ @provider.password = "hashedpassword"
251
262
  end
252
263
 
253
- it "should rename the /etc/shadow_tmp to /etc/shadow" do
254
- File.stubs(:open).with("/etc/shadow", "r")
255
- File.expects(:rename).with("/etc/shadow_tmp", "/etc/shadow")
256
- @provider.password=("hashedpassword")
264
+ it 'writes to "#{shadow_file}_tmp"' do
265
+ File.stubs(:rename)
266
+ File.stubs(:unlink)
267
+ @provider.password = 'hashedpassword'
268
+
269
+ File.read("#{@shadow_file}_tmp").should =~ /hashedpassword/
270
+ end
271
+
272
+ it 'renames "#{shadow_file}_tmp" to shadow_file' do
273
+ File.stubs(:open)
274
+ File.expects(:rename).with("#{@shadow_file}_tmp", @shadow_file)
275
+
276
+ @provider.password = "hashedpassword"
277
+ end
278
+
279
+ it 'updates the last changed field' do
280
+ Time.stubs(:now).returns(42 * 86400)
281
+
282
+ File.read(@shadow_file).should == "fakeval:password:0\n"
283
+
284
+ @provider.password = 'hashedpassword'
285
+
286
+ File.read(@shadow_file).should == "fakeval:hashedpassword:42"
257
287
  end
258
288
  end
259
289
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
 
4
4
  provider_class = Puppet::Type.type(:user).provider(:useradd)
5
5
 
6
- describe provider_class, :fails_on_windows => true do
6
+ describe provider_class do
7
7
  before do
8
8
  @resource = stub("resource", :name => "myuser", :managehome? => nil)
9
9
  @resource.stubs(:should).returns "fakeval"
@@ -73,7 +73,9 @@ describe Puppet::Type.type(:user).provider(:windows_adsi) do
73
73
 
74
74
  user.stubs(:groups).returns(['group2', 'group3'])
75
75
 
76
- user.expects(:set_groups).with('group1,group2', false)
76
+ create = sequence('create')
77
+ user.expects(:commit).in_sequence(create)
78
+ user.expects(:set_groups).with('group1,group2', false).in_sequence(create)
77
79
  user.expects(:[]=).with('Description', 'a test user')
78
80
  user.expects(:[]=).with('HomeDirectory', 'C:\Users\testuser')
79
81
 
@@ -101,6 +103,11 @@ describe Puppet::Type.type(:user).provider(:windows_adsi) do
101
103
  provider.password.should == :absent
102
104
  end
103
105
 
106
+ it 'should not create a user if a group by the same name exists' do
107
+ Puppet::Util::ADSI::User.expects(:create).with('testuser').raises( Puppet::Error.new("Cannot create user if group 'testuser' exists.") )
108
+ expect{ provider.create }.to raise_error( Puppet::Error,
109
+ /Cannot create user if group 'testuser' exists./ )
110
+ end
104
111
  end
105
112
 
106
113
  it 'should be able to test whether a user exists' do