Basing pervasive low-level behaviour changes on the application name isn't
a
good idea, but if we're going to do it we need to remember to update the
test
when we rename the application. Further, if we optimize around such
low-level
tests (as we did when implementing file-streaming) we need to carry the
tests
over into the new data paths.
This commit addresses both of these isues, restoring 0.25.x stand-alone
file
serving by adjusting the process-name test in the indirector to recognize
"apply" as standalone (and thus not use http to fetch the files) and by
adding
a branch to the file streaming code to do the same when fetching the
content.
I am not certain that this change is globally correct; there may be other
related problems that will not be fixed (and may in fact be exacerbated) by
this patch.
Signed-off-by: Markus Roberts <Mark### @reality.com>
---
lib/puppet/file_serving/indirection_hooks.rb | 4 ++--
lib/puppet/type/file/content.rb | 2 ++
lib/puppet/type/file/source.rb | 10 ++++++++++
spec/shared_behaviours/file_serving.rb | 13 ++++++++++++-
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/lib/puppet/file_serving/indirection_hooks.rb
b/lib/puppet/file_serving/indirection_hooks.rb
index 7e0c179..a85e90e 100644
--- a/lib/puppet/file_serving/indirection_hooks.rb
+++ b/lib/puppet/file_serving/indirection_hooks.rb
@@ -19,8 +19,8 @@ module Puppet::FileServing::IndirectionHooks
return PROTOCOL_MAP["file"] if request.key =~ /^#{::File::SEPARATOR}/
return PROTOCOL_MAP["file"] if request.protocol == "file"
- # We're heading over the wire the protocol is 'puppet' and we've got a
server name or we're not named 'puppet'
- if request.protocol == "puppet" and (request.server or
Puppet.settings[:name] != "puppet")
+ # We're heading over the wire the protocol is 'puppet' and we've got a
server name or we're not named 'apply' or 'puppet'
+ if request.protocol == "puppet" and (request.server or
!["puppet","apply"].include?(Puppet.settings[:name]))
return PROTOCOL_MAP["puppet"]
end
diff --git a/lib/puppet/type/file/content.rb
b/lib/puppet/type/file/content.rb
index 0d0bb55..f5b65d3 100755
--- a/lib/puppet/type/file/content.rb
+++ b/lib/puppet/type/file/content.rb
@@ -166,6 +166,8 @@ module Puppet
yield source_or_content
elsif source_or_content.nil?
yield read_file_from_filebucket
+ elsif Puppet.settings[:name] == "apply"
+ yield source_or_content.content
elsif source_or_content.local?
chunk_file_from_disk(source_or_content) { |chunk| yield chunk }
else
diff --git a/lib/puppet/type/file/source.rb
b/lib/puppet/type/file/source.rb
index 0e7aac7..7d03de2 100755
--- a/lib/puppet/type/file/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -94,6 +94,16 @@ module Puppet
metadata && metadata.checksum
end
+ # Look up (if necessary) and return remote content.
+ cached_attr(:content) do
+ raise Puppet::DevError, "No source for content was stored with the
metadata" unless metadata.source
+
+ unless tmp = Puppet::FileServing::Content.find(metadata.source)
+ fail "Could not find any content at %s" % metadata.source
+ end
+ tmp.content
+ end
+
# Copy the values from the source to the resource. Yay.
def copy_source_values
devfail "Somehow got asked to copy source values without any
metadata" unless metadata
diff --git a/spec/shared_behaviours/file_serving.rb
b/spec/shared_behaviours/file_serving.rb
index c86453a..5f5b2b0 100644
--- a/spec/shared_behaviours/file_serving.rb
+++ b/spec/shared_behaviours/file_serving.rb
@@ -15,7 +15,7 @@ describe "Puppet::FileServing::Files", :shared => true
do
@test_class.find(uri)
end
- it "should use the rest terminus when the 'puppet' URI scheme is used,
no host name is present, and the process name is not 'puppet'" do
+ it "should use the rest terminus when the 'puppet' URI scheme is used,
no host name is present, and the process name is not 'puppet' or 'apply'"
do
uri = "puppet:///fakemod/my/file"
Puppet.settings.stubs(:value).returns "foo"
Puppet.settings.stubs(:value).with(:name).returns("puppetd")
@@ -35,6 +35,17 @@ describe "Puppet::FileServing::Files", :shared =>
true do
@test_class.find(uri)
end
+ it "should use the file_server terminus when the 'puppet' URI scheme is
used, no host name is present, and the process name is 'apply'" do
+ uri = "puppet:///fakemod/my/file"
+ Puppet::Node::Environment.stubs(:new).returns(stub("env", :name =>
"testing", :module => nil, :modulepath => []))
+ Puppet.settings.stubs(:value).returns ""
+ Puppet.settings.stubs(:value).with(:name).returns("apply")
+
Puppet.settings.stubs(:value).with(:fileserverconfig).returns("/whatever")
+ @indirection.terminus(:file_server).expects(:find)
+ @indirection.terminus(:file_server).stubs(:authorized?).returns(true)
+ @test_class.find(uri)
+ end
+
it "should use the file terminus when the 'file' URI scheme is used" do
uri = "file:///fakemod/my/file"
@indirection.terminus(:file).expects(:find)
(84 lines) Aug 21, 2010 22:12
(104 lines) Aug 22, 2010 00:35