You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by lu...@redhat.com on 2011/10/11 01:16:36 UTC

[PATCH 1/7] Make the root_url a configuration parameter

From: David Lutterkort <lu...@redhat.com>


Signed-off-by: David Lutterkort <lu...@redhat.com>
---
 .../lib/deltacloud/helpers/application_helper.rb   |    6 ++--
 server/lib/deltacloud/helpers/blob_stream.rb       |    2 +-
 server/lib/deltacloud/models/bucket.rb             |    2 +-
 server/lib/deltacloud/models/image.rb              |    2 +-
 server/lib/sinatra/rabbit.rb                       |   33 +++++++------------
 server/lib/sinatra/url_for.rb                      |    8 +----
 server/server.rb                                   |   18 ++++++++--
 7 files changed, 33 insertions(+), 38 deletions(-)

diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index 46fa0eb..859129a 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -22,12 +22,12 @@ module ApplicationHelper
   include Deltacloud
 
   def bread_crumb
-    s = "<ul class='breadcrumb'><li class='first'><a href='#{root_url}'>&#948</a></li>"
+    s = "<ul class='breadcrumb'><li class='first'><a href='#{settings.root_url}'>&#948</a></li>"
     url = request.path_info.split('?')  #remove extra query string parameters
     levels = url[0].split('/') #break up url into different levels
     levels.each_with_index do |level, index|
       unless level.blank?
-        next if "/#{level}" == Sinatra::UrlForHelper::DEFAULT_URI_PREFIX
+        next if "/#{level}" == settings.root_url
         if index == levels.size-1 || (level == levels[levels.size-2] && levels[levels.size-1].to_i > 0)
           s += "<li class='subsequent'>#{level.gsub(/_/, ' ')}</li>\n" unless level.to_i > 0
         else
@@ -177,7 +177,7 @@ module ApplicationHelper
   def link_to_documentation
     return '' unless request.env['REQUEST_URI']
     uri = request.env['REQUEST_URI'].dup
