summaryrefslogtreecommitdiffstats
path: root/lib/puppet/provider
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-06-04 20:37:14 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-06-04 20:37:14 +0000
commitc35d07b4183be141fa606de665c52740f5cc6510 (patch)
tree6597bb7385d64ed1546541a221edb2d02585e5d2 /lib/puppet/provider
parenta7b057de317ffc60e50405ea1ebb109ba4003b4f (diff)
downloadpuppet-c35d07b4183be141fa606de665c52740f5cc6510.tar.gz
puppet-c35d07b4183be141fa606de665c52740f5cc6510.tar.xz
puppet-c35d07b4183be141fa606de665c52740f5cc6510.zip
Significantly reworked the type => provider interface with respect to
listing existing provider instances. The class method on both class heirarchies has been renamed to 'instances', to start. Providers are now expected to return provider instances, instead of creating resources, and the resource's 'instances' method is expected to find the matching resource, if any, and set the resource's provider appropriately. This *significantly* reduces the reliance on effectively global state (resource references in the resource classes). This global state will go away soon. Along with this change, the 'prefetch' class method on providers now accepts the list of resources for prefetching. This again reduces reliance on global state, and makes the execution path much easier to follow. git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2551 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/provider')
-rw-r--r--lib/puppet/provider/nameservice/netinfo.rb12
-rwxr-xr-xlib/puppet/provider/package/apple.rb22
-rwxr-xr-xlib/puppet/provider/package/blastwave.rb4
-rwxr-xr-xlib/puppet/provider/package/darwinport.rb5
-rwxr-xr-xlib/puppet/provider/package/dpkg.rb4
-rwxr-xr-xlib/puppet/provider/package/gem.rb4
-rwxr-xr-xlib/puppet/provider/package/openbsd.rb11
-rw-r--r--lib/puppet/provider/package/pkgdmg.rb8
-rw-r--r--lib/puppet/provider/package/portage.rb4
-rwxr-xr-xlib/puppet/provider/package/rpm.rb4
-rwxr-xr-xlib/puppet/provider/package/sun.rb4
-rwxr-xr-xlib/puppet/provider/parsedfile.rb62
-rwxr-xr-xlib/puppet/provider/service/init.rb14
-rw-r--r--lib/puppet/provider/zone/solaris.rb11
14 files changed, 69 insertions, 100 deletions
diff --git a/lib/puppet/provider/nameservice/netinfo.rb b/lib/puppet/provider/nameservice/netinfo.rb
index c44f105e8..0323807e8 100644
--- a/lib/puppet/provider/nameservice/netinfo.rb
+++ b/lib/puppet/provider/nameservice/netinfo.rb
@@ -45,6 +45,12 @@ class NetInfo < Puppet::Provider::NameService
end
end
+ def self.instances
+ report(@resource_type.validproperties).collect do |hash|
+ self.new(hash)
+ end
+ end
+
# Convert a NetInfo line into a hash of data.
def self.line2hash(line, params)
values = line.split(/\t/)
@@ -61,12 +67,6 @@ class NetInfo < Puppet::Provider::NameService
hash
end
- def self.list
- report(@resource_type.validproperties).collect do |hash|
- @resource_type.hash2obj(hash)
- end
- end
-
# What field the value is stored under.
def self.netinfokey(name)
name = symbolize(name)
diff --git a/lib/puppet/provider/package/apple.rb b/lib/puppet/provider/package/apple.rb
index ce845670f..e9fb00482 100755
--- a/lib/puppet/provider/package/apple.rb
+++ b/lib/puppet/provider/package/apple.rb
@@ -11,7 +11,17 @@ Puppet::Type.type(:package).provide :apple do
defaultfor :operatingsystem => :darwin
- def self.listbyname
+ def self.instances
+ instance_by_name.collect do |name|
+ self.new(
+ :name => name,
+ :provider => :apple,
+ :ensure => :installed
+ )
+ end
+ end
+
+ def self.instance_by_name
Dir.entries("/Library/Receipts").find_all { |f|
f =~ /\.pkg$/
}.collect { |f|
@@ -22,16 +32,6 @@ Puppet::Type.type(:package).provide :apple do
}
end
- def self.list
- listbyname.collect do |name|
- Puppet.type(:package).installedpkg(
- :name => name,
- :provider => :apple,
- :ensure => :installed
- )
- end
- end
-
def query
if FileTest.exists?("/Library/Receipts/#{@resource[:name]}.pkg")
return {:name => @resource[:name], :ensure => :present}
diff --git a/lib/puppet/provider/package/blastwave.rb b/lib/puppet/provider/package/blastwave.rb
index 9f544dbd5..07f904eef 100755
--- a/lib/puppet/provider/package/blastwave.rb
+++ b/lib/puppet/provider/package/blastwave.rb
@@ -23,10 +23,10 @@ Puppet::Type.type(:package).provide :blastwave, :parent => :sun do
end
end
- def self.list(hash = {})
+ def self.instances(hash = {})
blastlist(hash).collect do |bhash|
bhash.delete(:avail)
- Puppet::Type.type(:package).installedpkg(bhash)
+ new(bhash)
end
end
diff --git a/lib/puppet/provider/package/darwinport.rb b/lib/puppet/provider/package/darwinport.rb
index 70e6ed388..8c0bbb891 100755
--- a/lib/puppet/provider/package/darwinport.rb
+++ b/lib/puppet/provider/package/darwinport.rb
@@ -31,12 +31,11 @@ Puppet::Type.type(:package).provide :darwinport do
}
end
- def self.list
+ def self.instances
packages = []
eachpkgashash do |hash|
- pkg = Puppet.type(:package).installedpkg(hash)
- packages << pkg
+ packages << new(hash)
end
return packages
diff --git a/lib/puppet/provider/package/dpkg.rb b/lib/puppet/provider/package/dpkg.rb
index d309ae9e5..e09638669 100755
--- a/lib/puppet/provider/package/dpkg.rb
+++ b/lib/puppet/provider/package/dpkg.rb
@@ -6,7 +6,7 @@ Puppet::Type.type(:package).provide :dpkg do
commands :dpkg => "/usr/bin/dpkg"
commands :dpkgquery => "/usr/bin/dpkg-query"
- def self.list
+ def self.instances
packages = []
# list out all of the packages
@@ -29,7 +29,7 @@ Puppet::Type.type(:package).provide :dpkg do
hash[:provider] = self.name
- packages.push Puppet.type(:package).installedpkg(hash)
+ packages << new(hash)
else
Puppet.warning "Failed to match dpkg-query line %s" %
line.inspect
diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index c902bcbe5..fb5e243e9 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -56,9 +56,9 @@ Puppet::Type.type(:package).provide :gem do
end
end
- def self.list(justme = false)
+ def self.instances(justme = false)
gemlist(:local => true).collect do |hash|
- Puppet::Type.type(:package).installedpkg(hash)
+ new(hash)
end
end
diff --git a/lib/puppet/provider/package/openbsd.rb b/lib/puppet/provider/package/openbsd.rb
index e910a41ba..0e238f546 100755
--- a/lib/puppet/provider/package/openbsd.rb
+++ b/lib/puppet/provider/package/openbsd.rb
@@ -7,7 +7,7 @@ Puppet::Type.type(:package).provide :openbsd do
defaultfor :operatingsystem => :openbsd
confine :operatingsystem => :openbsd
- def self.list
+ def self.instances
packages = []
begin
@@ -29,8 +29,7 @@ Puppet::Type.type(:package).provide :openbsd do
hash[:provider] = self.name
- pkg = Puppet.type(:package).installedpkg(hash)
- packages << pkg
+ packages << new(hash)
else
# Print a warning on lines we can't match, but move
# on, since it should be non-fatal
@@ -38,12 +37,6 @@ Puppet::Type.type(:package).provide :openbsd do
end
}
end
- # Mark as absent any packages we didn't find
- Puppet.type(:package).each do |pkg|
- unless packages.include? pkg
- pkg.is = [:ensure, :absent]
- end
- end
return packages
rescue Puppet::ExecutionFailure
diff --git a/lib/puppet/provider/package/pkgdmg.rb b/lib/puppet/provider/package/pkgdmg.rb
index e3d211fef..e0864764a 100644
--- a/lib/puppet/provider/package/pkgdmg.rb
+++ b/lib/puppet/provider/package/pkgdmg.rb
@@ -23,7 +23,7 @@ Puppet::Type.type(:package).provide :pkgdmg do
commands :curl => "/usr/bin/curl"
# JJM We store a cookie for each installed .pkg.dmg in /var/db
- def self.listbyname
+ def self.instance_by_name
Dir.entries("/var/db").find_all { |f|
f =~ /^\.puppet_pkgdmg_installed_/
}.collect do |f|
@@ -33,9 +33,9 @@ Puppet::Type.type(:package).provide :pkgdmg do
end
end
- def self.list
- listbyname.collect do |name|
- Puppet.type(:package).installedpkg(
+ def self.instances
+ instance_by_name.collect do |name|
+ new(
:name => name,
:provider => :pkgdmg,
:ensure => :installed
diff --git a/lib/puppet/provider/package/portage.rb b/lib/puppet/provider/package/portage.rb
index dd69f23a4..3b4c1a44f 100644
--- a/lib/puppet/provider/package/portage.rb
+++ b/lib/puppet/provider/package/portage.rb
@@ -7,7 +7,7 @@ Puppet::Type.type(:package).provide :portage do
defaultfor :operatingsystem => :gentoo
- def self.list
+ def self.instances
result_format = /(\S+) (\S+) \[(.*)\] \[[^0-9]*([^\s:]*)(:\S*)?\] ([\S]*) (.*)/
result_fields = [:category, :name, :ensure, :version_available, :slot, :vendor, :description]
@@ -28,7 +28,7 @@ Puppet::Type.type(:package).provide :portage do
package[:provider] = :portage
package[:ensure] = package[:ensure].split.last
- packages.push(Puppet.type(:package).installedpkg(package))
+ packages << new(package)
end
end
diff --git a/lib/puppet/provider/package/rpm.rb b/lib/puppet/provider/package/rpm.rb
index 13f2589d7..3b9ac8b15 100755
--- a/lib/puppet/provider/package/rpm.rb
+++ b/lib/puppet/provider/package/rpm.rb
@@ -10,7 +10,7 @@ Puppet::Type.type(:package).provide :rpm do
commands :rpm => "rpm"
- def self.list
+ def self.instances
packages = []
# list out all of the packages
@@ -30,7 +30,7 @@ Puppet::Type.type(:package).provide :rpm do
hash[field] = value
}
hash[:provider] = self.name
- packages.push Puppet.type(:package).installedpkg(hash)
+ packages << new(hash)
else
raise "failed to match rpm line %s" % line
end
diff --git a/lib/puppet/provider/package/sun.rb b/lib/puppet/provider/package/sun.rb
index ea169548d..c5b954881 100755
--- a/lib/puppet/provider/package/sun.rb
+++ b/lib/puppet/provider/package/sun.rb
@@ -9,7 +9,7 @@ Puppet::Type.type(:package).provide :sun do
defaultfor :operatingsystem => :solaris
- def self.list
+ def self.instances
packages = []
hash = {}
names = {
@@ -40,7 +40,7 @@ Puppet::Type.type(:package).provide :sun do
when /^$/:
hash[:provider] = :sun
- packages.push Puppet.type(:package).installedpkg(hash)
+ packages << new(hash)
hash.clear
when /\s*(\w+):\s+(.+)/:
name = $1
diff --git a/lib/puppet/provider/parsedfile.rb b/lib/puppet/provider/parsedfile.rb
index 09233069b..43c53601e 100755
--- a/lib/puppet/provider/parsedfile.rb
+++ b/lib/puppet/provider/parsedfile.rb
@@ -107,17 +107,13 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
end
# Return a list of all of the records we can find.
- def self.list
+ def self.instances
prefetch()
@records.find_all { |r| r[:record_type] == self.name }.collect { |r|
- clean(r)
+ new(clean(r))
}
end
- def self.list_by_name
- list.collect { |r| r[:name] }
- end
-
# Override the default method with a lot more functionality.
def self.mk_resource_methods
[resource_type.validproperties, resource_type.parameters].flatten.each do |attr|
@@ -175,11 +171,24 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
# set. We need to turn those three locations into a list of files,
# prefetch each one, and make sure they're associated with each appropriate
# resource instance.
- def self.prefetch
+ def self.prefetch(resources = nil)
# Reset the record list.
@records = []
- targets().each do |target|
- prefetch_target(target)
+ targets(resources).each do |target|
+ @records += prefetch_target(target)
+ end
+
+ if resources
+ @records.each do |record|
+ if name = record[:name] and resource = resources[name]
+ resource.provider = new(record)
+ elsif respond_to?(:match)
+ if instance = match(record, resources)
+ record[:name] = instance[:name]
+ instance.provider = new(record)
+ end
+ end
+ end
end
end
@@ -196,25 +205,10 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
end
unless target_records
- raise Puppet::DevError, "Prefetch hook for provider %s returned nil" %
- self.name
+ raise Puppet::DevError, "Prefetching %s for provider %s returned nil" % [target, self.name]
end
- @records += target_records
-
- # Set current property on any existing resource instances.
- target_records(target).find_all { |i| i.is_a?(Hash) }.each do |record|
- # Find any resource instances whose names match our instances.
- if instance = self.resource_type[record[:name]]
- next unless instance.provider.is_a?(self)
- instance.provider.property_hash = record
- elsif respond_to?(:match)
- if instance = match(record)
- record[:name] = instance[:name]
- instance.provider.property_hash = record
- end
- end
- end
+ target_records
end
# Is there an existing record with this name?
@@ -256,7 +250,7 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
# Find a list of all of the targets that we should be reading. This is
# used to figure out what targets we need to prefetch.
- def self.targets
+ def self.targets(resources = nil)
targets = []
# First get the default target
unless self.default_target
@@ -268,17 +262,13 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
targets += @target_objects.keys
# Lastly, check the file from any resource instances
- self.resource_type.each do |resource|
- targets << resource.value(:target)
-
- # This is only the case for properties, and targets should always
- # be properties.
- #if resource.respond_to?(:is)
- # targets << resource.is(:target)
- #end
+ if resources
+ resources.each do |name, resource|
+ targets << resource.value(:target)
+ end
end
- targets.uniq.reject { |t| t.nil? }
+ targets.uniq.compact
end
def self.to_file(records)
diff --git a/lib/puppet/provider/service/init.rb b/lib/puppet/provider/service/init.rb
index c5bcc26eb..79e5a2c69 100755
--- a/lib/puppet/provider/service/init.rb
+++ b/lib/puppet/provider/service/init.rb
@@ -29,7 +29,7 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
end
# List all services of this type.
- def self.list(name)
+ def self.instances(name)
# We need to find all paths specified for our type or any parent types
paths = Puppet.type(:service).paths(name)
@@ -44,7 +44,7 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
end
end
- paths.each do |path|
+ paths.collect do |path|
unless FileTest.directory?(path)
Puppet.notice "Service path %s does not exist" % path
next
@@ -59,14 +59,8 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
Dir.entries(path).reject { |e|
fullpath = File.join(path, e)
e =~ /^\./ or ! FileTest.executable?(fullpath)
- }.each do |name|
- if obj = Puppet::Type.type(:service)[name]
- obj[:check] = check
- else
- Puppet::Type.type(:service).create(
- :name => name, :check => check, :path => path
- )
- end
+ }.collect do |name|
+ new(:name => name, :path => path)
end
end
end
diff --git a/lib/puppet/provider/zone/solaris.rb b/lib/puppet/provider/zone/solaris.rb
index 7ace69047..d178679fe 100644
--- a/lib/puppet/provider/zone/solaris.rb
+++ b/lib/puppet/provider/zone/solaris.rb
@@ -21,18 +21,11 @@ Puppet::Type.type(:zone).provide(:solaris) do
return hash
end
- def self.list
+ def self.instances
adm(:list, "-cp").split("\n").collect do |line|
hash = line2hash(line)
- obj = nil
- unless obj = @resource[hash[:name]]
- obj = @resource.create(:name => hash[:name])
- end
-
- obj.setstatus(hash)
-
- obj
+ new(hash)
end
end