diff --git a/lib/puppet/provider/package/pkg.rb b/lib/puppet/provider/package/pkg.rb index 0b826e8f5..a140007fc 100644 --- a/lib/puppet/provider/package/pkg.rb +++ b/lib/puppet/provider/package/pkg.rb @@ -1,107 +1,101 @@ 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" execpipe(cmd) do |process| hash = {} # now turn each returned line into a package object process.each_line { |line| if hash = parse_line(line) packages << new(hash) end } end packages end self::REGEX = %r{^(\S+)\s+(\S+)\s+(\S+)\s+} self::FIELDS = [:name, :version, :status] def self.parse_line(line) hash = {} if match = self::REGEX.match(line) self::FIELDS.zip(match.captures) { |field,value| hash[field] = value } hash[:provider] = self.name - hash[:error] = "ok" if hash[:status] == "installed" hash[:ensure] = :present else hash[:ensure] = :absent end else Puppet.warning "Failed to match 'pkg list' line #{line.inspect}" return nil end 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 #{@resource[:name]}: #{v}" end end version end # install the package def install pkg :install, @resource[:name] end # uninstall the package def uninstall pkg :uninstall, '-r', @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'} + return {:ensure => :absent, :name => @resource[:name]} end - hash = self.class.parse_line(output) || - {:ensure => :absent, :status => 'missing', :name => @resource[:name], :error => 'ok'} - - raise Puppet::Error.new( "Package #{hash[:name]}, version #{hash[:version]} is in error state: #{hash[:error]}") if hash[:error] != "ok" - + hash = self.class.parse_line(output) || {:ensure => :absent, :name => @resource[:name]} hash end end diff --git a/spec/unit/provider/package/pkg_spec.rb b/spec/unit/provider/package/pkg_spec.rb index 04a4ae607..dd182c81e 100755 --- a/spec/unit/provider/package/pkg_spec.rb +++ b/spec/unit/provider/package/pkg_spec.rb @@ -1,62 +1,63 @@ #!/usr/bin/env rspec require 'spec_helper' -provider = Puppet::Type.type(:package).provider(:pkg) - -describe provider do - before do - @resource = stub 'resource', :[] => "dummy" - @provider = provider.new(@resource) - - @fakeresult = "install ok installed dummy 1.0\n" +describe Puppet::Type.type(:package).provider(:pkg) do + before :each do + @resource = Puppet::Resource.new(:package, 'dummy', :parameters => {:name => 'dummy', :ensure => :latest}) + @provider = described_class.new(@resource) end def self.it_should_respond_to(*actions) actions.each do |action| it "should respond to :#{action}" do @provider.should respond_to(action) end end end it_should_respond_to :install, :uninstall, :update, :query, :latest - it "should be versionable" do - provider.should_not be_versionable + it "should not be versionable" do + described_class.should_not be_versionable end it "should use :install to update" do @provider.expects(:install) @provider.update end it "should parse a line correctly" do - result = provider.parse_line("dummy 1.0@1.0-1.0 installed ----") + result = described_class.parse_line("dummy 1.0@1.0-1.0 installed ----") result.should == {:name => "dummy", :version => "1.0@1.0-1.0", :ensure => :present, :status => "installed", - :provider => :pkg, :error => "ok"} + :provider => :pkg} end it "should fail to parse an incorrect line" do - result = provider.parse_line("foo") + result = described_class.parse_line("foo") result.should be_nil end it "should fail to list a missing package" do - @provider.expects(:pkg).with(:list, "-H", "dummy").returns "1" - @provider.query.should == {:status=>"missing", :ensure=>:absent, - :name=>"dummy", :error=>"ok"} + # I dont know what the acutal error looks like, but according to type/pkg.rb we're just + # reacting on the Exception anyways + @provider.expects(:pkg).with(:list, "-H", "dummy").raises Puppet::ExecutionFailure, 'Not found' + @provider.query.should == {:ensure => :absent, :name => "dummy"} end it "should fail to list a package when it can't parse the output line" do @provider.expects(:pkg).with(:list, "-H", "dummy").returns "failed" - @provider.query.should == {:status=>"missing", :ensure=>:absent, :name=>"dummy", :error=>"ok"} + @provider.query.should == {:ensure => :absent, :name => "dummy"} end it "should list package correctly" do @provider.expects(:pkg).with(:list, "-H", "dummy").returns "dummy 1.0@1.0-1.0 installed ----" - @provider.query.should == {:name => "dummy", :version => "1.0@1.0-1.0", - :ensure => :present, :status => "installed", - :provider => :pkg, :error => "ok"} + @provider.query.should == { + :name => "dummy", + :version => "1.0@1.0-1.0", + :ensure => :present, + :status => "installed", + :provider => :pkg + } end end