Re: [Puppet-dev] Re: Fixing #2864 Added support for AIX System Resource Controller (SRC) - service start stop

12 views
Skip to first unread message
Message has been deleted
Message has been deleted

Luke Kanies

unread,
Nov 25, 2009, 8:07:49 PM11/25/09
to puppe...@googlegroups.com
No, but we'll ignore it in our review. :)

On Nov 25, 2009, at 4:58 PM, Andrew Forgue wrote:

> *grumble* any idea how to make google groups not wrap ?
>
> --
>
> You received this message because you are subscribed to the Google
> Groups "Puppet Developers" group.
> To post to this group, send email to puppe...@googlegroups.com.
> To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com
> .
> For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en
> .
>
>


--
When one admits that nothing is certain one must, I think, also admit
that some things are much more nearly certain than others.
-- Bertrand Russell
---------------------------------------------------------------------
Luke Kanies | http://reductivelabs.com | http://madstop.com

Luke Kanies

unread,
Nov 25, 2009, 8:27:33 PM11/25/09
to puppe...@googlegroups.com, Andrew Forgue
From: Andrew Forgue <andrew...@gmail.com>

This provider supports start/stop and restart of AIX services using the
native AIX service manager, called the System Resource Controller.
Currently it will not stop and start (but only refresh) a service that
uses sockets or message queues as its communication method. It will run
stopsrc and then startsrc for services that use signals as their
communication method.

Improvements will include the ability to enable and disable services by
adding or removing them to the /etc/inittab file (this is an AIXism)
using the mkitab rmitab commands.

Signed-off-by: Andrew Forgue <andrew...@gmail.com>
Signed-off-by: Luke Kanies <lu...@madstop.com>
---
lib/puppet/provider/service/src.rb | 91 +++++++++++++++++++++++++++++++++
spec/unit/provider/service/src.rb | 97 ++++++++++++++++++++++++++++++++++++
2 files changed, 188 insertions(+), 0 deletions(-)
create mode 100755 lib/puppet/provider/service/src.rb
create mode 100755 spec/unit/provider/service/src.rb

