summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-10-22 22:33:06 -0500
committerLuke Kanies <luke@madstop.com>2007-10-22 22:33:06 -0500
commit7fa99b08f9aa3777fba82f24eb5bb391f3758f48 (patch)
treea9dc23c0cdf3ecbc4a177086a5c699ad4f3b00f2
parent688fcdf11a685dfda297beff50de8d4c751494d9 (diff)
Link handling is now in the file serving classes.
This was done by putting all of the functionality in the Content and Metadata class (actually, in a new base class for them). There are still some issues, and there need to be integration tests between the :local (soon to be renamed :file) termini for these classes.
-rw-r--r--lib/puppet/file_serving/content.rb18
-rw-r--r--lib/puppet/file_serving/file_base.rb46
-rw-r--r--lib/puppet/file_serving/metadata.rb35
-rw-r--r--lib/puppet/indirector/file_content/local.rb2
-rw-r--r--lib/puppet/indirector/file_metadata/local.rb8
-rw-r--r--lib/puppet/indirector/file_server.rb2
-rw-r--r--lib/puppet/indirector/module_files.rb2
-rwxr-xr-xspec/integration/indirector/module_files.rb2
-rw-r--r--spec/lib/shared_behaviours/file_server_terminus.rb2
-rwxr-xr-xspec/unit/file_serving/content.rb81
-rwxr-xr-xspec/unit/file_serving/file_base.rb85
-rwxr-xr-xspec/unit/file_serving/metadata.rb94
-rwxr-xr-xspec/unit/file_serving/mount.rb4
-rwxr-xr-xspec/unit/indirector/file_content/local.rb11
-rwxr-xr-xspec/unit/indirector/file_metadata/local.rb19
-rwxr-xr-xspec/unit/indirector/file_server.rb12
-rwxr-xr-xspec/unit/indirector/module_files.rb13
17 files changed, 349 insertions, 87 deletions
diff --git a/lib/puppet/file_serving/content.rb b/lib/puppet/file_serving/content.rb
index 38ca80fb0..3cb428e63 100644
--- a/lib/puppet/file_serving/content.rb
+++ b/lib/puppet/file_serving/content.rb
@@ -4,30 +4,28 @@
require 'puppet/indirector'
require 'puppet/file_serving'
+require 'puppet/file_serving/file_base'
require 'puppet/file_serving/terminus_selector'
# A class that handles retrieving file contents.
# It only reads the file when its content is specifically
# asked for.
-class Puppet::FileServing::Content
+class Puppet::FileServing::Content < Puppet::FileServing::FileBase
extend Puppet::Indirector
indirects :file_content, :extend => Puppet::FileServing::TerminusSelector
attr_reader :path
- def content
- ::File.read(@path)
- end
-
- def initialize(path)
- raise ArgumentError.new("Files must be fully qualified") unless path =~ /^#{::File::SEPARATOR}/
- raise ArgumentError.new("Files must exist") unless FileTest.exists?(path)
+ # Read the content of our file in.
+ def content(base = nil)
+ # This stat can raise an exception, too.
+ raise(ArgumentError, "Cannot read the contents of links unless following links") if stat(base).ftype == "symlink"
- @path = path
+ ::File.read(full_path(base))
end
# Just return the file contents as the yaml. This allows us to
- # avoid escaping or any such thing. LAK:FIXME Not really sure how
+ # avoid escaping or any such thing. LAK:NOTE Not really sure how
# this will behave if the file contains yaml... I think the far
# side needs to understand that it's a plain string.
def to_yaml
diff --git a/lib/puppet/file_serving/file_base.rb b/lib/puppet/file_serving/file_base.rb
new file mode 100644
index 000000000..b2e9a0656
--- /dev/null
+++ b/lib/puppet/file_serving/file_base.rb
@@ -0,0 +1,46 @@
+#
+# Created by Luke Kanies on 2007-10-22.
+# Copyright (c) 2007. All rights reserved.
+
+require 'puppet/file_serving'
+
+# The base class for Content and Metadata; provides common
+# functionality like the behaviour around links.
+class Puppet::FileServing::FileBase
+ attr_accessor :path, :base_path
+
+ def full_path(base = nil)
+ base ||= base_path || raise(ArgumentError, "You must set or provide a base path")
+
+ full = File.join(base, self.path)
+ end
+
+ def initialize(path, options = {})
+ raise ArgumentError.new("Files must not be fully qualified") if path =~ /^#{::File::SEPARATOR}/
+
+ @path = path
+ @links = :manage
+
+ options.each do |param, value|
+ begin
+ send param.to_s + "=", value
+ rescue NoMethodError
+ raise ArgumentError, "Invalid option %s for %s" % [param, self.class]
+ end
+ end
+ end
+
+ attr_reader :links
+ def links=(value)
+ raise(ArgumentError, ":links can only be set to :manage or :follow") unless [:manage, :follow].include?(value)
+ @links = value
+ end
+
+ # Stat our file, using the appropriate link-sensitive method.
+ def stat(base = nil)
+ unless defined?(@stat_method)
+ @stat_method = self.links == :manage ? :lstat : :stat
+ end
+ File.send(@stat_method, full_path(base))
+ end
+end
diff --git a/lib/puppet/file_serving/metadata.rb b/lib/puppet/file_serving/metadata.rb
index 7adb66981..62ebccca9 100644
--- a/lib/puppet/file_serving/metadata.rb
+++ b/lib/puppet/file_serving/metadata.rb
@@ -5,17 +5,18 @@
require 'puppet'
require 'puppet/indirector'
require 'puppet/file_serving'
+require 'puppet/file_serving/file_base'
require 'puppet/util/checksums'
require 'puppet/file_serving/terminus_selector'
# A class that handles retrieving file metadata.
-class Puppet::FileServing::Metadata
+class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
include Puppet::Util::Checksums
extend Puppet::Indirector
indirects :file_metadata, :extend => Puppet::FileServing::TerminusSelector
- attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum
+ attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination
def checksum_type=(type)
raise(ArgumentError, "Unsupported checksum type %s" % type) unless respond_to?("%s_file" % type)
@@ -23,32 +24,36 @@ class Puppet::FileServing::Metadata
@checksum_type = type
end
- def get_attributes
- stat = File.stat(path)
+ # Retrieve the attributes for this file, relative to a base directory.
+ # Note that File.stat raises Errno::ENOENT if the file is absent and this
+ # method does not catch that exception.
+ def collect_attributes(base = nil)
+ real_path = full_path(base)
+ stat = stat(base)
@owner = stat.uid
@group = stat.gid
+ @ftype = stat.ftype
+
# Set the octal mode, but as a string.
@mode = "%o" % (stat.mode & 007777)
- @checksum = get_checksum
- end
-
- def initialize(path = nil)
- if path
- raise ArgumentError.new("Files must be fully qualified") unless path =~ /^#{::File::SEPARATOR}/
- raise ArgumentError.new("Files must exist") unless FileTest.exists?(path)
-
- @path = path
+ if stat.ftype == "symlink"
+ @destination = File.readlink(real_path)
+ else
+ @checksum = get_checksum(real_path)
end
+ end
+ def initialize(*args)
@checksum_type = "md5"
+ super
end
private
# Retrieve our checksum.
- def get_checksum
- ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, @path)
+ def get_checksum(path)
+ ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, path)
end
end
diff --git a/lib/puppet/indirector/file_content/local.rb b/lib/puppet/indirector/file_content/local.rb
index c2262c82d..a9c45d59e 100644
--- a/lib/puppet/indirector/file_content/local.rb
+++ b/lib/puppet/indirector/file_content/local.rb
@@ -17,7 +17,7 @@ class Puppet::Indirector::FileContent::Local < Puppet::Indirector::File
def find(key, options = {})
uri = key2uri(key)
return nil unless FileTest.exists?(uri.path)
- model.new(uri.path)
+ model.new(uri.path, :links => options[:links])
end
def search(key, options = {})
diff --git a/lib/puppet/indirector/file_metadata/local.rb b/lib/puppet/indirector/file_metadata/local.rb
index 86e1172f9..d696bc769 100644
--- a/lib/puppet/indirector/file_metadata/local.rb
+++ b/lib/puppet/indirector/file_metadata/local.rb
@@ -14,12 +14,12 @@ class Puppet::Indirector::FileMetadata::Local < Puppet::Indirector::Code
include Puppet::Util::URIHelper
include Puppet::FileServing::TerminusHelper
- def find(key)
+ def find(key, options = {})
uri = key2uri(key)
return nil unless FileTest.exists?(uri.path)
- data = model.new(uri.path)
- data.get_attributes
+ data = model.new(uri.path, :links => options[:links])
+ data.collect_attributes
return data
end
@@ -27,6 +27,6 @@ class Puppet::Indirector::FileMetadata::Local < Puppet::Indirector::Code
def search(key, options = {})
uri = key2uri(key)
return nil unless FileTest.exists?(uri.path)
- path2instances(uri.path, options).each { |instance| instance.get_attributes }
+ path2instances(uri.path, options).each { |instance| instance.collect_attributes }
end
end
diff --git a/lib/puppet/indirector/file_server.rb b/lib/puppet/indirector/file_server.rb
index 46b0c40f2..de88bdc18 100644
--- a/lib/puppet/indirector/file_server.rb
+++ b/lib/puppet/indirector/file_server.rb
@@ -25,7 +25,7 @@ class Puppet::Indirector::FileServer < Puppet::Indirector::Terminus
# Find our key using the fileserver.
def find(key, options = {})
return nil unless path = find_path(key, options)
- return model.new(path)
+ return model.new(path, :links => options[:links])
end
# Search for files. This returns an array rather than a single
diff --git a/lib/puppet/indirector/module_files.rb b/lib/puppet/indirector/module_files.rb
index 815da2efe..12794e4c7 100644
--- a/lib/puppet/indirector/module_files.rb
+++ b/lib/puppet/indirector/module_files.rb
@@ -30,7 +30,7 @@ class Puppet::Indirector::ModuleFiles < Puppet::Indirector::Terminus
def find(key, options = {})
return nil unless path = find_path(key, options)
- return model.new(path)
+ return model.new(path, :links => options[:links])
end
# Try to find our module.
diff --git a/spec/integration/indirector/module_files.rb b/spec/integration/indirector/module_files.rb
index 67209fb39..3725a1286 100755
--- a/spec/integration/indirector/module_files.rb
+++ b/spec/integration/indirector/module_files.rb
@@ -19,7 +19,7 @@ describe Puppet::Indirector::ModuleFiles, " when interacting with Puppet::Module
FileTest.expects(:exists?).with(filepath).returns(true)
- @terminus.model.expects(:new).with(filepath)
+ @terminus.model.expects(:new).with(filepath, :links => nil)
@terminus.find("puppetmounts://host/modules/mymod/myfile")
end
diff --git a/spec/lib/shared_behaviours/file_server_terminus.rb b/spec/lib/shared_behaviours/file_server_terminus.rb
index c18d74f81..e1ec35251 100644
--- a/spec/lib/shared_behaviours/file_server_terminus.rb
+++ b/spec/lib/shared_behaviours/file_server_terminus.rb
@@ -32,7 +32,7 @@ describe "Puppet::Indirector::FileServerTerminus", :shared => true do
path = "/my/mount/path/my/file"
FileTest.stubs(:exists?).with(path).returns(true)
- @test_class.expects(:new).with(path).returns(:myinstance)
+ @test_class.expects(:new).with(path, :links => nil).returns(:myinstance)
FileTest.stubs(:exists?).with("/my/mount/path").returns(true)
@mount1.expects(:file).with("my/file", :node => nil).returns(path)
diff --git a/spec/unit/file_serving/content.rb b/spec/unit/file_serving/content.rb
index 593278bf4..e15aa8be6 100755
--- a/spec/unit/file_serving/content.rb
+++ b/spec/unit/file_serving/content.rb
@@ -5,6 +5,10 @@ require File.dirname(__FILE__) + '/../../spec_helper'
require 'puppet/file_serving/content'
describe Puppet::FileServing::Content do
+ it "should should be a subclass of FileBase" do
+ Puppet::FileServing::Content.superclass.should equal(Puppet::FileServing::FileBase)
+ end
+
it "should indirect file_content" do
Puppet::FileServing::Content.indirection.name.should == :file_content
end
@@ -15,41 +19,80 @@ describe Puppet::FileServing::Content do
end
describe Puppet::FileServing::Content, " when initializing" do
+ it "should accept a file path" do
+ Puppet::FileServing::Content.new("not/qualified").path.should == "not/qualified"
+ end
+
+ it "should not allow a fully qualified file path" do
+ proc { Puppet::FileServing::Content.new("/fully/qualified") }.should raise_error(ArgumentError)
+ end
+
+ it "should allow specification of whether links should be managed" do
+ Puppet::FileServing::Content.new("not/qualified", :links => :manage)
+ end
+
+ it "should fail if :links is set to anything other than :manage or :follow" do
+ Puppet::FileServing::Content.new("not/qualified", :links => :manage)
+ end
+
+ it "should default to :manage for :links" do
+ Puppet::FileServing::Content.new("not/qualified", :links => :manage)
+ end
+end
+
+describe Puppet::FileServing::Content, " when returning the contents" do
before do
- @path = "/my/file"
+ @content = Puppet::FileServing::Content.new("sub/path", :links => :follow)
+ @base = "/my/base"
+ @full = "/my/base/sub/path"
end
- it "should accept a file path" do
- FileTest.expects(:exists?).with(@path).returns(true)
- Puppet::FileServing::Content.new(@path).path.should == @path
+ it "should fail if the file is a symlink and links are set to :manage" do
+ @content.links = :manage
+ File.expects(:lstat).with(@full).returns stub("stat", :ftype => "symlink")
+ proc { @content.content(@base) }.should raise_error(ArgumentError)
end
- it "should require a fully qualified file path" do
- proc { Puppet::FileServing::Content.new("unqualified") }.should raise_error(ArgumentError)
+ it "should accept a base path path to which the file should be relative" do
+ File.expects(:stat).with(@full).returns stub("stat", :ftype => "file")
+ File.expects(:read).with(@full).returns(:mycontent)
+ @content.content(@base).should == :mycontent
end
- it "should require the path to exist" do
- FileTest.expects(:exists?).with(@path).returns(false)
- proc { Puppet::FileServing::Content.new(@path) }.should raise_error(ArgumentError)
+ it "should use the set base path if one is not provided" do
+ @content.base_path = @base
+ File.expects(:stat).with(@full).returns stub("stat", :ftype => "file")
+ File.expects(:read).with(@full).returns(:mycontent)
+ @content.content()
end
- it "should not stat the file" do
- FileTest.expects(:exists?).with(@path).returns(true)
- File.expects(:read).with(@path).never
- Puppet::FileServing::Content.new(@path)
+ it "should fail if a base path is neither set nor provided" do
+ proc { @content.content() }.should raise_error(ArgumentError)
+ end
+
+ it "should raise Errno::ENOENT if the file is absent" do
+ @content.base_path = "/there/is/absolutely/no/chance/that/this/path/exists"
+ proc { @content.content() }.should raise_error(Errno::ENOENT)
+ end
+
+ it "should return the contents of the path if the file exists" do
+ File.expects(:stat).with(@full).returns stub("stat", :ftype => "file")
+ File.expects(:read).with(@full).returns(:mycontent)
+ @content.content(@base).should == :mycontent
end
end
describe Puppet::FileServing::Content, " when converting to yaml" do
- before do
- @path = "/my/file"
- FileTest.expects(:exists?).with(@path).returns(true)
- @content = Puppet::FileServing::Content.new(@path)
+ it "should fail if no base path has been set" do
+ @content = Puppet::FileServing::Content.new("some/path")
+ proc { @content.to_yaml }.should raise_error(ArgumentError)
end
it "should return the file contents" do
- File.expects(:read).with(@path).returns("mycontent")
- @content.to_yaml.should == "mycontent"
+ @content = Puppet::FileServing::Content.new("some/path")
+ @content.base_path = "/base/path"
+ @content.expects(:content).returns(:content)
+ @content.to_yaml.should == :content
end
end
diff --git a/spec/unit/file_serving/file_base.rb b/spec/unit/file_serving/file_base.rb
new file mode 100755
index 000000000..14be6d003
--- /dev/null
+++ b/spec/unit/file_serving/file_base.rb
@@ -0,0 +1,85 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet/file_serving/file_base'
+
+describe Puppet::FileServing::FileBase, " when initializing" do
+ it "should accept a file path" do
+ Puppet::FileServing::FileBase.new("not/qualified").path.should == "not/qualified"
+ end
+
+ it "should not allow a fully qualified file path" do
+ proc { Puppet::FileServing::FileBase.new("/fully/qualified") }.should raise_error(ArgumentError)
+ end
+
+ it "should allow specification of whether links should be managed" do
+ Puppet::FileServing::FileBase.new("not/qualified", :links => :manage).links.should == :manage
+ end
+
+ it "should fail if :links is set to anything other than :manage or :follow" do
+ proc { Puppet::FileServing::FileBase.new("not/qualified", :links => :else) }.should raise_error(ArgumentError)
+ end
+
+ it "should default to :manage for :links" do
+ Puppet::FileServing::FileBase.new("not/qualified").links.should == :manage
+ end
+end
+
+describe Puppet::FileServing::FileBase do
+ it "should provide a method for setting the base path" do
+ @file = Puppet::FileServing::FileBase.new("not/qualified")
+ @file.base_path = "/something"
+ @file.base_path.should == "/something"
+ end
+end
+
+describe Puppet::FileServing::FileBase, " when determining the full file path" do
+ it "should return the provided path joined with the qualified path if a path is provided" do
+ @file = Puppet::FileServing::FileBase.new("not/qualified")
+ @file.full_path("/this/file").should == "/this/file/not/qualified"
+ end
+
+ it "should return the set base path joined with the qualified path if a base path is set" do
+ @file = Puppet::FileServing::FileBase.new("not/qualified")
+ @file.base_path = "/this/file"
+ @file.full_path.should == "/this/file/not/qualified"
+ end
+
+ it "should should fail if a base path is neither provided nor set" do
+ @file = Puppet::FileServing::FileBase.new("not/qualified")
+ proc { @file.full_path }.should raise_error(ArgumentError)
+ end
+end
+
+describe Puppet::FileServing::FileBase, " when stat'ing files" do
+ before do
+ @file = Puppet::FileServing::FileBase.new("not/qualified")
+ end
+
+ it "should join the provided path with the qualified path is a path is provided" do
+ File.expects(:lstat).with("/this/file/not/qualified").returns stub("stat", :ftype => "file")
+ @file.stat("/this/file")
+ end
+
+ it "should use the set base path if no base is provided" do
+ @file.base_path = "/this/file"
+ File.expects(:lstat).with("/this/file/not/qualified").returns stub("stat", :ftype => "file")
+ @file.stat
+ end
+
+ it "should fail if a base path is neither set nor provided" do
+ proc { @file.stat }.should raise_error(ArgumentError)
+ end
+
+ it "should use :lstat if :links is set to :manage" do
+ File.expects(:lstat).with("/this/file/not/qualified").returns stub("stat", :ftype => "file")
+ @file.stat("/this/file")
+ end
+
+ it "should use :stat if :links is set to :follow" do
+ File.expects(:stat).with("/this/file/not/qualified").returns stub("stat", :ftype => "file")
+ @file.links = :follow
+ @file.stat("/this/file")
+ end
+end
diff --git a/spec/unit/file_serving/metadata.rb b/spec/unit/file_serving/metadata.rb
index 1237c3184..27ebe2471 100755
--- a/spec/unit/file_serving/metadata.rb
+++ b/spec/unit/file_serving/metadata.rb
@@ -15,40 +15,80 @@ describe Puppet::FileServing::Metadata do
end
describe Puppet::FileServing::Metadata, " when initializing" do
- it "should allow initialization without a path" do
- proc { Puppet::FileServing::Metadata.new() }.should_not raise_error
+ it "should not allow initialization without a path" do
+ proc { Puppet::FileServing::Metadata.new() }.should raise_error(ArgumentError)
end
- it "should allow initialization with a path" do
- proc { Puppet::FileServing::Metadata.new("unqualified") }.should raise_error(ArgumentError)
+ it "should not allow the path to be fully qualified if it is provided" do
+ proc { Puppet::FileServing::Metadata.new("/fully/qualified") }.should raise_error(ArgumentError)
end
- it "should the path to be fully qualified if it is provied" do
- proc { Puppet::FileServing::Metadata.new("unqualified") }.should raise_error(ArgumentError)
+ it "should allow initialization with a relative path" do
+ Puppet::FileServing::Metadata.new("not/fully/qualified")
end
- it "should require the path to exist if it is provided" do
- FileTest.expects(:exists?).with("/no/such/path").returns(false)
- proc { Puppet::FileServing::Metadata.new("/no/such/path") }.should raise_error(ArgumentError)
+ it "should allow specification of whether links should be managed" do
+ Puppet::FileServing::Metadata.new("not/qualified", :links => :manage)
+ end
+
+ it "should fail if :links is set to anything other than :manage or :follow" do
+ Puppet::FileServing::Metadata.new("not/qualified", :links => :manage)
+ end
+
+ it "should default to :manage for :links" do
+ Puppet::FileServing::Metadata.new("not/qualified", :links => :manage)
end
end
-describe Puppet::FileServing::Metadata do
+describe Puppet::FileServing::Metadata, " when finding the file to use for setting attributes" do
+ before do
+ @metadata = Puppet::FileServing::Metadata.new("my/path")
+
+ @base = "/base/path"
+ @full = "/base/path/my/path"
+
+ # Use a symlink because it's easier to test -- no checksumming
+ @stat = stub "stat", :uid => 10, :gid => 20, :mode => 0755, :ftype => "symlink"
+ end
+
+ it "should accept a base path path to which the file should be relative" do
+ File.expects(:lstat).with(@full).returns @stat
+ File.expects(:readlink).with(@full).returns "/what/ever"
+ @metadata.collect_attributes(@base)
+ end
+
+ it "should use the set base path if one is not provided" do
+ @metadata.base_path = @base
+ File.expects(:lstat).with(@full).returns @stat
+ File.expects(:readlink).with(@full).returns "/what/ever"
+ @metadata.collect_attributes()
+ end
+
+ it "should fail if a base path is neither set nor provided" do
+ proc { @metadata.collect_attributes() }.should raise_error(ArgumentError)
+ end
+
+ it "should raise an exception if the file does not exist" do
+ File.expects(:lstat).with("/base/dir/my/path").raises(Errno::ENOENT)
+ proc { @metadata.collect_attributes("/base/dir")}.should raise_error(Errno::ENOENT)
+ end
+end
+
+describe Puppet::FileServing::Metadata, " when collecting attributes" do
before do
@path = "/my/file"
- @stat = mock 'stat', :uid => 10, :gid => 20, :mode => 0755
- File.stubs(:stat).returns(@stat)
+ @stat = stub 'stat', :uid => 10, :gid => 20, :mode => 0755, :ftype => "file"
+ File.stubs(:lstat).returns(@stat)
@filehandle = mock 'filehandle'
@filehandle.expects(:each_line).yields("some content\n")
File.stubs(:open).with(@path, 'r').yields(@filehandle)
@checksum = Digest::MD5.hexdigest("some content\n")
- FileTest.expects(:exists?).with(@path).returns(true)
- @metadata = Puppet::FileServing::Metadata.new(@path)
- @metadata.get_attributes
+ @metadata = Puppet::FileServing::Metadata.new("file")
+ @metadata.collect_attributes("/my")
end
it "should accept a file path" do
- @metadata.path.should == @path
+ @metadata.path.should == "file"
end
# LAK:FIXME This should actually change at some point
@@ -86,6 +126,28 @@ describe Puppet::FileServing::Metadata do
end
end
+describe Puppet::FileServing::Metadata, " when pointing to a symlink" do
+ it "should store the destination of the symlink in :destination if links are :manage" do
+ file = Puppet::FileServing::Metadata.new("my/file", :links => :manage)
+
+ File.expects(:lstat).with("/base/path/my/file").returns stub("stat", :uid => 1, :gid => 2, :ftype => "symlink", :mode => 0755)
+ File.expects(:readlink).with("/base/path/my/file").returns "/some/other/path"
+
+ file.collect_attributes("/base/path")
+ file.destination.should == "/some/other/path"
+ end
+
+ it "should not collect the checksum" do
+ file = Puppet::FileServing::Metadata.new("my/file", :links => :manage)
+
+ File.expects(:lstat).with("/base/path/my/file").returns stub("stat", :uid => 1, :gid => 2, :ftype => "symlink", :mode => 0755)
+ File.expects(:readlink).with("/base/path/my/file").returns "/some/other/path"
+
+ file.collect_attributes("/base/path")
+ file.checksum.should be_nil
+ end
+end
+
describe Puppet::FileServing::Metadata, " when converting from yaml" do
# LAK:FIXME This isn't in the right place, but we need some kind of
# control somewhere that requires that all REST connections only pull
diff --git a/spec/unit/file_serving/mount.rb b/spec/unit/file_serving/mount.rb
index e9a7f6ddc..ebe058301 100755
--- a/spec/unit/file_serving/mount.rb
+++ b/spec/unit/file_serving/mount.rb
@@ -105,10 +105,6 @@ describe Puppet::FileServing::Mount, " when finding files" do
@mount.path().should == "/myhost/mydomain.com/myhost.mydomain.com"
end
- it "should ignore links by default"
-
- it "should follow links when asked"
-
after do
Puppet::FileServing::Mount.clear_cache
end
diff --git a/spec/unit/indirector/file_content/local.rb b/spec/unit/indirector/file_content/local.rb
index ca7202ae1..442667518 100755
--- a/spec/unit/indirector/file_content/local.rb
+++ b/spec/unit/indirector/file_content/local.rb
@@ -23,10 +23,19 @@ describe Puppet::Indirector::FileContent::Local, "when finding a single file" do
@uri = "file:///my/local"
FileTest.expects(:exists?).with("/my/local").returns true
- Puppet::FileServing::Content.expects(:new).with("/my/local").returns(:mycontent)
+ Puppet::FileServing::Content.expects(:new).with("/my/local", :links => nil).returns(:mycontent)
@content.find(@uri).should == :mycontent
end
+ it "should pass the :links setting on to the created Content instance if the file exists" do
+ @content = Puppet::Indirector::FileContent::Local.new
+ @uri = "file:///my/local"
+
+ FileTest.expects(:exists?).with("/my/local").returns true
+ Puppet::FileServing::Content.expects(:new).with("/my/local", :links => :manage).returns(:mycontent)
+ @content.find(@uri, :links => :manage)
+ end
+
it "should return nil if the file does not exist" do
@content = Puppet::Indirector::FileContent::Local.new
@uri = "file:///my/local"
diff --git a/spec/unit/indirector/file_metadata/local.rb b/spec/unit/indirector/file_metadata/local.rb
index f613d35c7..289aee449 100755
--- a/spec/unit/indirector/file_metadata/local.rb
+++ b/spec/unit/indirector/file_metadata/local.rb
@@ -20,19 +20,28 @@ describe Puppet::Indirector::FileMetadata::Local, "when finding a single file" d
@data = mock 'metadata'
end
+
it "should return a Metadata instance created with the full path to the file if the file exists" do
- @data.stubs(:get_attributes)
+ @data.stubs(:collect_attributes)
FileTest.expects(:exists?).with("/my/local").returns true
- Puppet::FileServing::Metadata.expects(:new).with("/my/local").returns(@data)
+ Puppet::FileServing::Metadata.expects(:new).with("/my/local", :links => nil).returns(@data)
@metadata.find(@uri).should == @data
end
+ it "should pass the :links setting on to the created Content instance if the file exists" do
+ @data.stubs(:collect_attributes)
+
+ FileTest.expects(:exists?).with("/my/local").returns true
+ Puppet::FileServing::Metadata.expects(:new).with("/my/local", :links => :manage).returns(@data)
+ @metadata.find(@uri, :links => :manage)
+ end
+
it "should collect its attributes when a file is found" do
- @data.expects(:get_attributes)
+ @data.expects(:collect_attributes)
FileTest.expects(:exists?).with("/my/local").returns true
- Puppet::FileServing::Metadata.expects(:new).with("/my/local").returns(@data)
+ Puppet::FileServing::Metadata.expects(:new).with("/my/local", :links => nil).returns(@data)
@metadata.find(@uri).should == @data
end
@@ -67,7 +76,7 @@ describe Puppet::Indirector::FileMetadata::Local, "when searching for multiple f
it "should collect the attributes of the instances returned" do
FileTest.expects(:exists?).with("/my/local").returns true
- @metadata.expects(:path2instances).with("/my/local", {}).returns( [mock("one", :get_attributes => nil), mock("two", :get_attributes => nil)] )
+ @metadata.expects(:path2instances).with("/my/local", {}).returns( [mock("one", :collect_attributes => nil), mock("two", :collect_attributes => nil)] )
@metadata.search(@uri)
end
end
diff --git a/spec/unit/indirector/file_server.rb b/spec/unit/indirector/file_server.rb
index 4bc56ce7d..ed36e180e 100755
--- a/spec/unit/indirector/file_server.rb
+++ b/spec/unit/indirector/file_server.rb
@@ -54,16 +54,20 @@ describe Puppet::Indirector::FileServer, " when finding files" do
it "should return an instance of the model created with the full path if a file is found" do
@configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/some/file")
- @model.expects(:new).with("/some/file").returns(:myinstance)
+ @model.expects(:new).with("/some/file", :links => nil).returns(:myinstance)
@file_server.find(@uri).should == :myinstance
end
end
-describe Puppet::Indirector::FileServer, " when returning file paths" do
- it "should follow links if the links option is set to :follow"
+describe Puppet::Indirector::FileServer, " when returning instances" do
+ include FileServerTerminusTesting
- it "should ignore links if the links option is not set to follow"
+ it "should pass the provided :links setting on to the instance if one is provided" do
+ @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/some/file")
+ @model.expects(:new).with("/some/file", :links => :mytest)
+ @file_server.find(@uri, :links => :mytest)
+ end
end
describe Puppet::Indirector::FileServer, " when checking authorization" do
diff --git a/spec/unit/indirector/module_files.rb b/spec/unit/indirector/module_files.rb
index e65f15697..f2e43f771 100755
--- a/spec/unit/indirector/module_files.rb
+++ b/spec/unit/indirector/module_files.rb
@@ -65,7 +65,7 @@ describe Puppet::Indirector::ModuleFiles, " when finding files" do
it "should return an instance of the model created with the full path if a module is found and the file exists" do
Puppet::Module.expects(:find).with('my', nil).returns @module
FileTest.expects(:exists?).with("/module/path/files/local/file").returns(true)
- @model.expects(:new).with("/module/path/files/local/file").returns(:myinstance)
+ @model.expects(:new).with("/module/path/files/local/file", :links => nil).returns(:myinstance)
@module_files.find(@uri).should == :myinstance
end
@@ -89,10 +89,15 @@ describe Puppet::Indirector::ModuleFiles, " when finding files" do
end
end
-describe Puppet::Indirector::ModuleFiles, " when returning file paths" do
- it "should follow links if the links option is set to :follow"
+describe Puppet::Indirector::ModuleFiles, " when returning instances" do
+ include ModuleFilesTerminusTesting
- it "should ignore links if the links option is not set to follow"
+ it "should pass the provided :links setting on to the instance if one is provided" do
+ Puppet::Module.expects(:find).with('my', nil).returns @module
+ FileTest.expects(:exists?).with("/module/path/files/local/file").returns(true)
+ @model.expects(:new).with("/module/path/files/local/file", :links => :mytest)
+ @module_files.find(@uri, :links => :mytest)
+ end
end
describe Puppet::Indirector::ModuleFiles, " when authorizing" do