+1 pending some testing by someone SuSE.
On Tue, Apr 13, 2010 at 2:27 PM, Rein Henrichs <[email protected]> wrote:
> Zypper is the replacement for `rug' from earlier SuSE releases. Zypper
> is backward compatible with the rug command (mostly) and supports most
> of the same commands that rug does.
>
> This version fixes a number of bugs in the original:
>
> * when installing with a specified version, fix bug where the package
> name was being doubled ("foo" became "foofoo").
>
> * fix bug where package name and version were separated by a "=" when it
> should have been a "-".
>
> * Update specs to reflect the implementation's use of the "-l" flag as
> recommended in
> http://groups.google.com/group/puppet-dev/msg/d86416c079bd3faf
>
> Signed-off-by: Rein Henrichs <[email protected]>
> Signed-off-by: Rein Henrichs <[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..2a9c2b3
> --- /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 :rug => "/usr/bin/zypper"
> + commands :rpm => "rpm"
> +
> + confine :operatingsystem => [:suse, :sles, :sled, :opensuse]
> +
> + # 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-%s" % [wanted, should]
> + end
> + output = zypper "--quiet", :install, "-l", "-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..be45a4c
> --- /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, '-l',
> '-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, '-l',
> '-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.7.0.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]<puppet-dev%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.
>
>
--
-----------------------------------------------------------
The power of accurate observation is
commonly called cynicism by those
who have not got it. ~George Bernard Shaw
------------------------------------------------------------
--
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.