diff --git a/lib/puppet/provider/service/src.rb b/lib/puppet/provider/service/src.rb
new file mode 100755
index 0000000..43a59f5
--- /dev/null
+++ b/lib/puppet/provider/service/src.rb
@@ -0,0 +1,91 @@
+# AIX System Resource controller (SRC)
+Puppet::Type.type(:service).provide :src, :parent => :base do
+
+ desc "Support for AIX's System Resource controller.
+
+ Services are started/stopped based on the stopsrc and startsrc
+ commands, and some services can be refreshed with refresh command.
+
+ * Enabling and disableing services is not supported, as it requires
+ modifications to /etc/inittab.
+
+ * Starting and stopping groups of subsystems is not yet supported
+ "
+
+ defaultfor :operatingsystem => :aix
+ confine :operatingsystem => :aix
+
+ commands :stopsrc => "/usr/bin/stopsrc"
+ commands :startsrc => "/usr/bin/startsrc"
+ commands :refresh => "/usr/bin/refresh"
+ commands :lssrc => "/usr/bin/lssrc"
+
+ has_feature :refreshable
+
+ def startcmd
+ [command(:startsrc), "-s", @resource[:name]]
+ end
+
+ def stopcmd
+ [command(:stopsrc), "-s", @resource[:name]]
+ end
+
+ def restart
+ begin
+ execute([command(:lssrc), "-Ss", @resource[:name]]).each do |line|
+ args = line.split(":")
+
+ next unless args[0] == @resource[:name]
+
+ # Subsystems with the -K flag can get refreshed (HUPed)
+ # While subsystems with -S (signals) must be stopped/started
+ method = args[11]
+ do_refresh = case method
+ when "-K" then :true
+ when "-S" then :false
+ else self.fail("Unknown service communication method #{method}, defaulting to stop/start")
+ end
+
+ begin
+ if do_refresh == :true
+ execute([command(:refresh), "-s", @resource[:name]])
+ else
+ self.stop
+ self.start
+ end
+ return :true
+ rescue Puppet::ExecutionFailure => detail
+ raise Puppet::Error.new("Unable to restart service %s, error was: %s" % [ @resource[:name], detail ] )
+ end
+ end
+ self.fail("No such service found")
+ rescue Puppet::ExecutionFailure => detail
+ raise Puppet::Error.new("Cannot get status of %s, error was: %s" % [ @resource[:name], detail ] )
+ end
+ end
+
+ def status
+ begin
+ execute([command(:lssrc), "-s", @resource[:name]]).each do |line|
+ args = line.split
+
+ # This is the header line
+ next unless args[0] == @resource[:name]
+
+ # PID is the 3rd field, but inoperative subsystems
+ # skip this so split doesn't work right
+ state = case args[-1]
+ when "active" then :running
+ when "inoperative" then :stopped
+ end
+ Puppet.debug("Service #{@resource[:name]} is #{args[-1]}")
+ return state
+ end
+ self.fail("No such service found")
+ rescue Puppet::ExecutionFailure => detail
+ raise Puppet::Error.new("Cannot get status of %s, error was: %s" % [ @resource[:name], detail ] )
+ end
+ end
+
+end
+
diff --git a/spec/unit/provider/service/src.rb b/spec/unit/provider/service/src.rb
new file mode 100755
index 0000000..76a6cf8
--- /dev/null
+++ b/spec/unit/provider/service/src.rb
@@ -0,0 +1,97 @@
+#!/usr/bin/env ruby
+#
+# Unit testing for the AIX System Resource Controller (src) provider
+#
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:service).provider(:src)
+
+describe provider_class do
+
+ before :each do
+ @resource = stub 'resource'
+ @resource.stubs(:[]).returns(nil)
+ @resource.stubs(:[]).with(:name).returns "myservice"
+
+ @provider = provider_class.new
+ @provider.resource = @resource
+
+ @provider.stubs(:command).with(:stopsrc).returns "/usr/bin/stopsrc"
+ @provider.stubs(:command).with(:startsrc).returns "/usr/bin/startsrc"
+ @provider.stubs(:command).with(:lssrc).returns "/usr/bin/lssrc"
+ @provider.stubs(:command).with(:refresh).returns "/usr/bin/refresh"
+
+ @provider.stubs(:stopsrc)
+ @provider.stubs(:startsrc)
+ @provider.stubs(:lssrc)
+ @provider.stubs(:refresh)
+ end
+
+ [:start, :stop, :status, :restart].each do |method|
+ it "should have a #{method} method" do
+ @provider.should respond_to(method)
+ end
+ end
+
+ it "should execute the startsrc command" do
+ @provider.expects(:execute).with(['/usr/bin/startsrc', '-s', "myservice"], {:squelch => true, :failonfail => true})
+ @provider.start
+ end
+
+ it "should execute the stopsrc command" do
+ @provider.expects(:execute).with(['/usr/bin/stopsrc', '-s', "myservice"], {:squelch => true, :failonfail => true})
+ @provider.stop
+ end
+
+ it "should execute status and return running if the subsystem is active" do
+ sample_output = <<_EOF_
+Subsystem Group PID Status
+myservice tcpip 1234 active
+_EOF_
+
+ @provider.expects(:execute).with(['/usr/bin/lssrc', '-s', "myservice"]).returns sample_output
+ @provider.status.should == :running
+ end
+
+ it "should execute status and return stopped if the subsystem is inoperative" do
+ sample_output = <<_EOF_
+Subsystem Group PID Status
+myservice tcpip inoperative
+_EOF_
+
+ @provider.expects(:execute).with(['/usr/bin/lssrc', '-s', "myservice"]).returns sample_output
+ @provider.status.should == :stopped
+ end
+
+ it "should execute status and return nil if the status is not known" do
+ sample_output = <<_EOF_
+Subsystem Group PID Status
+myservice tcpip randomdata
+_EOF_
+
+ @provider.expects(:execute).with(['/usr/bin/lssrc', '-s', "myservice"]).returns sample_output
+ @provider.status.should == nil
+ end
+
+ it "should execute restart which runs refresh" do
+ sample_output = <<_EOF_
+#subsysname:synonym:cmdargs:path:uid:auditid:standin:standout:standerr:action:multi:contact:svrkey:svrmtype:priority:signorm:sigforce:display:waittime:grpname:
+myservice:::/usr/sbin/inetd:0:0:/dev/console:/dev/console:/dev/console:-O:-Q:-K:0:0:20:0:0:-d:20:tcpip:
+_EOF_
+ @provider.expects(:execute).with(['/usr/bin/lssrc', '-Ss', "myservice"]).returns sample_output
+ @provider.expects(:execute).with(['/usr/bin/refresh', '-s', "myservice"])
+ @provider.restart
+ end
+
+ it "should execute restart which runs stopsrc then startsrc" do
+ sample_output = <<_EOF_
+#subsysname:synonym:cmdargs:path:uid:auditid:standin:standout:standerr:action:multi:contact:svrkey:svrmtype:priority:signorm:sigforce:display:waittime:grpname:
+myservice::--no-daemonize:/usr/sbin/puppetd:0:0:/dev/null:/var/log/puppet.log:/var/log/puppet.log:-O:-Q:-S:0:0:20:15:9:-d:20::"
+_EOF_
+ @provider.expects(:execute).with(['/usr/bin/lssrc', '-Ss', "myservice"]).returns sample_output
+ @provider.expects(:execute).with(['/usr/bin/stopsrc', '-s', "myservice"], {:squelch => true, :failonfail => true})
+ @provider.expects(:execute).with(['/usr/bin/startsrc', '-s', "myservice"], {:squelch => true, :failonfail => true})
+ @provider.restart
+ end
+end
--
1.6.1

mar...@reality.com

unread,
Nov 25, 2009, 9:54:17 PM11/25/09
to puppe...@googlegroups.com
>*grumble* any idea how to make google groups not wrap ?

No.

Sent via BlackBerry from T-Mobile
Reply all
Reply to author
Forward
0 new messages