summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-06-08 17:20:00 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-06-08 17:20:00 +0000
commit73502a7cac443890792ffd9d3bb4778a90413e61 (patch)
tree77ba7aa23d82a21b4bdfb9c135ceba086795b449 /lib
parentbf82d51737df7509faf4601dbbf15b265bd9da3d (diff)
downloadpuppet-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')
-rw-r--r--lib/puppet/metatype/instances.rb24
-rw-r--r--lib/puppet/provider.rb5
-rw-r--r--lib/puppet/provider/nameservice.rb16
-rwxr-xr-xlib/puppet/provider/package/apple.rb4
-rwxr-xr-xlib/puppet/provider/package/apt.rb2
-rwxr-xr-xlib/puppet/provider/package/aptitude.rb2
-rw-r--r--lib/puppet/provider/package/aptrpm.rb2
-rwxr-xr-xlib/puppet/provider/package/blastwave.rb2
-rwxr-xr-xlib/puppet/provider/package/darwinport.rb4
-rwxr-xr-xlib/puppet/provider/package/dpkg.rb6
-rwxr-xr-xlib/puppet/provider/package/freebsd.rb11
-rwxr-xr-xlib/puppet/provider/package/gem.rb4
-rwxr-xr-xlib/puppet/provider/package/openbsd.rb4
-rw-r--r--lib/puppet/provider/package/pkgdmg.rb4
-rw-r--r--lib/puppet/provider/package/portage.rb4
-rwxr-xr-xlib/puppet/provider/package/ports.rb14
-rwxr-xr-xlib/puppet/provider/package/rpm.rb21
-rwxr-xr-xlib/puppet/provider/package/sun.rb6
-rwxr-xr-xlib/puppet/provider/package/sunfreeware.rb2
-rw-r--r--lib/puppet/provider/package/up2date.rb2
-rwxr-xr-xlib/puppet/provider/package/yum.rb2
-rw-r--r--lib/puppet/transaction.rb1
-rw-r--r--lib/puppet/type/package.rb47
-rw-r--r--lib/puppet/type/service.rb4
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