summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2009-03-13 17:24:09 -0500
committerJames Turnbull <james@lovedthanlost.net>2009-03-20 18:27:07 +1100
commitef4fa681be07881bab3e1e920585cc4fbbf6f4d1 (patch)
tree3913d44535079612ddef81b4d84996505db36be6 /lib
parent8b13390819f9aec9f344a72b3c0b3b6609f6209d (diff)
downloadpuppet-ef4fa681be07881bab3e1e920585cc4fbbf6f4d1.tar.gz
puppet-ef4fa681be07881bab3e1e920585cc4fbbf6f4d1.tar.xz
puppet-ef4fa681be07881bab3e1e920585cc4fbbf6f4d1.zip
Using the Handler for the REST api on both sides of the connection
Things are actually in a broken state here because we've got a conflict between how the two sides do their work and some extraction needs to get done. This commit is just a stopping-point so I can do the necessary refactoring. Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/indirector/rest.rb18
-rw-r--r--lib/puppet/network/http/handler.rb82
2 files changed, 44 insertions, 56 deletions
diff --git a/lib/puppet/indirector/rest.rb b/lib/puppet/indirector/rest.rb
index 6429b22b7..38ecdb758 100644
--- a/lib/puppet/indirector/rest.rb
+++ b/lib/puppet/indirector/rest.rb
@@ -2,9 +2,11 @@ require 'net/http'
require 'uri'
require 'puppet/network/http_pool'
+require 'puppet/network/http/handler'
# Access objects via REST
class Puppet::Indirector::REST < Puppet::Indirector::Terminus
+ include Puppet::Network::HTTP::Handler
class << self
attr_reader :server_setting, :port_setting
@@ -62,16 +64,14 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
end
def find(request)
- deserialize network(request).get("/#{environment}/#{indirection.name}/#{request.escaped_key}#{request.query_string}", headers)
+ p model
+ p indirection
+ p indirection.model
+ deserialize network(request).get(indirection2uri(request), headers)
end
def search(request)
- if request.key
- path = "/#{environment}/#{indirection.name}s/#{request.escaped_key}#{request.query_string}"
- else
- path = "/#{environment}/#{indirection.name}s#{request.query_string}"
- end
- unless result = deserialize(network(request).get(path, headers), true)
+ unless result = deserialize(network(request).get(indirection2uri(request), headers), true)
return []
end
return result
@@ -79,12 +79,12 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
def destroy(request)
raise ArgumentError, "DELETE does not accept options" unless request.options.empty?
- deserialize network(request).delete("/#{environment}/#{indirection.name}/#{request.escaped_key}", headers)
+ deserialize network(request).delete(indirection2uri(request), headers)
end
def save(request)
raise ArgumentError, "PUT does not accept options" unless request.options.empty?
- deserialize network(request).put("/#{environment}/#{indirection.name}/", request.instance.render, headers)
+ deserialize network(request).put(indirection2uri(request), request.instance.render, headers)
end
private
diff --git a/lib/puppet/network/http/handler.rb b/lib/puppet/network/http/handler.rb
index 1e5281695..610aa0a3f 100644
--- a/lib/puppet/network/http/handler.rb
+++ b/lib/puppet/network/http/handler.rb
@@ -50,11 +50,9 @@ module Puppet::Network::HTTP::Handler
# handle an HTTP request
def process(request, response)
- return do_find(request, response) if get?(request) and singular?(request)
- return do_search(request, response) if get?(request) and plural?(request)
- return do_destroy(request, response) if delete?(request) and singular?(request)
- return do_save(request, response) if put?(request) and singular?(request)
- raise ArgumentError, "Did not understand HTTP #{http_method(request)} request for '#{path(request)}'"
+ indirection_request = uri2indirection(path(request), params(request), http_method(request))
+
+ send("do_%s" % indirection_request.method, indirection_request, request, response)
rescue Exception => e
return do_exception(response, e)
end
@@ -65,20 +63,12 @@ module Puppet::Network::HTTP::Handler
raise ArgumentError, "The environment must be purely alphanumeric, not '%s'" % environment unless environment =~ /^\w+$/
raise ArgumentError, "The indirection name must be purely alphanumeric, not '%s'" % indirection unless indirection =~ /^\w+$/
- plurality = (indirection == handler.to_s + "s") ? :plural : :singular
-
- unless METHOD_MAP[http_method]
- raise ArgumentError, "No support for http method %s" % http_method
- end
-
- unless method = METHOD_MAP[http_method][plurality]
- raise ArgumentError, "No support for plural %s operations" % http_method
- end
-
- indirection.sub!(/s$/, '') if plurality == :plural
+ method = indirection_method(http_method, indirection)
params[:environment] = environment
+ raise ArgumentError, "No request key specified in %s" % uri if key == "" or key.nil?
+
key = URI.unescape(key)
Puppet::Indirector::Request.new(indirection, method, key, params)
@@ -89,14 +79,24 @@ module Puppet::Network::HTTP::Handler
"/#{request.environment.to_s}/#{indirection}/#{request.escaped_key}#{request.query_string}"
end
- # Are we interacting with a singular instance?
- def singular?(request)
- %r{/#{handler.to_s}$}.match(path(request))
+ def indirection_method(http_method, indirection)
+ unless METHOD_MAP[http_method]
+ raise ArgumentError, "No support for http method %s" % http_method
+ end
+
+ unless method = METHOD_MAP[http_method][plurality(indirection)]
+ raise ArgumentError, "No support for plural %s operations" % http_method
+ end
+
+ return method
end
- # Are we interacting with multiple instances?
- def plural?(request)
- %r{/#{handler.to_s}s$}.match(path(request))
+ def plurality(indirection)
+ result = (indirection == handler.to_s + "s") ? :plural : :singular
+
+ indirection.sub!(/s$/, '') if result
+
+ result
end
# Set the response up, with the body and status.
@@ -119,12 +119,9 @@ module Puppet::Network::HTTP::Handler
end
# Execute our find.
- def do_find(request, response)
- key = request_key(request) || raise(ArgumentError, "Could not locate lookup key in request path [#{path(request)}]")
- key = URI.unescape(key)
- args = params(request)
- unless result = model.find(key, args)
- return do_exception(response, "Could not find %s %s" % [model.name, key], 404)
+ def do_find(indirection_request, request, response)
+ unless result = model.find(indirection_request.key, indirection_request.options)
+ return do_exception(response, "Could not find %s %s" % [model.name, indirection_request.key], 404)
end
# The encoding of the result must include the format to use,
@@ -137,16 +134,11 @@ module Puppet::Network::HTTP::Handler
end
# Execute our search.
- def do_search(request, response)
- args = params(request)
- if key = request_key(request)
- key = URI.unescape(key)
- result = model.search(key, args)
- else
- result = model.search(args)
- end
+ def do_search(indirection_request, request, response)
+ result = model.search(indirection_request.key, indirection_request.options)
+
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)
+ return do_exception(response, "Could not find instances in %s with '%s'" % [model.name, indirection_request.options.inspect], 404)
end
format = format_to_use(request)
@@ -156,11 +148,8 @@ module Puppet::Network::HTTP::Handler
end
# Execute our destroy.
- def do_destroy(request, response)
- key = request_key(request) || raise(ArgumentError, "Could not locate lookup key in request path [#{path(request)}]")
- key = URI.unescape(key)
- args = params(request)
- result = model.destroy(key, args)
+ def do_destroy(indirection_request, request, response)
+ result = model.destroy(indirection_request.key, indirection_request.options)
set_content_type(response, "yaml")
@@ -168,15 +157,14 @@ module Puppet::Network::HTTP::Handler
end
# Execute our save.
- def do_save(request, response)
+ def do_save(indirection_request, request, response)
data = body(request).to_s
raise ArgumentError, "No data to save" if !data or data.empty?
- args = params(request)
format = format_to_use(request)
obj = model.convert_from(format_to_use(request), data)
- result = save_object(obj, args)
+ result = save_object(indirection_request, obj)
set_content_type(response, "yaml")
@@ -187,8 +175,8 @@ module Puppet::Network::HTTP::Handler
# LAK:NOTE This has to be here for testing; it's a stub-point so
# we keep infinite recursion from happening.
- def save_object(object, args)
- object.save(args)
+ def save_object(ind_request, object)
+ object.save(ind_request.options)
end
def find_model_for_handler(handler)