[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. debian/0.24.6-1-356-g5718585
James Turnbull
james at lovedthanlost.net
Fri Jan 23 14:20:53 UTC 2009
The following commit has been merged in the master branch:
commit 41dc1fac33cbb3938a5dc5f42f5b841a0a734c27
Author: Brice Figureau <brice-puppet at daysofwonder.com>
Date: Wed Aug 27 20:31:38 2008 +0200
Runit service provider
This provider manages daemons running supervised by Runit[1].
It tries to detect the service directory, with by order of preference:
* /service
* /var/service
* /etc/service
The daemon directory should be placed in a directory that can be
by default in:
* /etc/sv
* /var/lib/service
or this can be overriden in the service resource parameters:
service {
"myservice":
provider => "runit", path => "/path/to/daemons";
}
This provider supports out of the box:
* start/stop
* enable/disable
* restart
* status
[1]: http://smarden.sunsite.dk/runit/
diff --git a/CHANGELOG b/CHANGELOG
index 11107eb..8ce2c3a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,6 @@
0.24.x
+ Added daemontools and runit providers for service type
+
Added simple rake task for running unit tests
Added spec Rake task
diff --git a/lib/puppet/provider/service/runit.rb b/lib/puppet/provider/service/runit.rb
new file mode 100644
index 0000000..230fa75
--- /dev/null
+++ b/lib/puppet/provider/service/runit.rb
@@ -0,0 +1,93 @@
+# Daemontools service management
+#
+# author Brice Figureau <brice-puppet at daysofwonder.com>
+Puppet::Type.type(:service).provide :runit, :parent => :daemontools do
+ desc "Runit service management.
+ This provider manages daemons running supervised by Runit.
+ It tries to detect the service directory, with by order of preference:
+ * /service
+ * /var/service
+ * /etc/service
+ The daemon directory should be placed in a directory that can be
+ by default in:
+ * /etc/sv
+ or this can be overriden in the service resource parameters:
+ service {
+ \"myservice\":
+ provider => \"runit\", path => \"/path/to/daemons\";
+ }
+
+ This provider supports out of the box:
+ * start/stop
+ * enable/disable
+ * restart
+ * status"
+
+ commands :sv => "/usr/bin/sv"
+
+ class << self
+ # this is necessary to autodetect a valid resource
+ # default path, since there is no standard for such directory.
+ def defpath
+ unless defined?(@defpath) and @defpath
+ ["/etc/sv", "/var/lib/service"].each do |path|
+ if FileTest.exist?(path)
+ @defpath = path
+ break
+ end
+ end
+ raise "Could not find the daemon directory (tested [/var/lib/service,/etc])" unless @defpath
+ end
+ @defpath
+ end
+ end
+
+ # find the service dir on this node
+ def servicedir
+ unless defined?(@servicedir) and @servicedir
+ ["/service", "/etc/service","/var/service"].each do |path|
+ if FileTest.exist?(path)
+ @servicedir = path
+ break
+ end
+ end
+ raise "Could not find service directory" unless @servicedir
+ end
+ @servicedir
+ end
+
+ def restartcmd
+ [ command(:sv), "restart", self.service]
+ end
+
+ def status
+ begin
+ output = sv "status", self.daemon
+ return :running if output =~ /^run: /
+ rescue Puppet::ExecutionFailure => detail
+ unless detail.message =~ /(warning: |runsv not running$)/
+ raise Puppet::Error.new( "Could not get status for service %s: %s" % [ resource.ref, detail] )
+ end
+ end
+ return :stopped
+ end
+
+ # relay to the stopcmd
+ def stop
+ ucommand( :stop )
+ end
+
+ def stopcmd
+ [ command(:sv), "stop", self.service]
+ end
+
+ # disable by removing the symlink so that runit
+ # doesn't restart our service behind our back
+ # note that runit doesn't need to perform a stop
+ # before a disable
+ def disable
+ # unlink the daemon symlink to disable it
+ File.unlink(self.service) if FileTest.symlink?(self.service)
+ end
+end
+
diff --git a/spec/unit/provider/service/daemontools.rb b/spec/unit/provider/service/runit.rb
similarity index 62%
copy from spec/unit/provider/service/daemontools.rb
copy to spec/unit/provider/service/runit.rb
index 29e9dd5..8eb5384 100644
--- a/spec/unit/provider/service/daemontools.rb
+++ b/spec/unit/provider/service/runit.rb
@@ -1,12 +1,12 @@
#!/usr/bin/env ruby
#
-# Unit testing for the Daemontools service Provider
+# Unit testing for the Runit service Provider
#
# author Brice Figureau
#
require File.dirname(__FILE__) + '/../../../spec_helper'
-provider_class = Puppet::Type.type(:service).provider(:daemontools)
+provider_class = Puppet::Type.type(:service).provider(:runit)
describe provider_class do
@@ -17,7 +17,7 @@ describe provider_class do
@provider = provider_class.new
@servicedir = "/etc/service"
@provider.servicedir=@servicedir
- @daemondir = "/var/lib/service"
+ @daemondir = "/etc/sv"
@provider.class.defpath=@daemondir
# A catch all; no parameters set
@@ -32,7 +32,7 @@ describe provider_class do
@provider.stubs(:resource).returns @resource
end
-
+
it "should have a restartcmd method" do
@provider.should respond_to(:restartcmd)
end
@@ -65,8 +65,8 @@ describe provider_class do
end
describe "when stopping" do
- it "should call disable" do
- @provider.expects(:disable)
+ it "should execute external command 'sv stop /etc/service/myservice'" do
+ @provider.expects(:ucommand).with(:stop).returns("")
@provider.stop
end
end
@@ -80,44 +80,37 @@ describe provider_class do
end
describe "when disabling" do
- it "should stop and then remove the symlink between daemon dir and service dir" do
- FileTest.stubs(:directory?).returns(false)
- FileTest.stubs(:symlink?).returns(true)
- File.expects(:unlink).with(File.join(@servicedir,"myservice")).returns(0)
- @provider.stubs(:texecute).returns("")
- @provider.disable
- end
- end
-
- describe "when disabling" do
- it "should also call 'svc -dx /etc/service/myservice'" do
+ it "should remove the '/etc/service/myservice' symlink" do
FileTest.stubs(:directory?).returns(false)
FileTest.stubs(:symlink?).returns(true)
File.expects(:unlink).with(File.join(@servicedir,"myservice")).returns(0)
- @provider.expects(:texecute).with("stop", [nil, '-dx', File.join(@servicedir,"myservice")]).returns ""
@provider.disable
end
end
describe "when checking status" do
- it "should call the external command 'svstat /etc/service/myservice'" do
- @provider.expects(:svstat).with(File.join(@servicedir,"myservice"))
+ it "should call the external command 'sv status /etc/sv/myservice'" do
+ @provider.expects(:sv).with('status',File.join(@daemondir,"myservice"))
@provider.status
end
end
describe "when checking status" do
- it "and svstat fails, properly raise a Puppet::Error" do
- @provider.expects(:svstat).with(File.join(@servicedir,"myservice")).raises(Puppet::ExecutionFailure, "failure")
- lambda { @provider.status }.should raise_error(Puppet::Error, 'Could not get status for service Service[myservice]: failure')
+ it "and sv status fails, properly raise a Puppet::Error" do
+ @provider.expects(:sv).with('status',File.join(@daemondir,"myservice")).raises(Puppet::ExecutionFailure, "fail: /etc/sv/myservice: file not found")
+ lambda { @provider.status }.should raise_error(Puppet::Error, 'Could not get status for service Service[myservice]: fail: /etc/sv/myservice: file not found')
end
- it "and svstat returns up, then return :running" do
- @provider.expects(:svstat).with(File.join(@servicedir,"myservice")).returns("/etc/service/myservice: up (pid 454) 954326 seconds")
+ it "and sv status returns up, then return :running" do
+ @provider.expects(:sv).with('status',File.join(@daemondir,"myservice")).returns("run: /etc/sv/myservice: (pid 9029) 6s")
@provider.status.should == :running
end
- it "and svstat returns not running, then return :stopped" do
- @provider.expects(:svstat).with(File.join(@servicedir,"myservice")).returns("/etc/service/myservice: supervise not running")
- @provider.status.should == :stopped
+ it "and sv status returns not running, then return :stopped" do
+ @provider.expects(:sv).with('status',File.join(@daemondir,"myservice")).returns("fail: /etc/sv/myservice: runsv not running")
+ @provider.status.should == :stopped
+ end
+ it "and sv status returns a warning, then return :stopped" do
+ @provider.expects(:sv).with('status',File.join(@daemondir,"myservice")).returns("warning: /etc/sv/myservice: unable to open supervise/ok: file does not exist")
+ @provider.status.should == :stopped
end
end
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list