FYI, this patch is associated with ticket 6368 ( http://projects.puppetlabs.com/issues/6368)
On Sat, Feb 19, 2011 at 11:38 AM, Ian Ward Comfort <[email protected]>wrote: > The File type will now autorequire the nearest ancestor directory found in > the > catalog, not just the file's parent directory. This is useful for setting > up > transitive relationships in cases when a package or other resource creates > a > large directory hierarchy, e.g. > > package { 'foo': ensure => present } > file { '/var/lib/foo': require => Package['foo'] } > > This will make File resources at arbitrarily deep levels under /var/lib/foo > automatically (transitively) require the foo package. > > Only the nearest ancestor is autorequired, to prevent explosion of the > relationship graph. > > Signed-off-by: Ian Ward Comfort <[email protected]> > --- > > On 18 Feb 2011, at 2:20 PM, Luke Kanies wrote: > > autorequire is a bit of a weird beast, so I know why you're having > problems. > > > > My code was just about changing the behavior of existing autorequire, > rather > > than adding a new kind of autorequire. > > > > The code I sent was just replacing the *call* to that method you're > looking > > at - weird, but true. > > > > Glad to hear it seems to work. And I notice that your code is far > simpler > > and clearer than mine. :) > > OK, I was definitely quite confused before, but having spent some time > *actually* learning Ruby and swimming about this part of the codebase, I > think > I've got it. Given the late stage at which Type#autorequire gets called, > this > strategy works just fine. > > This patch is based on master, but I can rebase if that's wrong. It can > also > be pulled from: > > git://github.com/icomfort/puppet.git file-autorequire-first-ancestor > > lib/puppet/type/file.rb | 10 ++++++++-- > spec/unit/type/file_spec.rb | 39 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 47 insertions(+), 2 deletions(-) > > diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb > index 963b9e5..da09392 100644 > --- a/lib/puppet/type/file.rb > +++ b/lib/puppet/type/file.rb > @@ -244,11 +244,17 @@ Puppet::Type.newtype(:file) do > newvalues(:first, :all) > end > > - # Autorequire any parent directories. > + # Autorequire the nearest ancestor directory found in the catalog. > autorequire(:file) do > basedir = File.dirname(self[:path]) > if basedir != self[:path] > - basedir > + parents = [] > + until basedir == parents.last > + parents << basedir > + basedir = File.dirname(basedir) > + end > + # The filename of the first ancestor found, or nil > + parents.find { |dir| catalog.resource(:file, dir) } > else > nil > end > diff --git a/spec/unit/type/file_spec.rb b/spec/unit/type/file_spec.rb > index 539782f..cbd6812 100755 > --- a/spec/unit/type/file_spec.rb > +++ b/spec/unit/type/file_spec.rb > @@ -169,6 +169,19 @@ describe Puppet::Type.type(:file) do > reqs[0].target.must == file > end > > + it "should autorequire its nearest ancestor directory" do > + file = Puppet::Type::File.new(:path => "/foo/bar/baz") > + dir = Puppet::Type::File.new(:path => "/foo") > + root = Puppet::Type::File.new(:path => "/") > + @catalog.add_resource file > + @catalog.add_resource dir > + @catalog.add_resource root > + reqs = file.autorequire > + reqs.length.must == 1 > + reqs[0].source.must == dir > + reqs[0].target.must == file > + end > + > it "should not autorequire its parent dir if its parent dir is > itself" do > file = Puppet::Type::File.new(:path => "/") > @catalog.add_resource file > @@ -242,6 +255,19 @@ describe Puppet::Type.type(:file) do > reqs[0].target.must == file > end > > + it "should autorequire its nearest ancestor directory" do > + file = Puppet::Type::File.new(:path => "X:/foo/bar/baz") > + dir = Puppet::Type::File.new(:path => "X:/foo") > + root = Puppet::Type::File.new(:path => "X:/") > + @catalog.add_resource file > + @catalog.add_resource dir > + @catalog.add_resource root > + reqs = file.autorequire > + reqs.length.must == 1 > + reqs[0].source.must == dir > + reqs[0].target.must == file > + end > + > it "should not autorequire its parent dir if its parent dir is > itself" do > file = Puppet::Type::File.new(:path => "X:/") > @catalog.add_resource file > @@ -303,6 +329,19 @@ describe Puppet::Type.type(:file) do > reqs[0].target.must == file > end > > + it "should autorequire its nearest ancestor directory" do > + file = Puppet::Type::File.new(:path => "//server/foo/bar/baz/qux") > + dir = Puppet::Type::File.new(:path => "//server/foo/bar") > + root = Puppet::Type::File.new(:path => "//server/foo") > + @catalog.add_resource file > + @catalog.add_resource dir > + @catalog.add_resource root > + reqs = file.autorequire > + reqs.length.must == 1 > + reqs[0].source.must == dir > + reqs[0].target.must == file > + end > + > it "should not autorequire its parent dir if its parent dir is > itself" do > file = Puppet::Type::File.new(:path => "//server/foo") > @catalog.add_resource file > -- > 1.7.3.2 > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Developers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/puppet-dev?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
