From: Martin Englund <[email protected]>

Plus very basic spec tests

Signed-off-by: James Turnbull <[email protected]>
---
 lib/puppet/provider/package/pkg.rb |  114 ++++++++++++++++++++++++++++++++++++
 spec/unit/provider/package/pkg.rb  |   41 +++++++++++++
 2 files changed, 155 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/provider/package/pkg.rb
 create mode 100644 spec/unit/provider/package/pkg.rb

diff --git a/lib/puppet/provider/package/pkg.rb 
b/lib/puppet/provider/package/pkg.rb
new file mode 100644
index 0000000..3b95642
--- /dev/null
+++ b/lib/puppet/provider/package/pkg.rb
@@ -0,0 +1,114 @@
+require 'puppet/provider/package'
+
+Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package 
do
+  desc "OpenSolaris image packaging system. See pkg(5) for more information"
+
+  commands :pkg => "/usr/bin/pkg"
+
+  confine :operatingsystem => :solaris
+
+  #defaultfor [:operatingsystem => :solaris, :kernelrelease => "5.11"]
+
+  def self.instances
+    packages = []
+
+    cmd = "#{command(:pkg)} list -H"
+    Puppet.debug "Executing '%s'" % cmd
+    execpipe(cmd) do |process|
+      hash = {}
+
+      # now turn each returned line into a package object
+      process.each { |line|
+        if hash = parse_line(line)
+          packages << new(hash)
+        end
+      }
+    end
+
+    packages
+  end
+
+  REGEX = %r{^(\S+)\s+(\S+)\s+(\S+)\s+}
+  FIELDS = [:name, :version, :status]
+
+  def self.parse_line(line)
+    hash = {}
+    if match = REGEX.match(line)
+
+      FIELDS.zip(match.captures) { |field,value|
+        hash[field] = value
+      }
+
+      hash[:provider] = self.name
+
+      if hash[:status] == "installed"
+        hash[:ensure] = :present
+      else
+        hash[:ensure] = :absent
+      end
+    else
+      Puppet.warning "Failed to match 'pkg list' line %s" % line.inspect
+      return nil
+    end
+
+    return hash
+  end
+
+  # return the version of the package
+  # TODO deal with multiple publishers
+  def latest
+    version = nil
+    pkg(:list, "-Ha", @resource[:name]).split("\n").each do |line|
+      v = line.split[2]
+      case v
+      when "known"
+        return v
+      when "installed"
+        version = v
+      else
+        Puppet.warn "unknown package state for %s: %s" % [...@resource[:name], 
v]
+      end
+    end
+    version
+  end
+
+  # install the package
+  def install
+    pkg :install, @resource[:name]
+  end
+
+  # uninstall the package
+  def uninstall
+    pkg :uninstall, @resource[:name]
+  end
+
+  # update the package to the latest version available
+  def update
+    self.install
+  end
+
+  # list a specific package
+  def query
+    begin
+      output = pkg(:list, "-H", @resource[:name])
+    rescue Puppet::ExecutionFailure
+      # pkg returns 1 if the package is not found.
+      return {:ensure => :absent, :status => 'missing',
+        :name => @resource[:name], :error => 'ok'}
+    end
+
+    hash = self.class.parse_line(output) || 
+      {:ensure => :absent, :status => 'missing',
+       :name => @resource[:name], :error => 'ok'}
+
+    if hash[:error] != "ok"
+      raise Puppet::Error.new(
+        "Package %s, version %s is in error state: %s" %
+        [hash[:name], hash[:ensure], hash[:error]]
+      )
+    end
+
+    return hash
+  end
+
+end
\ No newline at end of file
diff --git a/spec/unit/provider/package/pkg.rb 
b/spec/unit/provider/package/pkg.rb
new file mode 100644
index 0000000..c153678
--- /dev/null
+++ b/spec/unit/provider/package/pkg.rb
@@ -0,0 +1,41 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:package).provider(:pkg)
+
+describe provider_class do
+    before(:each) do
+        @provider = provider_class.new
+    end
+
+    it "should have documentation" do
+        provider_class.doc.should be_instance_of(String)
+    end
+
+    it "should have an install method" do
+        @provider.should respond_to(:install)
+    end
+
+    it "should have an uninstall method" do
+        @provider.should respond_to(:uninstall)
+    end
+
+    it "should have a latest method" do
+        @provider.should respond_to(:latest)
+    end
+
+    it "should have an update method" do
+        @provider.should respond_to(:update)
+    end 
+
+    it "should have a query method" do
+        @provider.should respond_to(:query)
+    end 
+
+    it "should use :install to update" do
+        @provider.expects(:install)
+        @provider.update
+    end 
+
+ end
-- 
1.6.5.2

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.


Reply via email to