summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--CHANGELOG15
-rw-r--r--lib/puppet/metatype/instances.rb18
-rw-r--r--lib/puppet/metatype/providers.rb42
-rwxr-xr-xlib/puppet/network/handler/resource.rb2
-rw-r--r--lib/puppet/provider.rb38
-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
-rw-r--r--lib/puppet/transaction.rb22
-rwxr-xr-xlib/puppet/type/exec.rb4
-rwxr-xr-xlib/puppet/type/group.rb16
-rw-r--r--lib/puppet/type/package.rb17
-rw-r--r--lib/puppet/type/pfile.rb2
-rwxr-xr-xlib/puppet/type/pfilebucket.rb4
-rw-r--r--lib/puppet/type/resources.rb6
-rwxr-xr-xlib/puppet/type/schedule.rb4
-rw-r--r--lib/puppet/type/service.rb14
-rwxr-xr-xlib/puppet/type/tidy.rb4
-rwxr-xr-xlib/puppet/type/user.rb16
-rw-r--r--lib/puppet/type/yumrepo.rb2
-rwxr-xr-xtest/network/handler/resource.rb6
-rwxr-xr-xtest/other/transactions.rb8
-rwxr-xr-xtest/ral/manager/instances.rb82
-rwxr-xr-xtest/ral/manager/provider.rb79
-rwxr-xr-xtest/ral/providers/package.rb12
-rwxr-xr-xtest/ral/providers/parsedfile.rb91
-rwxr-xr-xtest/ral/providers/provider.rb28
-rwxr-xr-xtest/ral/types/cron.rb4
-rwxr-xr-xtest/ral/types/package.rb1
-rwxr-xr-xtest/ral/types/resources.rb16
-rwxr-xr-xtest/ral/types/sshkey.rb4
42 files changed, 416 insertions, 310 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 8f4e2669c..fd5e64c29 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,18 @@
+ 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.
+
Fixed #532 -- reparsing config files now longer throws an exception.
Added some warnings and logs to the service type so
diff --git a/lib/puppet/metatype/instances.rb b/lib/puppet/metatype/instances.rb
index 2d408f750..be7d1be1c 100644
--- a/lib/puppet/metatype/instances.rb
+++ b/lib/puppet/metatype/instances.rb
@@ -248,6 +248,24 @@ class Puppet::Type
return trans
end
+ # Retrieve all known instances. Either requires providers or must be overridden.
+ def self.instances
+ unless defined?(@providers) and ! @providers.empty?
+ raise Puppet::DevError, "%s has no providers and has not overridden 'instances'" % self.name
+ end
+
+ # 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
+ end
+
# Create the path for logging and such.
def pathbuilder
if defined? @parent and @parent
diff --git a/lib/puppet/metatype/providers.rb b/lib/puppet/metatype/providers.rb
index 33506e06f..72459d3af 100644
--- a/lib/puppet/metatype/providers.rb
+++ b/lib/puppet/metatype/providers.rb
@@ -86,26 +86,6 @@ class Puppet::Type
return obj
end
- # Create a list method that just calls our providers.
- def self.mkprovider_list
- unless respond_to?(:list)
- meta_def(:list) do
- suitableprovider.find_all { |p| p.respond_to?(:list) }.collect { |prov|
- prov.list.each { |h| h[:provider] = prov.name }
- }.flatten.collect do |hash|
- if hash.is_a?(Hash)
- hash2obj(hash)
- elsif hash.is_a?(self)
- hash
- else
- raise Puppet::DevError, "Provider %s returned object of type %s in list" %
- [prov.name, hash.class]
- end
- end
- end
- end
- end
-
# Retrieve a provider by name.
def self.provider(name)
name = Puppet::Util.symbolize(name)
@@ -172,7 +152,6 @@ class Puppet::Type
def self.providify
return if @paramhash.has_key? :provider
- mkprovider_list()
newparam(:provider) do
desc "The specific backend for #{self.name.to_s} to use. You will
seldom need to specify this -- Puppet will usually discover the
@@ -197,17 +176,21 @@ class Puppet::Type
@resource.class.defaultprovider.name
}
- validate do |value|
- value = value[0] if value.is_a? Array
- if provider = @resource.class.provider(value)
+ validate do |provider_class|
+ provider_class = provider_class[0] if provider_class.is_a? Array
+ if provider_class.is_a?(Puppet::Provider)
+ provider_class = provider_class.class.name
+ end
+
+ if provider = @resource.class.provider(provider_class)
unless provider.suitable?
raise ArgumentError,
"Provider '%s' is not functional on this platform" %
- [value]
+ [provider_class]
end
else
raise ArgumentError, "Invalid %s provider '%s'" %
- [@resource.class.name, value]
+ [@resource.class.name, provider_class]
end
end
@@ -244,10 +227,13 @@ class Puppet::Type
end
def provider=(name)
- if klass = self.class.provider(name)
+ if name.is_a?(Puppet::Provider)
+ @provider = name
+ @provider.resource = self
+ elsif klass = self.class.provider(name)
@provider = klass.new(self)
else
- raise UnknownProviderError, "Could not find %s provider of %s" %
+ raise ArgumentError, "Could not find %s provider of %s" %
[name, self.class.name]
end
end
diff --git a/lib/puppet/network/handler/resource.rb b/lib/puppet/network/handler/resource.rb
index 349f73537..ca492bd81 100755
--- a/lib/puppet/network/handler/resource.rb
+++ b/lib/puppet/network/handler/resource.rb
@@ -145,7 +145,7 @@ class Puppet::Network::Handler
bucket = Puppet::TransBucket.new
bucket.type = typeklass.name
- typeklass.list.each do |obj|
+ typeklass.instances.each do |obj|
next if ignore.include? obj.name
#object = Puppet::TransObject.new(obj.name, typeklass.name)
diff --git a/lib/puppet/provider.rb b/lib/puppet/provider.rb
index 1f18ae730..a725611d0 100644
--- a/lib/puppet/provider.rb
+++ b/lib/puppet/provider.rb
@@ -109,6 +109,12 @@ class Puppet::Provider
end
end
+ # The method for returning a list of provider instances. Note that it returns providers, preferably with values already
+ # filled in, not resources.
+ def self.instances
+ raise Puppet::DevError, "Provider %s has not defined the 'instances' class method" % self.name
+ end
+
# Create the methods for a given command.
def self.make_command_methods(name)
# Now define a method for that command
@@ -323,16 +329,34 @@ class Puppet::Provider
self.class.command(name)
end
- def initialize(resource)
- @resource = resource
-
- # LAK 2007-05-09: Keep the model stuff around for backward compatibility
- @model = resource
- @property_hash = {}
+ def initialize(resource = nil)
+ if resource.is_a?(Hash)
+ @property_hash = resource.dup
+ elsif resource
+ @resource = resource if resource
+ # LAK 2007-05-09: Keep the model stuff around for backward compatibility
+ @model = resource
+ @property_hash = {}
+ else
+ @property_hash = {}
+ end
end
def name
- @resource.name
+ if n = @property_hash[:name]
+ return n
+ elsif self.resource
+ resource.name
+ else
+ raise Puppet::DevError, "No resource and no name in property hash"
+ end
+ end
+
+ # Set passed params as the current values.
+ def set(params)
+ params.each do |param, value|
+ @property_hash[symbolize(param)] = value
+ end
end
def to_s
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
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 7c046c898..d27f4038a 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -473,16 +473,20 @@ class Transaction
# Prefetch any providers that support it. We don't support prefetching
# types, just providers.
def prefetch
- @resources.collect { |obj|
- if pro = obj.provider
- pro.class
- else
- nil
+ prefetchers = {}
+ @resources.each do |resource|
+ if provider = resource.provider and provider.class.respond_to?(:prefetch)
+ prefetchers[provider.class] ||= {}
+ prefetchers[provider.class][resource.title] = resource
end
- }.reject { |o| o.nil? }.uniq.each do |klass|
- # XXX We need to do something special here in case of failure.
- if klass.respond_to?(:prefetch)
- klass.prefetch
+ end
+
+ # Now call prefetch, passing in the resources so that the provider instances can be replaced.
+ prefetchers.each do |provider, resources|
+ begin
+ provider.prefetch(resources)
+ rescue => detail
+ Puppet.err "Could not prefetch % provider %s: %s" % [resources[0].class.name, provider.name, detail]
end
end
end
diff --git a/lib/puppet/type/exec.rb b/lib/puppet/type/exec.rb
index e5071b484..dabd98830 100755
--- a/lib/puppet/type/exec.rb
+++ b/lib/puppet/type/exec.rb
@@ -444,8 +444,8 @@ module Puppet
end
end
- def self.list
- self.collect { |i| i }
+ def self.instances
+ []
end
# Verify that we pass all of the checks. The argument determines whether
diff --git a/lib/puppet/type/group.rb b/lib/puppet/type/group.rb
index 5e82140e7..8ca687904 100755
--- a/lib/puppet/type/group.rb
+++ b/lib/puppet/type/group.rb
@@ -120,22 +120,6 @@ module Puppet
defaultto false
end
- def self.list_by_name
- users = []
- defaultprovider.listbyname do |user|
- users << user
- end
- return users
- end
-
- def self.list
- defaultprovider.list
-
- self.collect do |user|
- user
- end
- end
-
def retrieve
if self.provider and @provider.exists?
return super
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index 2c3cdc41d..d116238a1 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -361,23 +361,6 @@ module Puppet
return object
end
- # List all package instances
- def self.list
- # XXX For now, just list the default provider, but we should list
- # all suitables or something, but we need to not list a parent
- # type if a child type gets listed.
- #suitableprovider.each do |provider|
- # p provider.name
- # provider.list
- #end
-
- defaultprovider.list
-
- self.collect do |pkg|
- pkg
- end
- end
-
# Iterate across all packages of a given type and mark them absent
# if they are not in the list
def self.markabsent(pkgtype, packages)
diff --git a/lib/puppet/type/pfile.rb b/lib/puppet/type/pfile.rb
index bec0a4dd2..3a07a9342 100644
--- a/lib/puppet/type/pfile.rb
+++ b/lib/puppet/type/pfile.rb
@@ -259,7 +259,7 @@ module Puppet
end
# List files, but only one level deep.
- def self.list(base = "/")
+ def self.instances(base = "/")
unless FileTest.directory?(base)
return []
end
diff --git a/lib/puppet/type/pfilebucket.rb b/lib/puppet/type/pfilebucket.rb
index ec1803ff8..fd0f131a1 100755
--- a/lib/puppet/type/pfilebucket.rb
+++ b/lib/puppet/type/pfilebucket.rb
@@ -70,8 +70,8 @@ module Puppet
end
end
- def self.list
- self.collect do |obj| obj.name end
+ def self.instances
+ []
end
def bucket
diff --git a/lib/puppet/type/resources.rb b/lib/puppet/type/resources.rb
index ca88a7c31..39fa1bc34 100644
--- a/lib/puppet/type/resources.rb
+++ b/lib/puppet/type/resources.rb
@@ -31,8 +31,8 @@ Puppet::Type.newtype(:resources) do
validate do |value|
if [:true, true, "true"].include?(value)
- unless @resource.resource_type.respond_to?(:list)
- raise ArgumentError, "Purging resources of type %s is not supported, since they cannot be listed" % @resource[:name]
+ unless @resource.resource_type.respond_to?(:instances)
+ raise ArgumentError, "Purging resources of type %s is not supported, since they cannot be queried from the system" % @resource[:name]
end
unless @resource.resource_type.validproperty?(:ensure)
raise ArgumentError, "Purging is only supported on types that accept 'ensure'"
@@ -91,7 +91,7 @@ Puppet::Type.newtype(:resources) do
return [] unless self.purge?
hascheck = false
method =
- resource_type.list.find_all do |resource|
+ resource_type.instances.find_all do |resource|
! resource.managed?
end.find_all do |resource|
check(resource)
diff --git a/lib/puppet/type/schedule.rb b/lib/puppet/type/schedule.rb
index 08bada3a7..2e3c126e4 100755
--- a/lib/puppet/type/schedule.rb
+++ b/lib/puppet/type/schedule.rb
@@ -307,8 +307,8 @@ module Puppet
end
end
- def self.list
- self.collect do |obj| obj end
+ def self.instances
+ []
end
def self.mkdefaultschedules
diff --git a/lib/puppet/type/service.rb b/lib/puppet/type/service.rb
index c582b17ee..2df311633 100644
--- a/lib/puppet/type/service.rb
+++ b/lib/puppet/type/service.rb
@@ -265,20 +265,6 @@ module Puppet
newvalues(:true, :false)
end
- # List all available services
- def self.list
- defprov = defaultprovider
-
- names = []
- if defprov.respond_to? :list
- defprov.list(defprov.name)
- else
- Puppet.debug "Type %s does not respond to list" % defprov.name
- end
-
- self.collect { |s| s }
- end
-
# Add a new path to our list of paths that services could be in.
def self.newpath(type, path)
type = type.intern if type.is_a? String
diff --git a/lib/puppet/type/tidy.rb b/lib/puppet/type/tidy.rb
index 8d9cda170..75a68170d 100755
--- a/lib/puppet/type/tidy.rb
+++ b/lib/puppet/type/tidy.rb
@@ -254,8 +254,8 @@ module Puppet
validate do
end
- def self.list
- self.collect { |t| t }
+ def self.instances
+ []
end
@depthfirst = true
diff --git a/lib/puppet/type/user.rb b/lib/puppet/type/user.rb
index 87a57cddd..a9634b6f7 100755
--- a/lib/puppet/type/user.rb
+++ b/lib/puppet/type/user.rb
@@ -322,22 +322,6 @@ module Puppet
autos
end
- def self.list_by_name
- users = []
- defaultprovider.listbyname do |user|
- users << user
- end
- return users
- end
-
- def self.list
- defaultprovider.list
-
- self.collect do |user|
- user
- end
- end
-
def retrieve
absent = false
properties().inject({}) { |prophash, property|
diff --git a/lib/puppet/type/yumrepo.rb b/lib/puppet/type/yumrepo.rb
index 395a33068..5efb3a307 100644
--- a/lib/puppet/type/yumrepo.rb
+++ b/lib/puppet/type/yumrepo.rb
@@ -80,7 +80,7 @@ module Puppet
# Where to put files for brand new sections
@defaultrepodir = nil
- def self.list
+ def self.instances
l = []
check = validproperties
clear
diff --git a/test/network/handler/resource.rb b/test/network/handler/resource.rb
index 8d1fa1087..589d22d83 100755
--- a/test/network/handler/resource.rb
+++ b/test/network/handler/resource.rb
@@ -183,8 +183,8 @@ class TestResourceServer < Test::Unit::TestCase
Puppet::Type.type(:schedule).mkdefaultschedules
Puppet::Type.eachtype do |type|
- unless type.respond_to? :list
- Puppet.warning "%s does not respond to :list" % type.name
+ unless type.respond_to? :instances
+ Puppet.warning "%s does not respond to :instances" % type.name
next
end
next unless type.name == :package
@@ -212,7 +212,7 @@ class TestResourceServer < Test::Unit::TestCase
count = 0
described = {}
Puppet.info "listing again"
- type.list.each do |obj|
+ type.instances.each do |obj|
assert_instance_of(type, obj)
break if count > 5
diff --git a/test/other/transactions.rb b/test/other/transactions.rb
index 1e0b6377d..4cb65dbe3 100755
--- a/test/other/transactions.rb
+++ b/test/other/transactions.rb
@@ -124,8 +124,8 @@ class TestTransactions < Test::Unit::TestCase
# Now create a provider
type.provide(:prefetch) do
- def self.prefetch
- $prefetched = true
+ def self.prefetch(resources)
+ $prefetched = resources
end
end
@@ -140,7 +140,7 @@ class TestTransactions < Test::Unit::TestCase
trans.prefetch
end
- assert_equal(true, $prefetched, "type prefetch was not called")
+ assert_equal({inst.title => inst}, $prefetched, "type prefetch was not called")
# Now make sure it gets called from within evaluate()
$prefetched = false
@@ -148,7 +148,7 @@ class TestTransactions < Test::Unit::TestCase
trans.evaluate
end
- assert_equal(true, $prefetched, "evaluate did not call prefetch")
+ assert_equal({inst.title => inst}, $prefetched, "evaluate did not call prefetch")
end
def test_refreshes_generate_events
diff --git a/test/ral/manager/instances.rb b/test/ral/manager/instances.rb
new file mode 100755
index 000000000..142b85c5c
--- /dev/null
+++ b/test/ral/manager/instances.rb
@@ -0,0 +1,82 @@
+#!/usr/bin/env ruby
+#
+# Created by Luke A. Kanies on 2007-06-10.
+# Copyright (c) 2007. All rights reserved.
+
+$:.unshift("../../lib") if __FILE__ =~ /\.rb$/
+
+require 'puppettest'
+
+class TestTypeInstances < Test::Unit::TestCase
+ include PuppetTest
+
+ def setup
+ super
+ @type = Puppet::Type.newtype(:instance_test) do
+ newparam(:name) {}
+ ensurable
+ end
+ cleanup { Puppet::Type.rmtype(:instance_test) }
+ end
+
+ # Make sure the instances class method works as expected.
+ def test_instances
+ # First make sure it throws an error when there are no providers
+ assert_raise(Puppet::DevError, "Did not fail when no providers are present") do
+ @type.instances
+ end
+
+ # Now add a couple of providers
+
+ # The default
+ @type.provide(:default) do
+ defaultfor :operatingsystem => Facter.value(:operatingsystem)
+ mk_resource_methods
+ class << self
+ attr_accessor :names
+ end
+ def self.instance(name)
+ new(:name => name, :ensure => :present)
+ end
+ def self.instances
+ @instances ||= names.collect { |name| instance(name) }
+ @instances
+ end
+
+ @names = [:one]
+ end
+
+ # A provider with the same source
+ @type.provide(:sub, :source => :default, :parent => :default) do
+ @names = [:two]
+ end
+
+ # An unsuitable provider
+ @type.provide(:nope, :parent => :default) do
+ confine :exists => "/no/such/file"
+ @names = [:three]
+ end
+
+ # Another suitable, non-default provider
+ @type.provide(:yep, :parent => :default) do
+ @names = [:four]
+ end
+
+ result = nil
+ assert_nothing_raised("Could not get instance list") do
+ result = @type.instances
+ end
+
+ assert_equal(:one, result[0].name, "Did not get default instances first")
+ assert_equal(@type.provider(:default).instances[0], result[0].provider, "Provider instances were not maintained")
+
+ resources = result.inject({}) { |hash, res| hash[res.name] = res; hash }
+ assert(resources.include?(:four), "Did not get resources from other suitable providers")
+ assert(! resources.include?(:three), "Got resources from unsuitable providers")
+
+ # Now make sure the resources have an 'ensure' property to go with the value in the provider
+ assert(resources[:one].send(:instance_variable_get, "@parameters").include?(:ensure), "Did not create ensure property")
+ end
+end
+
+# $Id$
diff --git a/test/ral/manager/provider.rb b/test/ral/manager/provider.rb
index f3a7d719f..a9748e12a 100755
--- a/test/ral/manager/provider.rb
+++ b/test/ral/manager/provider.rb
@@ -8,47 +8,84 @@ require 'mocha'
class TestTypeProviders < Test::Unit::TestCase
include PuppetTest
- # Make sure default providers behave correctly
- def test_defaultproviders
- # Make a fake type
- type = Puppet::Type.newtype(:defaultprovidertest) do
- newparam(:name) do end
+ def setup
+ super
+ @type = Puppet::Type.newtype(:provider_test) do
+ newparam(:name) {}
+ ensurable
end
+ cleanup { Puppet::Type.rmtype(:provider_test) }
+ end
- cleanup { Puppet::Type.rmtype(:defaultprovidertest) }
-
- basic = type.provide(:basic) do
+ # Make sure default providers behave correctly
+ def test_defaultproviders
+ basic = @type.provide(:basic) do
defaultfor :operatingsystem => :somethingelse,
:operatingsystemrelease => :yayness
end
- assert_equal(basic, type.defaultprovider)
- type.defaultprovider = nil
+ assert_equal(basic, @type.defaultprovider)
+ @type.defaultprovider = nil
- greater = type.provide(:greater) do
+ greater = @type.provide(:greater) do
defaultfor :operatingsystem => Facter.value("operatingsystem")
end
- assert_equal(greater, type.defaultprovider)
+ assert_equal(greater, @type.defaultprovider)
end
# Make sure the provider is always the first parameter created.
def test_provider_sorting
- type = Puppet::Type.newtype(:sorttest) do
- newparam(:name) {}
- ensurable
- end
- cleanup { Puppet::Type.rmtype(:sorttest) }
-
should = [:name, :ensure]
- assert_equal(should, type.allattrs.reject { |p| ! should.include?(p) },
+ assert_equal(should, @type.allattrs.reject { |p| ! should.include?(p) },
"Got wrong order of parameters")
- type.provide(:yay) { }
+ @type.provide(:yay) { }
should = [:name, :provider, :ensure]
- assert_equal(should, type.allattrs.reject { |p| ! should.include?(p) },
+ assert_equal(should, @type.allattrs.reject { |p| ! should.include?(p) },
"Providify did not reorder parameters")
end
+
+ # Make sure that provider instances can be passed in directly.
+ def test_name_or_provider
+ provider = @type.provide(:testing) do
+ end
+
+ # first make sure we can pass the name in
+ resource = nil
+ assert_nothing_raised("Could not create provider instance by name") do
+ resource = @type.create :name => "yay", :provider => :testing
+ end
+
+ assert_instance_of(provider, resource.provider, "Did not create provider instance")
+
+ # Now make sure we can pass in an instance
+ provinst = provider.new(:name => "foo")
+ assert_nothing_raised("Could not pass in provider instance") do
+ resource = @type.create :name => "foo", :provider => provinst
+ end
+
+ assert_equal(provinst, resource.provider, "Did not retain provider instance")
+
+ # Now make sure unsuitable provider instances still throw errors
+ provider = @type.provide(:badprov) do
+ confine :exists => "/no/such/file"
+ end
+
+ inst = provider.new(:name => "bar")
+ assert_raise(Puppet::Error, "Did not fail on unsuitable provider instance") do
+ resource = @type.create :name => "bar", :provider => inst
+ end
+
+ # And make sure the provider must be a valid provider type for this resource
+ pkgprov = Puppet::Type.type(:package).create(:name => "yayness").provider
+ assert(provider, "did not get package provider")
+
+ assert_raise(Puppet::Error, "Did not fail on invalid provider instance") do
+ resource = @type.create :name => "bar", :provider => pkgprov
+ end
+
+ end
end
# $Id$
diff --git a/test/ral/providers/package.rb b/test/ral/providers/package.rb
index 345fbb0e6..ab7c0130d 100755
--- a/test/ral/providers/package.rb
+++ b/test/ral/providers/package.rb
@@ -234,17 +234,17 @@ class TestPackageProvider < Test::Unit::TestCase
# Make sure all of the suitable providers on our platform can successfully
# list.
- def test_listing
+ def test_instances
Puppet::Type.type(:package).suitableprovider.each do |provider|
result = nil
assert_nothing_raised("Could not list %s packages" % provider.name) do
- result = provider.list
+ result = provider.instances
end
result.each do |pkg|
- assert_instance_of(Puppet::Type.type(:package), pkg,
- "%s returned non-package" % provider.name)
- assert_equal(provider.name, pkg.provider.class.name,
- "%s did not set provider correctly" % provider.name)
+ assert_instance_of(provider, pkg,
+ "%s returned non-provider" % provider.name)
+ assert_equal(provider.name, pkg.class.name,
+ "Provider %s returned an instance of a different provider" % provider.name)
end
end
end
diff --git a/test/ral/providers/parsedfile.rb b/test/ral/providers/parsedfile.rb
index efe8105ca..2d9f7ae9d 100755
--- a/test/ral/providers/parsedfile.rb
+++ b/test/ral/providers/parsedfile.rb
@@ -90,8 +90,9 @@ class TestParsedFile < Test::Unit::TestCase
fakeresource = fakeresource(:testparsedfiletype, "yay")
file = prov.new(fakeresource)
+ assert(file, "Could not make provider")
- assert_nothing_raised do
+ assert_nothing_raised("Could not set provider name") do
file.name = :yayness
end
@@ -206,31 +207,30 @@ class TestParsedFile < Test::Unit::TestCase
resource = mkresource "bill", :target => :file1
default = mkresource "will", :target => :default
+ resources = {"bill" => resource, "will" => default}
+
assert_nothing_raised do
- prov.prefetch
+ prov.prefetch(resources)
end
# Make sure we prefetched our resources.
- assert_equal("b", resource.provider.one)
- assert_equal("b", default.provider.one)
- assert_equal("d", default.provider.two)
+ assert_equal("b", resource.provider.one, "did not prefetch resource from file1")
+ assert_equal("b", default.provider.one, "did not prefetch resource from default")
+ assert_equal("d", default.provider.two, "did not prefetch resource from default")
# Now list all of them and make sure we get everything back
- hashes = nil
+ providers = nil
assert_nothing_raised do
- hashes = prov.list
+ providers = prov.instances
end
- names = nil
- assert_nothing_raised do
- names = prov.list_by_name
+ providers.each do |provider|
+ assert_instance_of(prov, provider, "'instances' class method did not return providers")
end
%w{bill jill will}.each do |name|
- assert(hashes.find { |r| r[:name] == name},
+ assert(providers.find { |provider| provider.name == name},
"Did not return %s in list" % name)
- assert(names.include?(name),
- "Did not return %s in list_by_name" % name)
end
end
@@ -242,25 +242,27 @@ class TestParsedFile < Test::Unit::TestCase
target = :yayness
prov.target_object(target).write "yay b d"
- resource = mkresource "yay", :target => :yayness
-
+ records = nil
assert_nothing_raised do
- prov.prefetch_target(:yayness)
+ records = prov.prefetch_target(:yayness)
end
# Now make sure we correctly got the hash
- mprov = resource.provider
- assert_equal("b", mprov.one)
- assert_equal("d", mprov.two)
+ record = records.find { |r| r[:name] == "yay" }
+ assert(record, "Did not get record in prefetch_target")
+ assert_equal("b", record[:one])
+ assert_equal("d", record[:two])
end
def test_prefetch_match
prov = mkprovider
- prov.meta_def(:match) do |record|
+ prov.meta_def(:match) do |record, resources|
# Look for matches on :one
- self.resource_type.find do |m|
- m.should(:one).to_s == record[:one].to_s
+ if res = resources.find { |name, resource| resource.should(:one).to_s == record[:one].to_s }
+ res[1]
+ else
+ nil
end
end
@@ -271,7 +273,7 @@ class TestParsedFile < Test::Unit::TestCase
resource = mkresource "yay", :target => :yayness, :one => "b"
assert_nothing_raised do
- prov.prefetch_target(:yayness)
+ prov.prefetch("yay" => resource)
end
# Now make sure we correctly got the hash
@@ -301,22 +303,35 @@ class TestParsedFile < Test::Unit::TestCase
# Lastly, create a resource with separate is and should values
mtarget = tempfile()
- # istarget = tempfile()
files[:resources] = mtarget
- # files[:isresources] = istarget
resource = mkresource "yay", :target => mtarget
- # resource.is = [:target, istarget]
assert(resource.should(:target), "Did not get a value for target")
- # assert(resource.is(:target), "Did not get a value for target")
list = nil
+
+ # First run it without the resource
assert_nothing_raised do
list = prov.targets
end
+ # Make sure it got the first two, but not the resources file
files.each do |name, file|
- assert(list.include?(file), "Provider did not find %s file" % name)
+ if name == :resources
+ assert(! list.include?(file), "Provider somehow found resource target when no resource was passed")
+ else
+ assert(list.include?(file), "Provider did not find %s file" % name)
+ end
+ end
+
+ # Now list with the resource passed
+ assert_nothing_raised do
+ list = prov.targets("yay" => resource)
+ end
+
+ # And make sure we get all three files
+ files.each do |name, file|
+ assert(list.include?(file), "Provider did not find %s file when resource was passed" % name)
end
end
@@ -331,11 +346,12 @@ class TestParsedFile < Test::Unit::TestCase
# Create some resources.
one = mkresource "one", :one => "a", :two => "c", :target => :yayness
two = mkresource "two", :one => "b", :two => "d", :target => :yayness
+ resources = {"one" => one, "two" => two}
# Write out a file with different data.
prov.target_object(:yayness).write "one b d\ntwo a c"
- prov.prefetch
+ prov.prefetch(resources)
# Apply and flush the first resource.
assert_nothing_raised do
@@ -343,7 +359,7 @@ class TestParsedFile < Test::Unit::TestCase
end
assert_nothing_raised { one.flush }
- # Make sure it changed our file
+ # Make sure it didn't clear out our property hash
assert_equal(:a, one.provider.one)
assert_equal(:c, one.provider.two)
@@ -360,7 +376,7 @@ class TestParsedFile < Test::Unit::TestCase
"Wrote out other resource")
# Now fetch the data again and make sure we're still right
- assert_nothing_raised { prov.prefetch }
+ assert_nothing_raised { prov.prefetch(resources) }
assert_equal("a", one.provider.one)
assert_equal("a", two.provider.one)
@@ -368,9 +384,11 @@ class TestParsedFile < Test::Unit::TestCase
assert_nothing_raised { apply(two) }
assert_nothing_raised { two.flush }
+ # And make sure it didn't clear our hash
assert_equal(:b, two.provider.one)
end
+ # Make sure it works even if the file does not currently exist
def test_creating_file
prov = mkprovider
prov.clear
@@ -387,7 +405,7 @@ class TestParsedFile < Test::Unit::TestCase
resource.flush
end
- assert(prov.target_object(:basic).read.include?("yay a c"),
+ assert_equal("yay a c\n", prov.target_object(:basic).read,
"Did not create file")
# Make a change
@@ -399,8 +417,8 @@ class TestParsedFile < Test::Unit::TestCase
end
# And make sure our resource doesn't appear twice in the file.
- assert_equal("yay b c\n",
- prov.target_object(:basic).read)
+ assert_equal("yay b c\n", prov.target_object(:basic).read,
+ "Wrote record to file twice")
end
# Make sure a record can switch targets.
@@ -472,7 +490,7 @@ class TestParsedFile < Test::Unit::TestCase
notdisk = mkresource "notdisk", :target => :first
prov.target_object(:first).write "ondisk a c\n"
- prov.prefetch
+ prov.prefetch("ondisk" => ondisk, "notdisk" => notdisk)
assert_equal(:present, notdisk.should(:ensure),
"Did not get default ensure value")
@@ -544,7 +562,7 @@ class TestParsedFile < Test::Unit::TestCase
prov.target_object(:yayness).write "bill a c\njill b d"
- list = @type.list
+ list = @type.instances
bill = list.find { |r| r[:name] == "bill" }
jill = list.find { |r| r[:name] == "jill" }
@@ -639,7 +657,6 @@ class TestParsedFile < Test::Unit::TestCase
targeted = {:target => "target"}
prov.send(:instance_variable_set, "@records", records)
prov.expects(:retrieve).with(target).returns([targeted])
- prov.expects(:target_records).with(target).returns([targeted])
prov.expects(:prefetch_hook).with([targeted]).returns([targeted])
diff --git a/test/ral/providers/provider.rb b/test/ral/providers/provider.rb
index 9e59f2008..7fcf3f59d 100755
--- a/test/ral/providers/provider.rb
+++ b/test/ral/providers/provider.rb
@@ -293,6 +293,34 @@ class TestProvider < Test::Unit::TestCase
assert_equal(:base, other.source, "source did not override")
assert_equal(:base, other.source, "source did not override")
end
+
+ # Make sure we can initialize with either a resource or a hash, or none at all.
+ def test_initialize
+ test = @type.provide(:test)
+
+ inst = @type.create :name => "boo"
+ prov = nil
+ assert_nothing_raised("Could not init with a resource") do
+ prov = test.new(inst)
+ end
+ assert_equal(prov.resource, inst, "did not set resource correctly")
+ assert_equal(inst.name, prov.name, "did not get resource name")
+
+ params = {:name => :one, :ensure => :present}
+ assert_nothing_raised("Could not init with a hash") do
+ prov = test.new(params)
+ end
+ assert_equal(params, prov.send(:instance_variable_get, "@property_hash"), "did not set resource correctly")
+ assert_equal(:one, prov.name, "did not get name from hash")
+
+ assert_nothing_raised("Could not init with no argument") do
+ prov = test.new()
+ end
+
+ assert_raise(Puppet::DevError, "did not fail when no name is present") do
+ prov.name
+ end
+ end
end
class TestProviderFeatures < Test::Unit::TestCase
diff --git a/test/ral/types/cron.rb b/test/ral/types/cron.rb
index ead815071..be94463d2 100755
--- a/test/ral/types/cron.rb
+++ b/test/ral/types/cron.rb
@@ -287,9 +287,11 @@ class TestCron < Test::Unit::TestCase
# Write it to our file
assert_apply(cron)
+ @crontype.clear
+
crons = []
assert_nothing_raised {
- @crontype.list.each do |cron|
+ @crontype.instances.each do |cron|
crons << cron
end
}
diff --git a/test/ral/types/package.rb b/test/ral/types/package.rb
index 9aafc3468..e37cdfe06 100755
--- a/test/ral/types/package.rb
+++ b/test/ral/types/package.rb
@@ -11,7 +11,6 @@ class TestPackages < Test::Unit::TestCase
include PuppetTest::FileTesting
def setup
super
- #@list = Puppet.type(:package).getpkglist
Puppet.type(:package).clear
@type = Puppet::Type.type(:package)
end
diff --git a/test/ral/types/resources.rb b/test/ral/types/resources.rb
index 56603c611..82d4e225d 100755
--- a/test/ral/types/resources.rb
+++ b/test/ral/types/resources.rb
@@ -13,7 +13,7 @@ class TestResources < Test::Unit::TestCase
def add_purge_lister
# Now define the list method
class << @purgetype
- def list
+ def instances
$purgemembers.values
end
end
@@ -85,21 +85,9 @@ class TestResources < Test::Unit::TestCase
purger = @type.create :name => "purgetest", :noop => true, :loglevel => :warning
end
assert(purger, "did not get purger manager")
-
- # Make sure we throw an error, because the purger type does
- # not support listing.
-
- # It should work when we set it to false
- assert_nothing_raised do
- purger[:purge] = false
- end
- # but not true
- assert_raise(ArgumentError) do
- purger[:purge] = true
- end
add_purge_lister()
- assert_equal($purgemembers.values.sort, @purgetype.list.sort)
+ assert_equal($purgemembers.values.sort, @purgetype.instances.sort)
# and it should now succeed
assert_nothing_raised do
diff --git a/test/ral/types/sshkey.rb b/test/ral/types/sshkey.rb
index e8ee575d9..9a20dc251 100755
--- a/test/ral/types/sshkey.rb
+++ b/test/ral/types/sshkey.rb
@@ -59,9 +59,9 @@ class TestSSHKey < Test::Unit::TestCase
return key
end
- def test_list
+ def test_instances
assert_nothing_raised {
- Puppet.type(:sshkey).defaultprovider.list
+ Puppet.type(:sshkey).instances
}
count = 0