summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2008-08-20 23:37:13 -0500
committerLuke Kanies <luke@madstop.com>2008-08-20 23:45:29 -0500
commit7034882fdfbd3846e77c518e43bdea1f9154e250 (patch)
treec0ac8f53f60dfb4febea33bb37f9c4099a3d1322 /lib/puppet
parent66c40b374d7315d11575d701ce195ce656abbeb7 (diff)
downloadpuppet-7034882fdfbd3846e77c518e43bdea1f9154e250.tar.gz
puppet-7034882fdfbd3846e77c518e43bdea1f9154e250.tar.xz
puppet-7034882fdfbd3846e77c518e43bdea1f9154e250.zip
Adding parameter and URL support to the REST terminus.
Previously, the server side correctly pulled parameters out of the query strings, but the REST terminus never passed them on. It does now, at least for finding and searching. It appears that at least WEBrick doesn't support parameters for anything other than forms and GET. I've also added the ability for the REST terminus to pull host/port information from the request key, if it's a URI. Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/indirector/rest.rb39
-rw-r--r--lib/puppet/network/http/handler.rb6
2 files changed, 36 insertions, 9 deletions
diff --git a/lib/puppet/indirector/rest.rb b/lib/puppet/indirector/rest.rb
index a2767d05b..4389dfb7e 100644
--- a/lib/puppet/indirector/rest.rb
+++ b/lib/puppet/indirector/rest.rb
@@ -32,31 +32,54 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
{"Accept" => model.supported_formats.join(", ")}
end
- def network
- Puppet::Network::HttpPool.http_instance(Puppet[:server], Puppet[:masterport].to_i)
+ def network(request)
+ if request.key =~ /^\w+:\/\// # it looks like a URI
+ begin
+ uri = URI.parse(URI.escape(request.key))
+ rescue => detail
+ raise ArgumentError, "Could not understand URL %s: %s" % [source, detail.to_s]
+ end
+ server = uri.host || Puppet[:server]
+ port = uri.port.to_i == 0 ? Puppet[:masterport].to_i : uri.port.to_i
+ else
+ server = Puppet[:server]
+ port = Puppet[:masterport].to_i
+ end
+
+ Puppet::Network::HttpPool.http_instance(server, port)
end
def find(request)
- deserialize network.get("/#{indirection.name}/#{request.key}", headers)
+ deserialize network(request).get("/#{indirection.name}/#{request.key}#{query_string(request)}", headers)
end
def search(request)
if request.key
- path = "/#{indirection.name}s/#{request.key}"
+ path = "/#{indirection.name}s/#{request.key}#{query_string(request)}"
else
- path = "/#{indirection.name}s"
+ path = "/#{indirection.name}s#{query_string(request)}"
end
- unless result = deserialize(network.get(path, headers), true)
+ unless result = deserialize(network(request).get(path, headers), true)
return []
end
return result
end
def destroy(request)
- deserialize network.delete("/#{indirection.name}/#{request.key}", headers)
+ raise ArgumentError, "DELETE does not accept options" unless request.options.empty?
+ deserialize network(request).delete("/#{indirection.name}/#{request.key}", headers)
end
def save(request)
- deserialize network.put("/#{indirection.name}/", request.instance.render, headers)
+ raise ArgumentError, "PUT does not accept options" unless request.options.empty?
+ deserialize network(request).put("/#{indirection.name}/", request.instance.render, headers)
+ end
+
+ private
+
+ # Create the qurey string, if options are present.
+ def query_string(request)
+ return "" unless request.options and ! request.options.empty?
+ "?" + request.options.collect { |key, value| "%s=%s" % [key, value] }.join("&")
end
end
diff --git a/lib/puppet/network/http/handler.rb b/lib/puppet/network/http/handler.rb
index 291481acd..6f5117b16 100644
--- a/lib/puppet/network/http/handler.rb
+++ b/lib/puppet/network/http/handler.rb
@@ -81,7 +81,11 @@ module Puppet::Network::HTTP::Handler
# Execute our search.
def do_search(request, response)
args = params(request)
- result = model.search(args)
+ if key = request_key(request)
+ result = model.search(key, args)
+ else
+ result = model.search(args)
+ end
if result.nil? or (result.is_a?(Array) and result.empty?)
return do_exception(response, "Could not find instances in %s with '%s'" % [model.name, args.inspect], 404)
end