-    uri.gsub!(Sinatra::UrlForHelper::DEFAULT_URI_PREFIX,
+    uri.gsub!(settings.root_url,
               api_url_for(:docs)) unless uri.include?("docs") #i.e. if already serving under /api/docs, leave it be
     '<a href="%s">[ Documentation ]</a>' % uri
   end
diff --git a/server/lib/deltacloud/helpers/blob_stream.rb b/server/lib/deltacloud/helpers/blob_stream.rb
index 07b9566..df5cdc6 100644
--- a/server/lib/deltacloud/helpers/blob_stream.rb
+++ b/server/lib/deltacloud/helpers/blob_stream.rb
@@ -187,7 +187,7 @@ class BlobStreamIO
   def self.is_put_blob(request = nil)
     path = request.env['PATH_INFO']
     method = request.env['REQUEST_METHOD']
-    if ( path =~ /^#{Regexp.escape(Sinatra::UrlForHelper::DEFAULT_URI_PREFIX)}\/buckets/ && method == 'PUT' )
+    if ( path =~ /^#{Regexp.escape(settings.root_url)}\/buckets/ && method == 'PUT' )
       return true
     else
       return false
diff --git a/server/lib/deltacloud/models/bucket.rb b/server/lib/deltacloud/models/bucket.rb
index d7c984b..b1551b7 100644
--- a/server/lib/deltacloud/models/bucket.rb
+++ b/server/lib/deltacloud/models/bucket.rb
@@ -26,7 +26,7 @@ class Bucket < BaseModel
     h = self.to_hash_original
     unless blob_list.nil?
       h[:blob_list] = self.blob_list.collect { |blob| { :id => blob,
-        :href => "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/buckets/#{self.id}/#{blob}"}}
+        :href => "#{settings.root_url}/buckets/#{self.id}/#{blob}"}}
     end
     return h
   end
diff --git a/server/lib/deltacloud/models/image.rb b/server/lib/deltacloud/models/image.rb
index bdde7d0..67f6dfb 100644
--- a/server/lib/deltacloud/models/image.rb
+++ b/server/lib/deltacloud/models/image.rb
@@ -30,7 +30,7 @@ class Image < BaseModel
     h.merge({
       :actions => [ :create_instance => {
         :method => 'post',
-        :href => "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/instances;image_id=#{self.id}"
+        :href => "#{settings.root_url}/instances;image_id=#{self.id}"
       }]
     })
   end
diff --git a/server/lib/sinatra/rabbit.rb b/server/lib/sinatra/rabbit.rb
index cf8c14f..c35943b 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -89,8 +89,8 @@ module Sinatra
 
       def generate_documentation
         coll, oper = @collection, self
-        Rabbit::routes << [:get, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/docs/#{@collection.name}/#{@name}"]
-        ::Sinatra::Application.get("#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/docs/#{@collection.name}/#{@name}") do
+        Rabbit::routes << [:get, "#{settings.root_url}/docs/#{@collection.name}/#{@name}"]
+        ::Sinatra::Application.get("#{settings.root_url}/docs/#{@collection.name}/#{@name}") do
           @collection, @operation = coll, oper
           @features = driver.features_for_operation(coll.name, oper.name)
           respond_to do |format|
@@ -102,8 +102,8 @@ module Sinatra
 
       def generate_options
         current_operation = self
-        Rabbit::routes << [:options, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{current_operation.collection.name}/#{current_operation.name}"]
-        ::Sinatra::Application.options("#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{current_operation.collection.name}/#{current_operation.name}") do
+        Rabbit::routes << [:options, "#{settings.root_url}/#{current_operation.collection.name}/#{current_operation.name}"]
+        ::Sinatra::Application.options("#{settings.root_url}/#{current_operation.collection.name}/#{current_operation.name}") do
           required_params = current_operation.effective_params(driver).collect do |name, validation|
             name.to_s if validation.type.eql?(:required)
           end.compact.join(',')
@@ -152,8 +152,8 @@ module Sinatra
       end
 
       def generate
-        Rabbit::routes << [@method, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{path}"]
-        ::Sinatra::Application.send(@method, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{path}", {}, &@control)
+        Rabbit::routes << [@method, "#{settings.root_url}/#{path}"]
+        ::Sinatra::Application.send(@method, "#{settings.root_url}/#{path}", {}, &@control)
         # Set up some Rails-like URL helpers
         if name == :index
           gen_route "#{@collection.name}_url"
@@ -239,8 +239,8 @@ module Sinatra
 
       def generate_head
         current_collection = self
-        Rabbit::routes << [:head, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{name}"]
-        ::Sinatra::Application.head("#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{name}") do
+        Rabbit::routes << [:head, "#{settings.root_url}/#{name}"]
+        ::Sinatra::Application.head("#{settings.root_url}/#{name}") do
           methods_allowed = current_collection.operations.collect { |o| o[1].method.to_s.upcase }.uniq.join(',')
           headers 'Allow' => "HEAD,OPTIONS,#{methods_allowed}"
           [200, '']
@@ -249,8 +249,8 @@ module Sinatra
 
       def generate_options
         current_collection = self
-        Rabbit::routes << [:options, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{name}"]
-        ::Sinatra::Application.options("#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/#{name}") do
+        Rabbit::routes << [:options, "#{settings.root_url}/#{name}"]
+        ::Sinatra::Application.options("#{settings.root_url}/#{name}") do
           operations_allowed = current_collection.operations.collect { |o| o[0] }.join(',')
           headers 'X-Operations-Allowed' => operations_allowed
           [200, '']
@@ -259,8 +259,8 @@ module Sinatra
 
       def generate_documentation
         coll = self
-        Rabbit::routes << [:get, "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/docs/#{@name}"]
-        ::Sinatra::Application.get("#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/docs/#{@name}") do
+        Rabbit::routes << [:get, "#{settings.root_url}/docs/#{@name}"]
+        ::Sinatra::Application.get("#{settings.root_url}/docs/#{@name}") do
           coll.check_supported(driver)
           @collection = coll
           @operations = coll.operations
@@ -392,15 +392,6 @@ module Sinatra
       collections[name] = Collection.new(name, &block)
       collections[name].generate
     end
-
-    # Generate a root route for API docs
-    get "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/docs\/?" do
-      respond_to do |format|
-        format.html { haml :'docs/index' }
-        format.xml { haml :'docs/index' }
-      end
-    end
-
   end
 
   module RabbitHelper
diff --git a/server/lib/sinatra/url_for.rb b/server/lib/sinatra/url_for.rb
index 2891a53..fba6668 100644
--- a/server/lib/sinatra/url_for.rb
+++ b/server/lib/sinatra/url_for.rb
@@ -29,8 +29,6 @@ require 'uri'
 module Sinatra
   module UrlForHelper
 
-    DEFAULT_URI_PREFIX = "/api"
-
     def api_url_for(url_fragment, mode=:path_only)
       matrix_params = ''
       if request.params['api']
@@ -38,7 +36,7 @@ module Sinatra
         matrix_params += ";driver=%s" % request.params['api']['driver'] if request.params['api']['driver']
       end
       url_fragment = "/#{url_fragment}" unless url_fragment =~ /^\// # There is no need to prefix URI with '/'
-      url_for "#{DEFAULT_URI_PREFIX}#{matrix_params}#{url_fragment}", mode
+      url_for "#{settings.root_url}#{matrix_params}#{url_fragment}", mode
     end
 
     # Construct a link to +url_fragment+, which should be given relative to
@@ -87,10 +85,6 @@ module Sinatra
         "#{base}#{url_escape}"
       end
     end
-
-    def root_url
-      DEFAULT_URI_PREFIX
-    end
   end
 
 
diff --git a/server/server.rb b/server/server.rb
index fd4d8e1..91096f4 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -46,6 +46,7 @@ use Rack::MediaType
 use Rack::Date
 
 configure do
+  set :root_url, "/api"
   set :views, File.dirname(__FILE__) + '/views'
   set :public_folder, File.dirname(__FILE__) + '/public'
   # Try to load the driver on startup to fail early if there are issues
@@ -89,7 +90,16 @@ end
 # Redirect to /api
 get '/' do redirect root_url, 301; end
 
-get "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}\/?" do
+
+# Generate a root route for API docs
+get "#{settings.root_url}/docs\/?" do
+  respond_to do |format|
+    format.html { haml :'docs/index' }
+    format.xml { haml :'docs/index' }
+  end
+end
+
+get "#{settings.root_url}\/?" do
   if params[:force_auth]
     return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
   end
@@ -293,7 +303,7 @@ collection :instance_states do
   end
 end
 
-get "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/instances/:id/run" do
+get "#{settings.root_url}/instances/:id/run" do
   @instance = driver.instance(credentials, :id => params[:id])
   respond_to do |format|
     format.html { haml :"instances/run_command" }
@@ -769,7 +779,7 @@ end
 # existing blob
 NEW_BLOB_FORM_ID = "new_blob_form_d15cfd90"
 
-get "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/buckets/:bucket/#{NEW_BLOB_FORM_ID}" do
+get "#{settings.root_url}/buckets/:bucket/#{NEW_BLOB_FORM_ID}" do
   @bucket_id = params[:bucket]
   respond_to do |format|
     format.html {haml :"blobs/new"}
@@ -992,7 +1002,7 @@ collection :buckets do
 
 end
 
-get "#{Sinatra::UrlForHelper::DEFAULT_URI_PREFIX}/addresses/:id/associate" do
+get "#{settings.root_url}/addresses/:id/associate" do
   @instances = driver.instances(credentials)
   @address = Address::new(:id => params[:id])
   respond_to do |format|
-- 
1.7.6