Zypper is the replacement for `rug' from earlier SuSE releases. Zypper is backward compatible with the rug command and supports the same commands that rug does.
Technically all that needed to be changed is :rug => "/usr/bin/zypper". However, I'd expect rug to eventually be removed so this just depends on the RPM provider. Signed-off-by: Andrew Forgue <[email protected]> --- lib/puppet/provider/package/zypper.rb | 52 +++++++++++++++++++++ spec/unit/provider/package/zypper.rb | 81 +++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 0 deletions(-) create mode 100644 lib/puppet/provider/package/zypper.rb create mode 100644 spec/unit/provider/package/zypper.rb diff --git a/lib/puppet/provider/package/zypper.rb b/lib/puppet/provider/package/zypper.rb new file mode 100644 index 0000000..3a5f49c --- /dev/null +++ b/lib/puppet/provider/package/zypper.rb @@ -0,0 +1,52 @@ +Puppet::Type.type(:package).provide :zypper, :parent => :rpm do + desc "Support for SuSE ``zypper`` package manager. Found in SLES10sp2+ and SLES11" + + has_feature :versionable + + commands :zypper => "/usr/bin/zypper" + commands :rpm => "rpm" + + confine :operatingsystem => [:suse, :sles] + + # Install a package using 'zypper'. + def install + should = @resource.should(:ensure) + self.debug "Ensuring => #{should}" + wanted = @resource[:name] + + # XXX: We don't actually deal with epochs here. + case should + when true, false, Symbol + # pass + else + # Add the package version + wanted += "-%s" % should + end + output = zypper "--quiet", :install, "-y", wanted + + unless self.query + raise Puppet::ExecutionFailure.new( + "Could not find package %s" % self.name + ) + end + end + + # What's the latest package version available? + def latest + #zypper can only get a list of *all* available packages? + output = zypper "list-updates" + + if output =~ /#{Regexp.escape @resource[:name]}\s*\|\s*([^\s\|]+)/ + return $1 + else + # rug didn't find updates, pretend the current + # version is the latest + return @property_hash[:ensure] + end + end + + def update + # rug install can be used for update, too + self.install + end +end diff --git a/spec/unit/provider/package/zypper.rb b/spec/unit/provider/package/zypper.rb new file mode 100644 index 0000000..a611503 --- /dev/null +++ b/spec/unit/provider/package/zypper.rb @@ -0,0 +1,81 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../../spec_helper' + +provider_class = Puppet::Type.type(:package).provider(:zypper) + +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(:ensure).returns :installed + @resource.stubs(:command).with(:zypper).returns "/usr/bin/zypper" + + @provider = provider_class.new(@resource) + end + + it "should have an install method" do + @provider = provider_class.new + @provider.should respond_to(:install) + end + + it "should have a latest method" do + @provider = provider_class.new + @provider.should respond_to(:uninstall) + end + + it "should have an update method" do + @provider = provider_class.new + @provider.should respond_to(:update) + end + + it "should have a latest method" do + @provider = provider_class.new + @provider.should respond_to(:latest) + end + + describe "when installing" do + it "should use a command-line with versioned package'" do + @resource.stubs(:should).with(:ensure).returns "1.2.3-4.5.6" + @provider.expects(:zypper).with('--quiet', :install, '-y', 'mypackage-1.2.3-4.5.6') + @provider.expects(:query).returns "mypackage 0 1.2.3 4.5.6 x86_64" + @provider.install + end + + it "should use a command-line without versioned package" do + @resource.stubs(:should).with(:ensure).returns :latest + @provider.expects(:zypper).with('--quiet', :install, '-y', 'mypackage') + @provider.expects(:query).returns "mypackage 0 1.2.3 4.5.6 x86_64" + @provider.install + end + end + + describe "when updating" do + it "should call install method of instance" do + @provider.expects(:install) + @provider.update + end + end + + describe "when getting latest version" do + it "should return a version string" do + + fake_data = "Loading repository data... +Reading installed packages... +S | Repository | Name | Version | Arch +--+----------------+-----------------------+-----------------+------- +v | SLES11-Updates | cups | 1.1.1 | x86_64 +v | SLES11-Updates | mypackage | 1.3.9h-8.20.1 | x86_64" + + @provider.expects(:zypper).with("list-updates").returns fake_data + @provider.latest.should == "1.3.9h-8.20.1" + end + end + + end -- 1.6.3.3 -- 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.
