diff options
-rw-r--r-- | lib/puppet/file_serving/content.rb | 17 | ||||
-rw-r--r-- | lib/puppet/file_serving/file_base.rb | 76 | ||||
-rw-r--r-- | lib/puppet/file_serving/metadata.rb | 4 | ||||
-rwxr-xr-x | spec/unit/file_serving/content.rb | 14 | ||||
-rwxr-xr-x | spec/unit/file_serving/file_base.rb | 124 | ||||
-rwxr-xr-x | spec/unit/file_serving/metadata.rb | 4 | ||||
-rwxr-xr-x | spec/unit/indirector/file_server.rb | 30 |
7 files changed, 45 insertions, 224 deletions
diff --git a/lib/puppet/file_serving/content.rb b/lib/puppet/file_serving/content.rb index 1114829f1..64f000eaa 100644 --- a/lib/puppet/file_serving/content.rb +++ b/lib/puppet/file_serving/content.rb @@ -4,23 +4,30 @@ require 'puppet/indirector' require 'puppet/file_serving' -require 'puppet/file_serving/file_base' +require 'puppet/file_serving/base' require 'puppet/file_serving/indirection_hooks' # A class that handles retrieving file contents. # It only reads the file when its content is specifically # asked for. -class Puppet::FileServing::Content < Puppet::FileServing::FileBase +class Puppet::FileServing::Content < Puppet::FileServing::Base extend Puppet::Indirector indirects :file_content, :extend => Puppet::FileServing::IndirectionHooks attr_reader :path + def collect + end + # Read the content of our file in. def content - # This stat can raise an exception, too. - raise(ArgumentError, "Cannot read the contents of links unless following links") if stat().ftype == "symlink" + unless defined?(@content) and @content + # This stat can raise an exception, too. + raise(ArgumentError, "Cannot read the contents of links unless following links") if stat().ftype == "symlink" - ::File.read(full_path()) + p full_path + @content = ::File.read(full_path()) + end + @content end end diff --git a/lib/puppet/file_serving/file_base.rb b/lib/puppet/file_serving/file_base.rb deleted file mode 100644 index e87d683aa..000000000 --- a/lib/puppet/file_serving/file_base.rb +++ /dev/null @@ -1,76 +0,0 @@ -# -# 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 :key - - # Does our file exist? - def exist? - begin - stat - return true - rescue => detail - return false - end - end - - # Return the full path to our file. Fails if there's no path set. - def full_path - raise(ArgumentError, "You must set a path to get a file's path") unless self.path - - if relative_path.nil? or relative_path == "" - path - else - File.join(path, relative_path) - end - end - - def initialize(key, options = {}) - @key = key - @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 - - # Determine how we deal with links. - attr_reader :links - def links=(value) - value = :manage if value == :ignore - raise(ArgumentError, ":links can only be set to :manage or :follow") unless [:manage, :follow].include?(value) - @links = value - end - - # Set our base path. - attr_reader :path - def path=(path) - raise ArgumentError.new("Paths must be fully qualified") unless path =~ /^#{::File::SEPARATOR}/ - @path = path - end - - # Set a relative path; this is used for recursion, and sets - # the file's path relative to the initial recursion point. - attr_reader :relative_path - def relative_path=(path) - raise ArgumentError.new("Relative paths must not be fully qualified") if path =~ /^#{::File::SEPARATOR}/ - @relative_path = path - end - - # Stat our file, using the appropriate link-sensitive method. - def stat - unless defined?(@stat_method) - @stat_method = self.links == :manage ? :lstat : :stat - end - File.send(@stat_method, full_path()) - end -end diff --git a/lib/puppet/file_serving/metadata.rb b/lib/puppet/file_serving/metadata.rb index beecaef48..a1265dd8b 100644 --- a/lib/puppet/file_serving/metadata.rb +++ b/lib/puppet/file_serving/metadata.rb @@ -5,12 +5,12 @@ require 'puppet' require 'puppet/indirector' require 'puppet/file_serving' -require 'puppet/file_serving/file_base' +require 'puppet/file_serving/base' require 'puppet/util/checksums' require 'puppet/file_serving/indirection_hooks' # A class that handles retrieving file metadata. -class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase +class Puppet::FileServing::Metadata < Puppet::FileServing::Base include Puppet::Util::Checksums diff --git a/spec/unit/file_serving/content.rb b/spec/unit/file_serving/content.rb index e8de1d63e..b747ced78 100755 --- a/spec/unit/file_serving/content.rb +++ b/spec/unit/file_serving/content.rb @@ -16,6 +16,20 @@ describe Puppet::FileServing::Content do it "should should include the IndirectionHooks module in its indirection" do Puppet::FileServing::Content.indirection.metaclass.included_modules.should include(Puppet::FileServing::IndirectionHooks) end + + it "should have a method for collecting its attributes" do + Puppet::FileServing::Content.new("sub/path", :path => "/base").should respond_to(:collect) + end + + it "should retrieve and store its contents when its attributes are collected" do + content = Puppet::FileServing::Content.new("sub/path", :path => "/base") + + result = "foo" + File.stubs(:lstat).returns(stub("stat", :ftype => "file")) + File.expects(:read).with("/base/sub/path").returns result + content.collect + content.content.should equal(result) + end end describe Puppet::FileServing::Content, "when returning the contents" do diff --git a/spec/unit/file_serving/file_base.rb b/spec/unit/file_serving/file_base.rb deleted file mode 100755 index ded6ae4a8..000000000 --- a/spec/unit/file_serving/file_base.rb +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env ruby - -require File.dirname(__FILE__) + '/../../spec_helper' - -require 'puppet/file_serving/file_base' - -describe Puppet::FileServing::FileBase do - it "should accept a key in the form of a URI" do - Puppet::FileServing::FileBase.new("puppet://host/module/dir/file").key.should == "puppet://host/module/dir/file" - end - - it "should allow specification of whether links should be managed" do - Puppet::FileServing::FileBase.new("puppet://host/module/dir/file", :links => :manage).links.should == :manage - end - - it "should consider :ignore links equivalent to :manage links" do - Puppet::FileServing::FileBase.new("puppet://host/module/dir/file", :links => :ignore).links.should == :manage - end - - it "should fail if :links is set to anything other than :manage, :follow, or :ignore" do - proc { Puppet::FileServing::FileBase.new("puppet://host/module/dir/file", :links => :else) }.should raise_error(ArgumentError) - end - - it "should default to :manage for :links" do - Puppet::FileServing::FileBase.new("puppet://host/module/dir/file").links.should == :manage - end - - it "should allow specification of a path" do - FileTest.stubs(:exists?).returns(true) - Puppet::FileServing::FileBase.new("puppet://host/module/dir/file", :path => "/my/file").path.should == "/my/file" - end - - it "should allow specification of a relative path" do - FileTest.stubs(:exists?).returns(true) - Puppet::FileServing::FileBase.new("puppet://host/module/dir/file", :relative_path => "my/file").relative_path.should == "my/file" - end - - it "should have a means of determining if the file exists" do - Puppet::FileServing::FileBase.new("blah").should respond_to(:exist?) - end - - it "should correctly indicate if the file is present" do - File.expects(:lstat).with("/my/file").returns(mock("stat")) - Puppet::FileServing::FileBase.new("blah", :path => "/my/file").exist?.should be_true - end - - it "should correctly indicate if the file is asbsent" do - File.expects(:lstat).with("/my/file").raises RuntimeError - Puppet::FileServing::FileBase.new("blah", :path => "/my/file").exist?.should be_false - end - - describe "when setting the base path" do - before do - @file = Puppet::FileServing::FileBase.new("puppet://host/module/dir/file") - end - - it "should require that the base path be fully qualified" do - FileTest.stubs(:exists?).returns(true) - proc { @file.path = "unqualified/file" }.should raise_error(ArgumentError) - end - end - - describe "when setting the relative path" do - it "should require that the relative path be unqualified" do - @file = Puppet::FileServing::FileBase.new("puppet://host/module/dir/file") - FileTest.stubs(:exists?).returns(true) - proc { @file.relative_path = "/qualified/file" }.should raise_error(ArgumentError) - end - end - - describe "when determining the full file path" do - before do - @file = Puppet::FileServing::FileBase.new("mykey", :path => "/this/file") - end - - it "should return the path if there is no relative path" do - @file.full_path.should == "/this/file" - end - - it "should return the path if the relative_path is set to ''" do - @file.relative_path = "" - @file.full_path.should == "/this/file" - end - - it "should return the path joined with the relative path if there is a relative path and it is not set to '/' or ''" do - @file.relative_path = "not/qualified" - @file.full_path.should == "/this/file/not/qualified" - end - - it "should should fail if there is no path set" do - @file = Puppet::FileServing::FileBase.new("not/qualified") - proc { @file.full_path }.should raise_error(ArgumentError) - end - end - - describe "when stat'ing files" do - before do - @file = Puppet::FileServing::FileBase.new("mykey", :path => "/this/file") - end - - it "should stat the file's full path" do - @file.stubs(:full_path).returns("/this/file") - File.expects(:lstat).with("/this/file").returns stub("stat", :ftype => "file") - @file.stat - end - - it "should fail if the file does not exist" do - @file.stubs(:full_path).returns("/this/file") - File.expects(:lstat).with("/this/file").raises(Errno::ENOENT) - proc { @file.stat }.should raise_error(Errno::ENOENT) - end - - it "should use :lstat if :links is set to :manage" do - File.expects(:lstat).with("/this/file").returns stub("stat", :ftype => "file") - @file.stat - end - - it "should use :stat if :links is set to :follow" do - File.expects(:stat).with("/this/file").returns stub("stat", :ftype => "file") - @file.links = :follow - @file.stat - end - end -end diff --git a/spec/unit/file_serving/metadata.rb b/spec/unit/file_serving/metadata.rb index 9743370c1..e76ceb3e8 100755 --- a/spec/unit/file_serving/metadata.rb +++ b/spec/unit/file_serving/metadata.rb @@ -5,8 +5,8 @@ require File.dirname(__FILE__) + '/../../spec_helper' require 'puppet/file_serving/metadata' describe Puppet::FileServing::Metadata do - it "should should be a subclass of FileBase" do - Puppet::FileServing::Metadata.superclass.should equal(Puppet::FileServing::FileBase) + it "should should be a subclass of Base" do + Puppet::FileServing::Metadata.superclass.should equal(Puppet::FileServing::Base) end it "should indirect file_metadata" do diff --git a/spec/unit/indirector/file_server.rb b/spec/unit/indirector/file_server.rb index ba951737a..544953932 100755 --- a/spec/unit/indirector/file_server.rb +++ b/spec/unit/indirector/file_server.rb @@ -24,7 +24,7 @@ describe Puppet::Indirector::FileServer do @file_server = @file_server_class.new - @uri = "puppetmounts://host/my/local/file" + @uri = "puppet://host/my/local/file" @configuration = mock 'configuration' Puppet::FileServing::Configuration.stubs(:create).returns(@configuration) @@ -34,28 +34,28 @@ describe Puppet::Indirector::FileServer do describe Puppet::Indirector::FileServer, " when finding files" do it "should use the path portion of the URI as the file name" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil) + @configuration.expects(:file_path).with("my/local/file", :node => nil) @file_server.find(@request) end it "should use the FileServing configuration to convert the file name to a fully qualified path" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil) + @configuration.expects(:file_path).with("my/local/file", :node => nil) @file_server.find(@request) end it "should pass the node name to the FileServing configuration if one is provided" do - @configuration.expects(:file_path).with("/my/local/file", :node => "testing") + @configuration.expects(:file_path).with("my/local/file", :node => "testing") @request.node = "testing" @file_server.find(@request) end it "should return nil if no fully qualified path is found" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns(nil) + @configuration.expects(:file_path).with("my/local/file", :node => nil).returns(nil) @file_server.find(@request).should be_nil end 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") + @configuration.expects(:file_path).with("my/local/file", :node => nil).returns("/some/file") @model.expects(:new).returns(:myinstance) @file_server.find(@request).should == :myinstance end @@ -63,12 +63,12 @@ describe Puppet::Indirector::FileServer do describe Puppet::Indirector::FileServer, " when returning instances" do before :each do - @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/some/file") + @configuration.expects(:file_path).with("my/local/file", :node => nil).returns("/some/file") @instance = mock 'instance' end it "should create the instance with the key used to find the instance" do - @model.expects(:new).with { |key, *options| key == @uri } + @model.expects(:new).with { |key, *options| key == "my/local/file" } @file_server.find(@request) end @@ -149,35 +149,35 @@ describe Puppet::Indirector::FileServer do describe Puppet::Indirector::FileServer, " when searching for files" do it "should use the path portion of the URI as the file name" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil) + @configuration.expects(:file_path).with("my/local/file", :node => nil) @file_server.search(@request) end it "should use the FileServing configuration to convert the file name to a fully qualified path" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil) + @configuration.expects(:file_path).with("my/local/file", :node => nil) @file_server.search(@request) end it "should pass the node name to the FileServing configuration if one is provided" do - @configuration.expects(:file_path).with("/my/local/file", :node => "testing") + @configuration.expects(:file_path).with("my/local/file", :node => "testing") @request.node = "testing" @file_server.search(@request) end it "should return nil if no fully qualified path is found" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns(nil) + @configuration.expects(:file_path).with("my/local/file", :node => nil).returns(nil) @file_server.search(@request).should be_nil end it "should use :path2instances from the terminus_helper to return instances if a module is found and the file exists" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/my/file") + @configuration.expects(:file_path).with("my/local/file", :node => nil).returns("my/file") @file_server.expects(:path2instances) @file_server.search(@request) end it "should pass the request on to :path2instances" do - @configuration.expects(:file_path).with("/my/local/file", :node => nil).returns("/my/file") - @file_server.expects(:path2instances).with(@request, "/my/file") + @configuration.expects(:file_path).with("my/local/file", :node => nil).returns("my/file") + @file_server.expects(:path2instances).with(@request, "my/file") @file_server.search(@request) end end |