summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-06-08 17:20:00 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-06-08 17:20:00 +0000
commit73502a7cac443890792ffd9d3bb4778a90413e61 (patch)
tree77ba7aa23d82a21b4bdfb9c135ceba086795b449
parentbf82d51737df7509faf4601dbbf15b265bd9da3d (diff)
downloadpuppet-73502a7cac443890792ffd9d3bb4778a90413e61.tar.gz
puppet-73502a7cac443890792ffd9d3bb4778a90413e61.tar.xz
puppet-73502a7cac443890792ffd9d3bb4778a90413e61.zip
Finishing off the type/provider interface work, including adding package prefetch for all packages. The only not-done one is yum -- prefetch is set up for rpm, but not yum. We need to modify prefetching so that it also prefetches latest information, to avoid having to run yum so many times.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2555 980ebf18-57e1-0310-9a29-db15c13687c0
-rw-r--r--CHANGELOG6
-rw-r--r--lib/puppet/metatype/instances.rb24
-rw-r--r--lib/puppet/provider.rb5
-rw-r--r--lib/puppet/provider/nameservice.rb16
-rwxr-xr-xlib/puppet/provider/package/apple.rb4
-rwxr-xr-xlib/puppet/provider/package/apt.rb2
-rwxr-xr-xlib/puppet/provider/package/aptitude.rb2
-rw-r--r--lib/puppet/provider/package/aptrpm.rb2
-rwxr-xr-xlib/puppet/provider/package/blastwave.rb2
-rwxr-xr-xlib/puppet/provider/package/darwinport.rb4
-rwxr-xr-xlib/puppet/provider/package/dpkg.rb6
-rwxr-xr-xlib/puppet/provider/package/freebsd.rb11
-rwxr-xr-xlib/puppet/provider/package/gem.rb4
-rwxr-xr-xlib/puppet/provider/package/openbsd.rb4
-rw-r--r--lib/puppet/provider/package/pkgdmg.rb4
-rw-r--r--lib/puppet/provider/package/portage.rb4
-rwxr-xr-xlib/puppet/provider/package/ports.rb14
-rwxr-xr-xlib/puppet/provider/package/rpm.rb21
-rwxr-xr-xlib/puppet/provider/package/sun.rb6
-rwxr-xr-xlib/puppet/provider/package/sunfreeware.rb2
-rw-r--r--lib/puppet/provider/package/up2date.rb2
-rwxr-xr-xlib/puppet/provider/package/yum.rb2
-rw-r--r--lib/puppet/transaction.rb1
-rw-r--r--lib/puppet/type/package.rb47
-rw-r--r--lib/puppet/type/service.rb4
-rwxr-xr-xtest/language/interpreter.rb2
-rw-r--r--test/lib/puppettest/fakes.rb11
-rwxr-xr-xtest/ral/providers/mount/parsed.rb7
-rwxr-xr-xtest/ral/providers/package/apt.rb6
-rwxr-xr-xtest/ral/providers/package/aptitude.rb4
-rwxr-xr-xtest/ral/providers/package/aptrpm.rb4
-rwxr-xr-xtest/ral/providers/package/dpkg.rb4
-rwxr-xr-xtest/ral/providers/service.rb76
-rwxr-xr-xtest/ral/providers/user.rb7
-rwxr-xr-xtest/ral/types/mount.rb28
-rwxr-xr-xtest/ral/types/package.rb56
36 files changed, 244 insertions, 160 deletions
diff --git a/CHANGELOG b/CHANGELOG
index f053ce238..1408b4962 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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$