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 | |
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
36 files changed, 244 insertions, 160 deletions
@@ -1,3 +1,9 @@ + Finishing up the type => provider interface work. Basically, package + providers now return lists of provider instances. In the proces, + I rewrote the interface between package types and providers, and also + enabled prefetching on all packages. This should significantly speed + up most package operations. + Hopefully fixing the file descriptor/open port problems, with patches from Valentin Vidic. 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 diff --git a/test/language/interpreter.rb b/test/language/interpreter.rb index 7fe4eacac..fd1847df9 100755 --- a/test/language/interpreter.rb +++ b/test/language/interpreter.rb @@ -193,7 +193,7 @@ class TestInterpreter < Test::Unit::TestCase assert(culain, "Did not find culain in ldap") assert_nothing_raised do - assert_equal(basenode.classname.to_s, culain.parentclass.classname.to_s, + assert_equal(basenode.classname.to_s, culain.parentobj.classname.to_s, "Did not get parent class") end end diff --git a/test/lib/puppettest/fakes.rb b/test/lib/puppettest/fakes.rb index 3c19d6c43..df1c3732e 100644 --- a/test/lib/puppettest/fakes.rb +++ b/test/lib/puppettest/fakes.rb @@ -114,6 +114,10 @@ module PuppetTest end end + def self.source + self.name + end + def self.supports_parameter?(param) true end @@ -129,6 +133,13 @@ module PuppetTest def initialize(resource) @resource = resource end + + def properties + self.class.resource_type.validproperties.inject({}) do |props, name| + props[name] = self.send(name) || :absent + props + end + end end class FakeParsedProvider < FakeProvider diff --git a/test/ral/providers/mount/parsed.rb b/test/ral/providers/mount/parsed.rb index 37aa6f157..38d4a6675 100755 --- a/test/ral/providers/mount/parsed.rb +++ b/test/ral/providers/mount/parsed.rb @@ -133,12 +133,13 @@ class TestParsedMounts < Test::Unit::TestCase assert(FileTest.exists?(@provider.default_target), "FSTab %s does not exist" % @provider.default_target) + assert_nothing_raised do - @provider.prefetch + @provider.prefetch("/" => type) end - assert_equal(:present, provider.property_hash[:ensure], - "Could not find root fs with provider %s" % provider.name) + assert_equal(:present, type.provider.property_hash[:ensure], + "Could not find root fs with provider %s" % provider.class.name) assert_nothing_raised { assert(provider.mounted?, "Root is considered not mounted") diff --git a/test/ral/providers/package/apt.rb b/test/ral/providers/package/apt.rb index 5197880ff..a56233c0b 100755 --- a/test/ral/providers/package/apt.rb +++ b/test/ral/providers/package/apt.rb @@ -28,7 +28,7 @@ class AptPackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "deinstall ok config-files faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :aptget @@ -56,7 +56,7 @@ class AptPackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "install ok installed faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :aptget ).with( @@ -124,7 +124,7 @@ class AptPackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "deinstall ok config-files faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :aptget ).with( diff --git a/test/ral/providers/package/aptitude.rb b/test/ral/providers/package/aptitude.rb index 891603f64..f8edcebde 100755 --- a/test/ral/providers/package/aptitude.rb +++ b/test/ral/providers/package/aptitude.rb @@ -28,7 +28,7 @@ class AptitudePackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "deinstall ok config-files faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :aptitude @@ -58,7 +58,7 @@ class AptitudePackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "install ok installed faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :aptitude ).with( diff --git a/test/ral/providers/package/aptrpm.rb b/test/ral/providers/package/aptrpm.rb index 0388135df..a3257bcce 100755 --- a/test/ral/providers/package/aptrpm.rb +++ b/test/ral/providers/package/aptrpm.rb @@ -28,7 +28,7 @@ class AptrpmPackageProviderTest < PuppetTest::TestCase '--nodigest', '--qf', "%{NAME}-%{VERSION}-%{RELEASE} %{VERSION}-%{RELEASE}\n" - ).raises(Puppet::ExecutionFailure, "couldn't find rpm").times(2) + ).raises(Puppet::ExecutionFailure, "couldn't find rpm").times(1) pkg.provider.expects( :aptget @@ -56,7 +56,7 @@ class AptrpmPackageProviderTest < PuppetTest::TestCase "%{NAME}-%{VERSION}-%{RELEASE} %{VERSION}-%{RELEASE}\n" ).returns( "faff-1.2.3-1 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :aptget ).with( diff --git a/test/ral/providers/package/dpkg.rb b/test/ral/providers/package/dpkg.rb index 69b6a3c10..7e4427584 100755 --- a/test/ral/providers/package/dpkg.rb +++ b/test/ral/providers/package/dpkg.rb @@ -27,7 +27,7 @@ class DpkgPackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "deinstall ok config-files faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :dpkg @@ -51,7 +51,7 @@ class DpkgPackageProviderTest < PuppetTest::TestCase 'faff' ).returns( "install ok installed faff 1.2.3-1\n" - ).times(2) + ).times(1) pkg.provider.expects( :dpkg ).with( diff --git a/test/ral/providers/service.rb b/test/ral/providers/service.rb index 3e1541be1..d21298162 100755 --- a/test/ral/providers/service.rb +++ b/test/ral/providers/service.rb @@ -55,7 +55,7 @@ class TestLocalService < Test::Unit::TestCase } comp = newcomp("servicetst", service) - service[:ensure] = true + service[:ensure] = :running Puppet.info "Starting %s" % service.name assert_apply(service) @@ -63,10 +63,15 @@ class TestLocalService < Test::Unit::TestCase # Some package systems background the work, so we need to give them # time to do their work. sleep(1.5) + props = nil assert_nothing_raised() { - service.retrieve + props = service.retrieve } - assert(service.insync?, "Service %s is not running" % service.name) + props.each do |prop, value| + if prop.name == :ensure + assert_equal(:running, value, "Service %s is not running" % service.name) + end + end # test refreshing it assert_nothing_raised() { @@ -77,17 +82,22 @@ class TestLocalService < Test::Unit::TestCase assert_nothing_raised() { service[:ensure] = :stopped } - assert_nothing_raised() { - service.retrieve - } - assert(!service.insync?(), "Service %s is not running" % service.name) + props.each do |prop, value| + if prop.name == :ensure + assert_equal(:running, value, "Service %s is not running" % service.name) + end + end Puppet.info "stopping %s" % service.name assert_events([:service_stopped], comp) sleep(1.5) assert_nothing_raised() { - service.retrieve + props = service.retrieve } - assert(service.insync?, "Service %s has not stopped" % service.name) + props.each do |prop, value| + if prop.name == :ensure + assert_equal(:stopped, value, "Service %s is not running" % service.name) + end + end end def cycleenable(service) @@ -104,26 +114,35 @@ class TestLocalService < Test::Unit::TestCase # Some package systems background the work, so we need to give them # time to do their work. sleep(1.5) + props = nil assert_nothing_raised() { - service.retrieve + props = service.retrieve } - assert(service.insync?, "Service %s is not enabled" % service.name) + props.each do |prop, value| + if prop.name == :enable + assert_equal(value, :true, "Service %s is not enabled" % service.name) + end + end - # now stop it + # now disable it assert_nothing_raised() { service[:enable] = false } assert_nothing_raised() { - service.retrieve + props = service.retrieve } - assert(!service.insync?(), "Service %s is not enabled" % service.name) + props.each do |prop, value| + assert_equal(value, :true, "Service %s is already disabled" % service.name) + end Puppet.info "disabling %s" % service.name assert_events([:service_disabled], comp) sleep(1.5) assert_nothing_raised() { - service.retrieve + props = service.retrieve } - assert(service.insync?, "Service %s has not been disabled" % service.name) + props.each do |prop, value| + assert_equal(value, :false, "Service %s is still enabled" % service.name) + end end def test_status @@ -174,30 +193,37 @@ class TestLocalService < Test::Unit::TestCase startenable = nil startensure = nil svc[:check] = [:ensure, :enable] - svc.retrieve + properties = nil assert_nothing_raised("Could not get status") { - startenable = svc.property(:enable).is - startensure = svc.property(:ensure).is + properties = svc.retrieve } + initial = properties.dup svc[:enable] = false svc[:ensure] = :stopped assert_apply(svc) sleep 1 - svc.retrieve - assert(svc.insync?, "Service did not sync both properties") + assert_nothing_raised("Could not get status") { + properties = svc.retrieve + } + properties.each do |prop, value| + assert(prop.insync?(value), "Service did not sync %s property" % prop.name) + end svc[:enable] = true svc[:ensure] = :running assert_apply(svc) sleep 1 - svc.retrieve - assert(svc.insync?, "Service did not sync both properties") + assert_nothing_raised("Could not get status") { + properties = svc.retrieve + } + assert(svc.insync?(properties), "Service did not sync both properties") - svc[:enable] = startenable - svc[:ensure] = startensure + initial.each do |prop, value| + svc[prop.name] = value + end assert_apply(svc) Puppet.type(:component).clear end diff --git a/test/ral/providers/user.rb b/test/ral/providers/user.rb index dfc9b6136..7e5290549 100755 --- a/test/ral/providers/user.rb +++ b/test/ral/providers/user.rb @@ -164,13 +164,12 @@ class TestUserProvider < Test::Unit::TestCase # Now try it by object assert_nothing_raised { - names = @provider.list + names = @provider.instances } assert(names.length > 0, "Listed no users as objects") names.each do |obj| - assert_instance_of(Puppet::Type.type(:user), obj) - assert(obj[:provider], "Provider was not set") + assert_instance_of(@provider, obj) end end @@ -186,7 +185,7 @@ class TestUserProvider < Test::Unit::TestCase Puppet::Type.type(:user).validproperties.each do |property| next if property == :ensure # This is mostly in place for the 'password' stuff. - next unless user.class.supports_parameter?(property) + next unless user.class.supports_parameter?(property) and Puppet.features.root? val = nil assert_nothing_raised { val = user.send(property) diff --git a/test/ral/types/mount.rb b/test/ral/types/mount.rb index 4b76b3ec2..24c353692 100755 --- a/test/ral/types/mount.rb +++ b/test/ral/types/mount.rb @@ -18,10 +18,14 @@ class TestMounts < Test::Unit::TestCase :yayness end + def self.instances + [] + end + def create @ensure = :present - @model.class.validproperties.each do |property| - if value = @model.should(property) + @resource.class.validproperties.each do |property| + if value = @resource.should(property) self.send(property.to_s + "=", value) end end @@ -188,19 +192,19 @@ class TestMounts < Test::Unit::TestCase # Darwin doesn't put its mount table into netinfo unless Facter.value(:operatingsystem) == "Darwin" - def test_list - list = nil - assert(@mount.respond_to?(:list), - "No list method defined for mount") + def test_instances + instances = nil + assert(@mount.respond_to?(:instances), + "No instances method defined for mount") assert_nothing_raised do - list = Puppet::Type.type(:mount).list + instances = Puppet::Type.type(:mount).instances end - assert(list.length > 0, "Did not return any mounts") + assert(instances.length > 0, "Did not return any mounts") - root = list.find { |o| o[:name] == "/" } - assert(root, "Could not find root root filesystem in list results") + root = instances.find { |o| o[:name] == "/" } + assert(root, "Could not find root root filesystem in instances results") current_values = nil assert_nothing_raised do @@ -245,8 +249,8 @@ class TestMounts < Test::Unit::TestCase assert_events([], mount) # Now try listing and making sure the object is actually gone. - list = mount.provider.class.list - assert(! list.find { |r| r[:name] == mount[:name] }, + instances = mount.provider.class.instances + assert(! instances.find { |r| r[:name] == mount[:name] }, "Mount was not actually removed") end end diff --git a/test/ral/types/package.rb b/test/ral/types/package.rb index e37cdfe06..6e0ddc035 100755 --- a/test/ral/types/package.rb +++ b/test/ral/types/package.rb @@ -4,6 +4,7 @@ $:.unshift("../../lib") if __FILE__ =~ /\.rb$/ require 'puppettest' require 'facter' +require 'mocha' $platform = Facter["operatingsystem"].value @@ -81,6 +82,61 @@ class TestPackages < Test::Unit::TestCase "Incorrect default package format") end end + + # Make sure we can prefetch and retrieve packages + def test_package_instances + providers = [] + @type.instances.each do |resource| + # Just do one of each type + next if providers.include?(resource.provider.class) + providers << resource.provider.class + + # We should have data on the resource + assert(resource.exists?, "Listed resource thinks it's absent") + + # Now flush the resource and make sure it clears the property_hash + assert_nothing_raised("Could not flush package") do + resource.flush + end + + assert_equal(:absent, resource.provider.get(:ensure), "Flushing did not empty property hash") + + # And query anew + props = nil + assert_nothing_raised("Could not retrieve package again") do + props = resource.retrieve + end + provider_props = resource.provider.send(:instance_variable_get, "@property_hash") + props.each do |prop, value| + assert_equal(value, provider_props[prop.name], "Query did not return same result as the property_hash for %s" % prop.name) + end + end + end + + # Make sure we can prefetch package information, rather than getting it one package at a time. + def test_prefetch + @type.providers_by_source.each do |provider| + # First get a list of packages + list = provider.instances + + packages = {} + list.each do |package| + packages[package.name] = @type.create(:name => package.name, :ensure => :installed) + break if packages.length > 4 + end + + # Now prefetch using that list of packages + assert_nothing_raised("Could not prefetch with %s" % provider.name) do + provider.prefetch(packages) + end + + # And make sure each package is marked as existing, without calling query + packages.each do |name, package| + assert(package.exists?, "Package of type %s not marked present" % provider.name) + package.provider.expects(:query).never + end + end + end end # $Id$ |