summaryrefslogtreecommitdiffstats
path: root/lib/puppet/network/http/api
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2009-03-13 17:39:51 -0500
committerJames Turnbull <james@lovedthanlost.net>2009-03-20 18:27:07 +1100
commit15740fe090365a81202fd44244e88b976f1d14d7 (patch)
treee94b35381a30b273f2ac80dbe9a4051f47bd0e3f /lib/puppet/network/http/api
parentef4fa681be07881bab3e1e920585cc4fbbf6f4d1 (diff)
downloadpuppet-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.rb60
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