[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 0.25.5-639-g8f94f35

test branch puppet-dev at googlegroups.com
Wed Jul 14 10:30:10 UTC 2010


The following commit has been merged in the upstream branch:
commit bca7e2c2cca97c33466609e299122c448e669b22
Author: Andrew Forgue <andrew.forgue at gmail.com>
Date:   Mon Dec 7 17:43:09 2009 -0500

    Add AIX package management support (installp&nim)
    
    This patch adds support for the native AIX package manager.
    
    It allows installation from either the name of an lpp_source (if you
    have a NIM environment configured, or from a directory containing .bff
    files.
    
    Signed-off-by: Andrew Forgue <andrew.forgue at gmail.com>

diff --git a/lib/puppet/provider/package/aix.rb b/lib/puppet/provider/package/aix.rb
new file mode 100644
index 0000000..b6f23c0
--- /dev/null
+++ b/lib/puppet/provider/package/aix.rb
@@ -0,0 +1,136 @@
+require 'puppet/provider/package'
+require 'puppet/util/package'
+
+Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package do
+    desc "Installation from AIX Software directory"
+
+    # The commands we are using on an AIX box are installed standard
+    # (except nimclient) nimclient needs the bos.sysmgt.nim.client fileset.
+    commands    :lslpp => "/usr/bin/lslpp",
+                :installp => "/usr/sbin/installp"
+
+    # AIX supports versionable packages with and without a NIM server
+    has_feature :versionable
+
+    confine  :operatingsystem => [ :aix ]
+    defaultfor :operatingsystem => :aix
+
+    attr_accessor   :latest_info
+
+    def self.srclistcmd(source)
+        return [ command(:installp), "-L", "-d", source ]
+    end
+
+    def self.prefetch(packages)
+        if Process.euid != 0
+            raise Puppet::Error "The aix provider can only be used by root"
+        end
+
+        return unless packages.detect { |name, package| package.should(:ensure) == :latest }
+
+        sources = packages.collect { |name, package| package[:source] }.uniq
+
+        updates = {}
+        sources.each do |source|
+            execute(self.srclistcmd(source)).each do |line|
+                if line =~ /^[^#][^:]*:([^:]*):([^:]*)/
+                    current = {}
+                    current[:name]    = $1
+                    current[:version] = $2
+                    current[:source]  = source
+
+                    if updates.key?(current[:name])
+                        previous = updates[current[:name]]
+
+                        unless Puppet::Util::Package.versioncmp(previous[:version], current[:version]) == 1
+                            updates[ current[:name] ] = current 
+                        end
+
+                    else
+                        updates[current[:name]] = current
+                    end
+                end
+            end
+        end
+
+        packages.each do |name, package|
+            if info = updates[package[:name]]
+                package.provider.latest_info = info[0]
+            end
+        end
+    end
+
+    def uninstall
+        # Automatically process dependencies when installing/uninstalling
+        # with the -g option to installp.
+        installp "-gu", @resource[:name]
+    end
+
+    def install(useversion = true)
+        unless source = @resource[:source]
+            self.fail "A directory is required which will be used to find packages"
+        end
+
+        pkg = @resource[:name]
+
+        if (! @resource.should(:ensure).is_a? Symbol) and useversion
+            pkg << " #{@resource.should(:ensure)}"
+        end
+
+        installp "-acgwXY", "-d", source, pkg
+    end
+
+    def self.pkglist(hash = {})
+        cmd = [command(:lslpp), "-qLc"]
+
+        if name = hash[:pkgname]
+            cmd << name
+        end
+
+        begin
+            list = execute(cmd).scan(/^[^#][^:]*:([^:]*):([^:]*)/).collect { |n,e|
+                { :name => n, :ensure => e, :provider => self.name }
+            }
+        rescue Puppet::ExecutionFailure => detail
+            if hash[:pkgname]
+                return nil
+            else
+                raise Puppet::Error, "Could not list installed Packages: %s" % detail
+            end
+        end
+
+        if hash[:pkgname]
+            return list.shift
+        else
+            return list
+        end
+    end
+
+    def self.instances
+        pkglist.collect do |hash|
+            new(hash)
+        end
+    end
+
+    def latest
+        upd = latest_info
+
+        unless upd.nil?
+            return "#{upd[:version]}"
+        else
+            if properties[:ensure] == :absent
+                raise Puppet::DevError, "Tried to get latest on a missing package"
+            end
+
+            return properties[:ensure]
+        end
+    end
+
+    def query
+        return self.class.pkglist(:pkgname => @resource[:name])
+    end
+
+    def update
+        self.install(false)
+    end
+end
diff --git a/lib/puppet/provider/package/nim.rb b/lib/puppet/provider/package/nim.rb
new file mode 100644
index 0000000..18f2921
--- /dev/null
+++ b/lib/puppet/provider/package/nim.rb
@@ -0,0 +1,37 @@
+require 'puppet/provider/package'
+require 'puppet/util/package'
+
+Puppet::Type.type(:package).provide :nim, :parent => :aix, :source => :aix do
+    desc "Installation from NIM LPP source"
+
+    # The commands we are using on an AIX box are installed standard
+    # (except nimclient) nimclient needs the bos.sysmgt.nim.client fileset.
+    commands    :nimclient => "/usr/sbin/nimclient"
+
+    # If NIM has not been configured, /etc/niminfo will not be present.
+    # However, we have no way of knowing if the NIM server is not configured
+    # properly.
+    confine  :exists => "/etc/niminfo"
+
+    has_feature :versionable
+
+    attr_accessor :latest_info
+
+    def self.srclistcmd(source)
+        return [ command(:nimclient), "-o", "showres", "-a", "installp_flags=L", "-a", "resource=#{source}" ]
+    end        
+
+    def install(useversion = true)
+        unless source = @resource[:source]
+            self.fail "An LPP source location is required in 'source'"
+        end
+
+        pkg = @resource[:name]
+
+        if (! @resource.should(:ensure).is_a? Symbol) and useversion
+            pkg << " " << @resource.should(:ensure)
+        end
+
+        nimclient "-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=#{source}", "-a", "filesets=#{pkg}"
+    end
+end
diff --git a/spec/unit/provider/package/aix.rb b/spec/unit/provider/package/aix.rb
new file mode 100755
index 0000000..691749d
--- /dev/null
+++ b/spec/unit/provider/package/aix.rb
@@ -0,0 +1,66 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:package).provider(:aix)
+
+describe provider_class do
+    before(:each) do
+        # Create a mock resource
+        @resource = stub 'resource'
+
+        # A catch all; no parameters set
+        @resource.stubs(:[]).returns(nil)
+
+        # But set name and source
+        @resource.stubs(:[]).with(:name).returns "mypackage"
+        @resource.stubs(:[]).with(:source).returns "mysource"
+        @resource.stubs(:[]).with(:ensure).returns :installed
+
+        @provider = provider_class.new
+        @provider.resource = @resource
+    end
+
+    [:install, :uninstall, :latest, :query, :update].each do |method|
+        it "should have a #{method} method" do
+            @provider.should respond_to(method)
+        end
+    end
+
+    it "should uninstall a package" do
+        @provider.expects(:installp).with('-gu', 'mypackage')
+        @provider.uninstall
+    end
+
+    describe "when installing" do
+        it "should install a package" do
+            @resource.stubs(:should).with(:ensure).returns(:installed)
+            @provider.expects(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage')
+            @provider.install
+        end
+
+        it "should install a specific package version" do
+            @resource.stubs(:should).with(:ensure).returns("1.2.3.4")
+            @provider.expects(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage 1.2.3.4')
+            @provider.install
+        end
+    end
+
+    describe "when finding the latest version" do
+        it "should return the current version when no later version is present" do
+            @provider.stubs(:latest_info).returns(nil)
+            @provider.stubs(:properties).returns( { :ensure => "1.2.3.4" } )
+            @provider.latest.should == "1.2.3.4"
+        end
+
+        it "should return the latest version of a package" do
+            @provider.stubs(:latest_info).returns( { :version => "1.2.3.5" } )
+            @provider.latest.should == "1.2.3.5"
+        end
+    end
+
+    it "update should install a package" do
+        @provider.expects(:install).with(false)
+        @provider.update
+    end
+end
diff --git a/spec/unit/provider/package/nim.rb b/spec/unit/provider/package/nim.rb
new file mode 100755
index 0000000..2018f65
--- /dev/null
+++ b/spec/unit/provider/package/nim.rb
@@ -0,0 +1,42 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:package).provider(:nim)
+
+describe provider_class do
+    before(:each) do
+        # Create a mock resource
+        @resource = stub 'resource'
+
+        # A catch all; no parameters set
+        @resource.stubs(:[]).returns(nil)
+
+        # But set name and source
+        @resource.stubs(:[]).with(:name).returns "mypackage"
+        @resource.stubs(:[]).with(:source).returns "mysource"
+        @resource.stubs(:[]).with(:ensure).returns :installed
+
+        @provider = provider_class.new
+        @provider.resource = @resource
+    end
+
+    it "should have an install method" do
+        @provider = provider_class.new
+        @provider.should respond_to(:install)
+    end
+
+    describe "when installing" do
+        it "should install a package" do
+            @resource.stubs(:should).with(:ensure).returns(:installed)
+            @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets='mypackage'")
+            @provider.install
+        end
+
+        it "should install a versioned package" do
+            @resource.stubs(:should).with(:ensure).returns("1.2.3.4")
+            @provider.expects(:nimclient).with("-o", "cust", "-a", "installp_flags=acgwXY", "-a", "lpp_source=mysource", "-a", "filesets='mypackage 1.2.3.4'")
+            @provider.install
+        end
+    end
+ end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list