diff options
| author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-06-08 17:20:00 +0000 |
|---|---|---|
| committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-06-08 17:20:00 +0000 |
| commit | 73502a7cac443890792ffd9d3bb4778a90413e61 (patch) | |
| tree | 77ba7aa23d82a21b4bdfb9c135ceba086795b449 /lib | |
| parent | bf82d51737df7509faf4601dbbf15b265bd9da3d (diff) | |
| download | puppet-73502a7cac443890792ffd9d3bb4778a90413e61.tar.gz puppet-73502a7cac443890792ffd9d3bb4778a90413e61.tar.xz puppet-73502a7cac443890792ffd9d3bb4778a90413e61.zip | |
Finishing off the type/provider interface work, including adding package prefetch for all packages. The only not-done one is yum -- prefetch is set up for rpm, but not yum. We need to modify prefetching so that it also prefetches latest information, to avoid having to run yum so many times.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2555 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib')
24 files changed, 87 insertions, 106 deletions
diff --git a/lib/puppet/metatype/instances.rb b/lib/puppet/metatype/instances.rb index be7d1be1c..8a0a1d00c 100644 --- a/lib/puppet/metatype/instances.rb +++ b/lib/puppet/metatype/instances.rb @@ -255,15 +255,31 @@ class Puppet::Type end # Put the default provider first, then the rest of the suitable providers. + packages = {} + providers_by_source.collect do |provider| + provider.instances.collect do |instance| + if other = packages[instance.name] + Puppet.warning "Package %s found in both %s and %s; skipping the %s version" % + [instance.name, other.class.name, instance.class.name, instance.class.name] + next + end + packages[instance.name] = instance + + create(:name => instance.name, :provider => instance, :check => :all) + end + end.flatten.compact + end + + # Return a list of one suitable provider per source, with the default provider first. + def self.providers_by_source + # Put the default provider first, then the rest of the suitable providers. sources = [] [defaultprovider, suitableprovider].flatten.uniq.collect do |provider| next if sources.include?(provider.source) sources << provider.source - provider.instances.collect do |instance| - create(:name => instance.name, :provider => instance, :check => :all) - end - end.flatten.compact + provider + end.compact end # Create the path for logging and such. diff --git a/lib/puppet/provider.rb b/lib/puppet/provider.rb index a725611d0..3e23bf08a 100644 --- a/lib/puppet/provider.rb +++ b/lib/puppet/provider.rb @@ -329,6 +329,11 @@ class Puppet::Provider self.class.command(name) end + # Get a parameter value. + def get(param) + @property_hash[symbolize(param)] || :absent + end + def initialize(resource = nil) if resource.is_a?(Hash) @property_hash = resource.dup diff --git a/lib/puppet/provider/nameservice.rb b/lib/puppet/provider/nameservice.rb index 8e01bfe21..bc205d43a 100644 --- a/lib/puppet/provider/nameservice.rb +++ b/lib/puppet/provider/nameservice.rb @@ -25,22 +25,10 @@ class Puppet::Provider::NameService < Puppet::Provider super end - def list + def instances objects = [] listbyname do |name| - obj = nil - check = resource_type.validproperties - if obj = resource_type[name] - obj[:check] = check - else - # unless it exists, create it as an unmanaged object - obj = resource_type.create(:name => name, :check => check) - end - - next unless obj # In case there was an error somewhere - - objects << obj - yield obj if block_given? + objects << new(:name => name, :ensure => :present) end objects diff --git a/lib/puppet/provider/package/apple.rb b/lib/puppet/provider/package/apple.rb index e9fb00482..83606fc51 100755 --- a/lib/puppet/provider/package/apple.rb +++ b/lib/puppet/provider/package/apple.rb @@ -1,5 +1,7 @@ +require 'puppet/provider/package' + # OS X Packaging sucks. We can install packages, but that's about it. -Puppet::Type.type(:package).provide :apple do +Puppet::Type.type(:package).provide :apple, :parent => Puppet::Provider::Package do desc "Package management based on OS X's builtin packaging system. This is essentially the simplest and least functional package system in existence -- it only supports installation; no deletion or upgrades. The provider will diff --git a/lib/puppet/provider/package/apt.rb b/lib/puppet/provider/package/apt.rb index 264e40b81..d39ce01f4 100755 --- a/lib/puppet/provider/package/apt.rb +++ b/lib/puppet/provider/package/apt.rb @@ -1,4 +1,4 @@ -Puppet::Type.type(:package).provide :apt, :parent => :dpkg do +Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do # Provide sorting functionality include Puppet::Util::Package diff --git a/lib/puppet/provider/package/aptitude.rb b/lib/puppet/provider/package/aptitude.rb index 79e853c64..cad7449f4 100755 --- a/lib/puppet/provider/package/aptitude.rb +++ b/lib/puppet/provider/package/aptitude.rb @@ -1,4 +1,4 @@ -Puppet::Type.type(:package).provide :aptitude, :parent => :apt do +Puppet::Type.type(:package).provide :aptitude, :parent => :apt, :source => :dpkg do desc "Package management via ``aptitude``." has_feature :versionable diff --git a/lib/puppet/provider/package/aptrpm.rb b/lib/puppet/provider/package/aptrpm.rb index 766f52525..00d60b236 100644 --- a/lib/puppet/provider/package/aptrpm.rb +++ b/lib/puppet/provider/package/aptrpm.rb @@ -1,4 +1,4 @@ -Puppet::Type.type(:package).provide :aptrpm, :parent => :rpm do +Puppet::Type.type(:package).provide :aptrpm, :parent => :rpm, :source => :rpm do # Provide sorting functionality include Puppet::Util::Package diff --git a/lib/puppet/provider/package/blastwave.rb b/lib/puppet/provider/package/blastwave.rb index 07f904eef..83e9e60cf 100755 --- a/lib/puppet/provider/package/blastwave.rb +++ b/lib/puppet/provider/package/blastwave.rb @@ -1,5 +1,5 @@ # Packaging using Blastwave's pkg-get program. -Puppet::Type.type(:package).provide :blastwave, :parent => :sun do +Puppet::Type.type(:package).provide :blastwave, :parent => :sun, :source => :sun do desc "Package management using Blastwave.org's ``pkg-get`` command on Solaris." pkgget = "pkg-get" if FileTest.executable?("/opt/csw/bin/pkg-get") diff --git a/lib/puppet/provider/package/darwinport.rb b/lib/puppet/provider/package/darwinport.rb index 8c0bbb891..1f317d31c 100755 --- a/lib/puppet/provider/package/darwinport.rb +++ b/lib/puppet/provider/package/darwinport.rb @@ -1,4 +1,6 @@ -Puppet::Type.type(:package).provide :darwinport do +require 'puppet/provider/package' + +Puppet::Type.type(:package).provide :darwinport, :parent => Puppet::Provider::Package do desc "Package management using DarwinPorts on OS X." commands :port => "/opt/local/bin/port" diff --git a/lib/puppet/provider/package/dpkg.rb b/lib/puppet/provider/package/dpkg.rb index e09638669..6756bee1b 100755 --- a/lib/puppet/provider/package/dpkg.rb +++ b/lib/puppet/provider/package/dpkg.rb @@ -1,4 +1,6 @@ -Puppet::Type.type(:package).provide :dpkg do +require 'puppet/provider/package' + +Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package do desc "Package management via ``dpkg``. Because this only uses ``dpkg`` and not ``apt``, you must specify the source of any packages you want to manage." @@ -103,7 +105,7 @@ Puppet::Type.type(:package).provide :dpkg do def purge dpkg "--purge", @resource[:name] - end + end end # $Id$ diff --git a/lib/puppet/provider/package/freebsd.rb b/lib/puppet/provider/package/freebsd.rb index e9fbf6a4c..7e94bb795 100755 --- a/lib/puppet/provider/package/freebsd.rb +++ b/lib/puppet/provider/package/freebsd.rb @@ -26,13 +26,12 @@ Puppet::Type.type(:package).provide :freebsd, :parent => :openbsd do end def query - self.class.list - - if @resource.is(:ensure) - return :listed - else - return nil + self.class.instances.each do |provider| + if provider.name == @resource.name + return provider.properties + end end + return nil end def uninstall diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb index fb5e243e9..f160adeb7 100755 --- a/lib/puppet/provider/package/gem.rb +++ b/lib/puppet/provider/package/gem.rb @@ -1,5 +1,7 @@ +require 'puppet/provider/package' + # Ruby gems support. -Puppet::Type.type(:package).provide :gem do +Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package do desc "Ruby Gem support. By default uses remote gems, but you can specify the path to a local gem via ``source``." diff --git a/lib/puppet/provider/package/openbsd.rb b/lib/puppet/provider/package/openbsd.rb index 0e238f546..34739dc08 100755 --- a/lib/puppet/provider/package/openbsd.rb +++ b/lib/puppet/provider/package/openbsd.rb @@ -1,5 +1,7 @@ +require 'puppet/provider/package' + # Packaging on OpenBSD. Doesn't work anywhere else that I know of. -Puppet::Type.type(:package).provide :openbsd do +Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Package do desc "OpenBSD's form of ``pkg_add`` support." commands :pkginfo => "pkg_info", :pkgadd => "pkg_add", :pkgdelete => "pkg_delete" diff --git a/lib/puppet/provider/package/pkgdmg.rb b/lib/puppet/provider/package/pkgdmg.rb index e0864764a..b62772fdd 100644 --- a/lib/puppet/provider/package/pkgdmg.rb +++ b/lib/puppet/provider/package/pkgdmg.rb @@ -14,7 +14,9 @@ # require 'ruby-debug' # Debugger.start -Puppet::Type.type(:package).provide :pkgdmg do +require 'puppet/provider/package' + +Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Package do desc "Package management based on Apple's Installer.app and DiskUtility.app" confine :exists => "/Library/Receipts" diff --git a/lib/puppet/provider/package/portage.rb b/lib/puppet/provider/package/portage.rb index 3b4c1a44f..2e06177cc 100644 --- a/lib/puppet/provider/package/portage.rb +++ b/lib/puppet/provider/package/portage.rb @@ -1,4 +1,6 @@ -Puppet::Type.type(:package).provide :portage do +require 'puppet/provider/package' + +Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Package do desc "Provides packaging support for Gentoo's portage system." has_feature :versionable diff --git a/lib/puppet/provider/package/ports.rb b/lib/puppet/provider/package/ports.rb index 6c464cb66..1410de154 100755 --- a/lib/puppet/provider/package/ports.rb +++ b/lib/puppet/provider/package/ports.rb @@ -1,4 +1,4 @@ -Puppet::Type.type(:package).provide :ports, :parent => :freebsd do +Puppet::Type.type(:package).provide :ports, :parent => :freebsd, :source => :freebsd do desc "Support for FreeBSD's ports. Again, this still mixes packages and ports." @@ -74,13 +74,13 @@ Puppet::Type.type(:package).provide :ports, :parent => :freebsd do end def query - self.class.list - - if @resource.is(:ensure) and @resource.is(:ensure) != :absent - return :listed - else - return nil + self.class.instances.each do |instance| + if instance.name == self.name + return instance.properties + end end + + return nil end def uninstall diff --git a/lib/puppet/provider/package/rpm.rb b/lib/puppet/provider/package/rpm.rb index 3b9ac8b15..de81bb12e 100755 --- a/lib/puppet/provider/package/rpm.rb +++ b/lib/puppet/provider/package/rpm.rb @@ -1,5 +1,6 @@ +require 'puppet/provider/package' # RPM packaging. Should work anywhere that has rpm installed. -Puppet::Type.type(:package).provide :rpm do +Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Provider::Package do desc "RPM packaging support; should work anywhere with a working ``rpm`` binary." @@ -43,16 +44,6 @@ Puppet::Type.type(:package).provide :rpm do return packages end - # Get rid of our cached values. - def flush - @current_values = {} - end - - def initialize(*args) - super - @current_values = {} - end - # Find the fully versioned package name and the version alone. Returns # a hash with entries :instance => fully versioned package name, and # :ensure => version-release @@ -80,7 +71,7 @@ Puppet::Type.type(:package).provide :rpm do @nvr = hash[:instance] - @current_values = hash + @property_hash = hash return hash end @@ -103,13 +94,13 @@ Puppet::Type.type(:package).provide :rpm do end # RPM gets pissy if you try to install an already # installed package - if @resource.should(:ensure) == @current_values[:ensure] or - @resource.should(:ensure) == :latest && @current_values[:ensure] == latest + if @resource.should(:ensure) == @property_hash[:ensure] or + @resource.should(:ensure) == :latest && @property_hash[:ensure] == latest return end flag = "-i" - if @current_values[:ensure] and @current_values[:ensure] != :absent + if @property_hash[:ensure] and @property_hash[:ensure] != :absent flag = "-U" end diff --git a/lib/puppet/provider/package/sun.rb b/lib/puppet/provider/package/sun.rb index c5b954881..4275c69fa 100755 --- a/lib/puppet/provider/package/sun.rb +++ b/lib/puppet/provider/package/sun.rb @@ -1,6 +1,8 @@ -# Sun packaging. No one else uses these package tools, AFAIK. +# Sun packaging. -Puppet::Type.type(:package).provide :sun do +require 'puppet/provider/package' + +Puppet::Type.type(:package).provide :sun, :parent => Puppet::Provider::Package do desc "Sun's packaging system. Requires that you specify the source for the packages you're managing." commands :pkginfo => "/usr/bin/pkginfo", diff --git a/lib/puppet/provider/package/sunfreeware.rb b/lib/puppet/provider/package/sunfreeware.rb index 7933eb42f..6c5e1d702 100755 --- a/lib/puppet/provider/package/sunfreeware.rb +++ b/lib/puppet/provider/package/sunfreeware.rb @@ -1,5 +1,5 @@ # At this point, it's an exact copy of the Blastwave stuff. -Puppet::Type.type(:package).provide :sunfreeware, :parent => :blastwave do +Puppet::Type.type(:package).provide :sunfreeware, :parent => :blastwave, :source => :sun do desc "Package management using sunfreeware.com's ``pkg-get`` command on Solaris. At this point, support is exactly the same as ``blastwave`` support and has not actually been tested." diff --git a/lib/puppet/provider/package/up2date.rb b/lib/puppet/provider/package/up2date.rb index 5dc32e34a..84545888a 100644 --- a/lib/puppet/provider/package/up2date.rb +++ b/lib/puppet/provider/package/up2date.rb @@ -1,4 +1,4 @@ -Puppet.type(:package).provide :up2date, :parent => :rpm do +Puppet.type(:package).provide :up2date, :parent => :rpm, :source => :rpm do desc "Support for Red Hat's proprietary ``up2date`` package update mechanism." diff --git a/lib/puppet/provider/package/yum.rb b/lib/puppet/provider/package/yum.rb index 34b9b7f10..b9212ef37 100755 --- a/lib/puppet/provider/package/yum.rb +++ b/lib/puppet/provider/package/yum.rb @@ -1,4 +1,4 @@ -Puppet::Type.type(:package).provide :yum, :parent => :rpm do +Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do desc "Support via ``yum``." has_feature :versionable diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb index d27f4038a..bb756740d 100644 --- a/lib/puppet/transaction.rb +++ b/lib/puppet/transaction.rb @@ -483,6 +483,7 @@ class Transaction # Now call prefetch, passing in the resources so that the provider instances can be replaced. prefetchers.each do |provider, resources| + Puppet.debug "Prefetching %s resources for %s" % [provider.name, provider.resource_type.name] begin provider.prefetch(resources) rescue => detail diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb index d116238a1..38b5b1443 100644 --- a/lib/puppet/type/package.rb +++ b/lib/puppet/type/package.rb @@ -383,7 +383,7 @@ module Puppet # The 'query' method returns a hash of info if the package # exists and returns nil if it does not. def exists? - @provider.query + @provider.get(:ensure) != :absent end # okay, there are two ways that a package could be created... @@ -413,49 +413,14 @@ module Puppet end def retrieve - # If the package is installed, then retrieve all of the information - # about it and set it appropriately. - if hash = @provider.query - if hash == :listed # Mmmm, hackalicious - return {} + @provider.properties.inject({}) do |props, ary| + name, value = ary + if prop = @parameters[name] + props[prop] = value end - hash.each { |param, value| - unless self.class.validattr?(param) - hash.delete(param) - end - } - - setparams(hash) - - return properties().inject({}) { |prop_hash, property| - prop_hash[property] = hash[property.name] if hash.has_key?(property.name) - prop_hash - } - else - # Else just mark all of the properties absent. - # FIXARB: Not sure why this is using validproperties instead of - # properties()? - return self.class.validproperties.inject({}) { |h, name| - h[@parameters[name]] = :absent - h - } + props end end - - # Set all of the params' "is" value. Most are parameters, but some - # are properties. - def setparams(hash) - # Everything on packages is a parameter except :ensure - hash.each { |param, value| - next if param == :ensure - if self.class.attrtype(param) == :property - add_property_parameter(param) - self.provider.send("%s=" % param, value) - else - self[param] = value - end - } - end end # Puppet.type(:package) end diff --git a/lib/puppet/type/service.rb b/lib/puppet/type/service.rb index 2df311633..89b64cc97 100644 --- a/lib/puppet/type/service.rb +++ b/lib/puppet/type/service.rb @@ -134,8 +134,8 @@ module Puppet # end if property = @resource.property(:enable) - property.retrieve - unless property.insync? + val = property.retrieve + unless property.insync?(val) property.sync end end |
