Anyone? I guess at this stage now I'm just looking for a +1 from anyone from a code point of view....
On Fri, Dec 4, 2009 at 12:37 PM, Nigel Kersten <[email protected]> wrote: > Any comments from the apt/dpkg/aptitude provider users? > > Note that because I'm doing this in the dpkg provider, and both apt > and aptitude inherit from it, they both get this functionality. > > In the case of aptitude this is slightly counter-intuitive, as it > means implementing a hold in an aptitude provided package resource > will implement a dpkg hold, not an aptitude hold. > > If people feel violently opposed to this behavior, speak up... > > > On Tue, Dec 1, 2009 at 7:46 AM, Nigel Kersten <[email protected]> wrote: >> From: nigelk <[email protected]> >> >> >> Signed-off-by: Nigel Kersten <[email protected]> >> --- >> lib/puppet/provider/package/dpkg.rb | 31 +++++++++++++++++++++++++- >> lib/puppet/type/package.rb | 10 +++++++- >> spec/unit/provider/package/dpkg.rb | 42 >> ++++++++++++++++++++++++++++++++-- >> 3 files changed, 78 insertions(+), 5 deletions(-) >> >> diff --git a/lib/puppet/provider/package/dpkg.rb >> b/lib/puppet/provider/package/dpkg.rb >> index a4c3982..4f1c45a 100755 >> --- a/lib/puppet/provider/package/dpkg.rb >> +++ b/lib/puppet/provider/package/dpkg.rb >> @@ -5,6 +5,8 @@ Puppet::Type.type(:package).provide :dpkg, :parent => >> Puppet::Provider::Package >> and not ``apt``, you must specify the source of any packages you want >> to manage." >> >> + has_feature :holdable >> + >> commands :dpkg => "/usr/bin/dpkg" >> commands :dpkg_deb => "/usr/bin/dpkg-deb" >> commands :dpkgquery => "/usr/bin/dpkg-query" >> @@ -47,9 +49,12 @@ Puppet::Type.type(:package).provide :dpkg, :parent => >> Puppet::Provider::Package >> >> if hash[:status] == 'not-installed' >> hash[:ensure] = :purged >> - elsif hash[:status] != "installed" >> + elsif hash[:status] == "config-files" >> hash[:ensure] = :absent >> end >> + if hash[:desired] == "hold" >> + hash[:ensure] = :held >> + end >> else >> Puppet.warning "Failed to match dpkg-query line %s" % >> line.inspect >> return nil >> @@ -65,6 +70,9 @@ Puppet::Type.type(:package).provide :dpkg, :parent => >> Puppet::Provider::Package >> >> args = [] >> >> + # We always unhold when installing to remove any prior hold. >> + self.unhold >> + >> if @resource[:configfiles] == :keep >> args << '--force-confold' >> else >> @@ -127,4 +135,25 @@ Puppet::Type.type(:package).provide :dpkg, :parent => >> Puppet::Provider::Package >> def purge >> dpkg "--purge", @resource[:name] >> end >> + >> + def hold >> + self.install >> + begin >> + Tempfile.open('puppet_dpkg_set_selection') { |tmpfile| >> + tmpfile.write("#...@resource[:name]} hold\n") >> + tmpfile.flush >> + execute([:dpkg, "--set-selections"], :stdinfile => >> tmpfile.path.to_s) >> + } >> + end >> + end >> + >> + def unhold >> + begin >> + Tempfile.open('puppet_dpkg_set_selection') { |tmpfile| >> + tmpfile.write("#...@resource[:name]} install\n") >> + tmpfile.flush >> + execute([:dpkg, "--set-selections"], :stdinfile => >> tmpfile.path.to_s) >> + } >> + end >> + end >> end >> diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb >> index bb3db28..789d27f 100644 >> --- a/lib/puppet/type/package.rb >> +++ b/lib/puppet/type/package.rb >> @@ -31,6 +31,10 @@ module Puppet >> existing configuration files. This feature is thus >> destructive >> and should be used with the utmost care.", >> :methods => [:purge] >> + feature :holdable, "The provider can hold packages. This generally >> means >> + that the package will not be automatically upgraded. Note >> that >> + a held status is considered a superset of installed", >> + :methods => [:hold] >> feature :versionable, "The provider is capable of interrogating the >> package database for installed version(s), and can select >> which out of a set of available versions of a package to >> @@ -60,6 +64,10 @@ module Puppet >> provider.purge >> end >> >> + newvalue(:held, :event => :package_held, :required_features => >> :holdable) do >> + provider.hold >> + end >> + >> # Alias the 'present' value. >> aliasvalue(:installed, :present) >> >> @@ -111,7 +119,7 @@ module Puppet >> @should.each { |should| >> case should >> when :present >> - return true unless [:absent, :purged].include?(is) >> + return true unless [:absent, :purged, >> :held].include?(is) >> when :latest >> # Short-circuit packages that are not present >> return false if is == :absent or is == :purged >> diff --git a/spec/unit/provider/package/dpkg.rb >> b/spec/unit/provider/package/dpkg.rb >> index 08aaca8..305dc4e 100755 >> --- a/spec/unit/provider/package/dpkg.rb >> +++ b/spec/unit/provider/package/dpkg.rb >> @@ -88,11 +88,15 @@ describe provider do >> @provider.query[:ensure].should == :purged >> end >> >> - it "should consider the package absent if its status is neither >> 'installed' nor 'not-installed'" do >> - �[email protected](:dpkgquery).returns >> @fakeresult.sub("installed", "foo") >> - >> + it "should consider the package absent if it is marked >> 'config-files'" do >> + �[email protected](:dpkgquery).returns >> @fakeresult.sub("installed", "config-files") >> @provider.query[:ensure].should == :absent >> end >> + >> + it "should consider the package held if its state is 'hold'" do >> + �[email protected](:dpkgquery).returns >> @fakeresult.sub("install", "hold") >> + �[email protected][:ensure].should == :held >> + end >> end >> >> it "should be able to install" do >> @@ -130,6 +134,38 @@ describe provider do >> >> @provider.install >> end >> + >> + it "should ensure any hold is removed" do >> + �[email protected](:unhold).once >> + �[email protected](:dpkg) >> + �[email protected] >> + end >> + end >> + >> + describe "when holding or unholding" do >> + before do >> + �...@tempfile = stub 'tempfile', :print => nil, :close => nil, >> :flush => nil, :path => "/other/file" >> + �[email protected](:write) >> + Tempfile.stubs(:new).returns @tempfile >> + end >> + >> + it "should install first if holding" do >> + �[email protected](:execute) >> + �[email protected](:install).once >> + �[email protected] >> + end >> + >> + it "should execute dpkg --set-selections when holding" do >> + �[email protected](:install) >> + �[email protected](:execute).with([:dpkg, >> '--set-selections'], {:stdinfile => @tempfile.path}).once >> + �[email protected] >> + end >> + >> + it "should execute dpkg --set-selections when unholding" do >> + �[email protected](:install) >> + �[email protected](:execute).with([:dpkg, >> '--set-selections'], {:stdinfile => @tempfile.path}).once >> + �[email protected] >> + end >> end >> >> it "should use :install to update" do >> -- >> 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. >> >> >> > > > > -- > nigel > -- nigel -- 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.
