diff options
| author | Luke Kanies <luke@madstop.com> | 2009-03-13 17:39:51 -0500 |
|---|---|---|
| committer | James Turnbull <james@lovedthanlost.net> | 2009-03-20 18:27:07 +1100 |
| commit | 15740fe090365a81202fd44244e88b976f1d14d7 (patch) | |
| tree | e94b35381a30b273f2ac80dbe9a4051f47bd0e3f /lib/puppet/network/http/api | |
| parent | ef4fa681be07881bab3e1e920585cc4fbbf6f4d1 (diff) | |
| download | puppet-15740fe090365a81202fd44244e88b976f1d14d7.tar.gz puppet-15740fe090365a81202fd44244e88b976f1d14d7.tar.xz puppet-15740fe090365a81202fd44244e88b976f1d14d7.zip | |
Moving the REST API functions into a module
This module is now used by the client and
server side, rather than having a Handler module
that's 90% server functionality but also used by
the client.
While we don't automatically get api choice from this,
it at least provides a pattern for how we'll handle API
development over time.
Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib/puppet/network/http/api')
| -rw-r--r-- | lib/puppet/network/http/api/v1.rb | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/puppet/network/http/api/v1.rb b/lib/puppet/network/http/api/v1.rb new file mode 100644 index 000000000..2ee1a815f --- /dev/null +++ b/lib/puppet/network/http/api/v1.rb @@ -0,0 +1,60 @@ +require 'puppet/network/http/api' + +module Puppet::Network::HTTP::API::V1 + # How we map http methods and the indirection name in the URI + # to an indirection method. + METHOD_MAP = { + "GET" => { + :plural => :search, + :singular => :find + }, + "PUT" => { + :singular => :save + }, + "DELETE" => { + :singular => :destroy + } + } + + def uri2indirection(http_method, uri, params) + environment, indirection, key = uri.split("/", 4)[1..-1] # the first field is always nil because of the leading slash + + 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+$/ + + 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) + end + + def indirection2uri(request) + indirection = request.method == :search ? request.indirection_name.to_s + "s" : request.indirection_name.to_s + "/#{request.environment.to_s}/#{indirection}/#{request.escaped_key}#{request.query_string}" + end + + 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 + + def plurality(indirection) + result = (indirection == handler.to_s + "s") ? :plural : :singular + + indirection.sub!(/s$/, '') if result + + result + end +end |
