[PATCH/puppet 1/1] Fixes #1223 Add Zypper support for SuSE machines

24 views
Skip to first unread message

Rein Henrichs

unread,
Apr 13, 2010, 5:27:22 PM4/13/10
to puppe...@googlegroups.com
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 <re...@reinh.com>
Signed-off-by: Rein Henrichs <re...@puppetlabs.com>
---
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

Markus Roberts

unread,
Apr 13, 2010, 5:31:10 PM4/13/10
to puppet-dev
+1 pending some testing by someone SuSE.


--
You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to puppe...@googlegroups.com.
To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com.
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
------------------------------------------------------------

Mario Verbelen

unread,
Apr 14, 2010, 12:27:54 PM4/14/10
to Puppet Developers
I can test it on SUSE 11
I have puppet 0.25.4 running with a zypper script that I found

Be aware that zypper on sles 10 has limited options
(like you cant specify a version of a package that you want to use)

rug sucks also cos it crashes regulary on sles 10.2

I let something known when I had the chance to test this script

On Apr 13, 11:31 pm, Markus Roberts <mar...@puppetlabs.com> wrote:
> +1 pending some testing by someone SuSE.
>
>
>
> On Tue, Apr 13, 2010 at 2:27 PM, Rein Henrichs <r...@puppetlabs.com> 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 <re...@reinh.com>

> > Signed-off-by: Rein Henrichs <r...@puppetlabs.com>

> > puppet-dev+...@googlegroups.com<puppet-dev%2Bunsu...@googlegroups.com>

Mario Verbelen

unread,
Apr 19, 2010, 9:40:59 AM4/19/10
to Puppet Developers
I have placed that diff on puppet 0.25.4 and installed that one on a
sles11

If you want more info ...

case $operatingsystem {
"SLES": { Package{ provider => zypper }} # Also
tested without this line
default: {}
}
package { "sysstat": ensure => present }

debug: Puppet::Type::Package::ProviderZypper: Executing '/bin/rpm -q
sysstat --nosignature --nodigest --qf %{NAME} %|EPOCH?{%{EPOCH}}:{0}| %
{VERSION} %{RELEASE} %{ARCH}
'
debug: //base_packages/Package[sysstat]: Changing ensure
debug: //base_packages/Package[sysstat]: 1 change(s)
debug: Package[sysstat](provider=zypper): Ensuring => present
err: //base_packages/Package[sysstat]/ensure: change from absent to
present failed: Could not set present on ensure: undefined method
`zypper' for #<Puppet::Type::Package::ProviderZypper:0x7fe8a52bdbb8>
at /data/puppet/trunk/puppet/modules/global/base/manifests/
base_packages.pp:6


operatingsystem => SLES
operatingsystemrelease => 11.0
puppetversion => 0.25.4

--
You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to puppe...@googlegroups.com.
To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages