You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by mf...@apache.org on 2010/12/02 13:56:06 UTC
svn commit: r1041354 - in /incubator/deltacloud/trunk/server: ./ lib/
lib/sinatra/ views/ views/api/ views/errors/
Author: mfojtik
Date: Thu Dec 2 12:56:05 2010
New Revision: 1041354
URL: http://svn.apache.org/viewvc?rev=1041354&view=rev
Log:
Allow for dynamic driver selection via header, storing it in Thread.current.
Added:
incubator/deltacloud/trunk/server/lib/sinatra/rack_driver_select.rb
incubator/deltacloud/trunk/server/views/api/drivers.xml.haml
Modified:
incubator/deltacloud/trunk/server/lib/drivers.rb
incubator/deltacloud/trunk/server/lib/sinatra/lazy_auth.rb
incubator/deltacloud/trunk/server/lib/sinatra/rabbit.rb
incubator/deltacloud/trunk/server/server.rb
incubator/deltacloud/trunk/server/views/api/show.html.haml
incubator/deltacloud/trunk/server/views/api/show.xml.haml
incubator/deltacloud/trunk/server/views/errors/backend_error.xml.haml
incubator/deltacloud/trunk/server/views/layout.html.haml
Modified: incubator/deltacloud/trunk/server/lib/drivers.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/drivers.rb?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/drivers.rb (original)
+++ incubator/deltacloud/trunk/server/lib/drivers.rb Thu Dec 2 12:56:05 2010
@@ -1,51 +1,60 @@
-DRIVERS = {
- :ec2 => { :name => "EC2" },
- :rackspace => { :name => "Rackspace" },
- :gogrid => { :name => "Gogrid" },
- :rhevm => { :name => "RHEVM" },
- :rimuhosting => { :name => "RimuHosting"},
- :opennebula => { :name => "Opennebula", :class => "OpennebulaDriver" },
- :terremark => { :name => "Terremark"},
- :azure => { :name => "Azure" },
- :mock => { :name => "Mock" }
-}
-
-DEFAULT_COLLECTIONS = [
- :hardware_profiles,
- :images,
- :instances,
- :instance_states,
- :realms,
- :storage_volumes,
- :storage_snapshots
-]
+module Deltacloud
+ DRIVERS = {
+ :ec2 => { :name => "EC2" },
+ :rackspace => { :name => "Rackspace" },
+ :gogrid => { :name => "Gogrid" },
+ :rhevm => { :name => "RHEVM" },
+ :rimuhosting => { :name => "RimuHosting"},
+ :opennebula => { :name => "Opennebula", :class => "OpennebulaDriver" },
+ :terremark => { :name => "Terremark"},
+ :azure => { :name => "Azure" },
+ :mock => { :name => "Mock" }
+ }
+
+ DEFAULT_COLLECTIONS = [
+ :hardware_profiles,
+ :images,
+ :instances,
+ :instance_states,
+ :realms,
+ :storage_volumes,
+ :storage_snapshots
+ ]
-DRIVER=ENV['API_DRIVER'] ? ENV['API_DRIVER'].to_sym : :mock
+ DRIVER=ENV['API_DRIVER'] ? ENV['API_DRIVER'].to_sym : :mock
-def driver_name
- DRIVERS[DRIVER][:name]
-end
-
-def driver_class_name
- basename = DRIVERS[DRIVER][:class] || "#{driver_name}Driver"
- "Deltacloud::Drivers::#{driver_name}::#{basename}"
-end
+ def driver_symbol
+ (Thread.current[:driver] || DRIVER).to_sym
+ end
-def driver_source_name
- File.join("deltacloud", "drivers", "#{DRIVER}", "#{DRIVER}_driver.rb")
-end
+ def driver_name
+ DRIVERS[:"#{driver_symbol}"][:name]
+ end
-def driver_mock_source_name
- return File.join('deltacloud', 'drivers', DRIVER.to_s, "#{DRIVER}_driver.rb") if driver_name.eql? 'Mock'
-end
+ def driver_class_name
+ basename = DRIVERS[:"#{driver_symbol}"][:class] || "#{driver_name}Driver"
+ "Deltacloud::Drivers::#{driver_name}::#{basename}"
+ end
-def driver
- require driver_source_name
- #require 'deltacloud/base_driver/mock_driver.rb'
+ def driver_source_name
+ File.join("deltacloud", "drivers", "#{driver_symbol}", "#{driver_symbol}_driver.rb")
+ end
- if Sinatra::Application.environment.eql? :test
- require driver_mock_source_name if driver_mock_source_name
+ def driver_mock_source_name
+ return File.join('deltacloud', 'drivers', "#{driver_symbol}",
+ "#{driver_symbol}_driver.rb") if driver_name.eql? 'Mock'
end
- @driver ||= eval( driver_class_name ).new
+ def driver
+ require driver_source_name
+ #require 'deltacloud/base_driver/mock_driver.rb'
+
+ if Sinatra::Application.environment.eql? :test
+ require driver_mock_source_name if driver_mock_source_name
+ end
+
+ @driver ||= eval( driver_class_name ).new
+ end
end
+
+include Deltacloud
Modified: incubator/deltacloud/trunk/server/lib/sinatra/lazy_auth.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/sinatra/lazy_auth.rb?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/sinatra/lazy_auth.rb (original)
+++ incubator/deltacloud/trunk/server/lib/sinatra/lazy_auth.rb Thu Dec 2 12:56:05 2010
@@ -40,7 +40,7 @@ module Sinatra
end
def authorize!
- r = "#{DRIVER}-deltacloud@#{HOSTNAME}"
+ r = "#{driver_symbol}-deltacloud@#{HOSTNAME}"
response['WWW-Authenticate'] = %(Basic realm="#{r}")
throw(:halt, [401, "Not authorized\n"])
end
Modified: incubator/deltacloud/trunk/server/lib/sinatra/rabbit.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/sinatra/rabbit.rb?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/lib/sinatra/rabbit.rb (original)
+++ incubator/deltacloud/trunk/server/lib/sinatra/rabbit.rb Thu Dec 2 12:56:05 2010
@@ -60,7 +60,7 @@ module Sinatra
def control(&block)
op = self
@control = Proc.new do
- op.check_capability(driver)
+ op.check_capability(Deltacloud::driver)
op.validate(params)
instance_eval(&block)
end
@@ -133,7 +133,7 @@ module Sinatra
end
def generate_documentation
- coll, oper, features = self, @operations, driver.features(name)
+ coll, oper, features = self, @operations, Deltacloud::driver.features(name)
::Sinatra::Application.get("/api/docs/#{@name}") do
@collection, @operations, @features = coll, oper, features
respond_to do |format|
@@ -206,9 +206,9 @@ module Sinatra
# operation on this collection.
def collection(name, &block)
raise DuplicateCollectionException if collections[name]
- return unless driver.has_collection?(name.to_sym)
+ return unless Deltacloud::driver.has_collection?(name.to_sym)
collections[name] = Collection.new(name, &block)
- collections[name].add_feature_params(driver.features(name))
+ collections[name].add_feature_params(Deltacloud::driver.features(name))
collections[name].generate
end
Added: incubator/deltacloud/trunk/server/lib/sinatra/rack_driver_select.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/lib/sinatra/rack_driver_select.rb?rev=1041354&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/lib/sinatra/rack_driver_select.rb (added)
+++ incubator/deltacloud/trunk/server/lib/sinatra/rack_driver_select.rb Thu Dec 2 12:56:05 2010
@@ -0,0 +1,22 @@
+class RackDriverSelect
+
+ def initialize(app, opts={})
+ @app = app
+ @opts = opts
+ end
+
+ def call(env)
+ original_driver = Thread.current[:driver]
+ new_driver = extract_driver(env)
+ Thread.current[:driver] = new_driver if new_driver
+ @app.call(env)
+ ensure
+ Thread.current[:driver] = original_driver
+ end
+
+ def extract_driver(env)
+ driver_name = env['HTTP_HEADERS'].match(/X\-Deltacloud\-Driver:(\w+)/i).to_a
+ return driver_name[1] if driver_name[1]
+ end
+
+end
Modified: incubator/deltacloud/trunk/server/server.rb
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/server.rb?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/server.rb (original)
+++ incubator/deltacloud/trunk/server/server.rb Thu Dec 2 12:56:05 2010
@@ -10,6 +10,12 @@ require 'erb'
require 'haml'
require 'open3'
require 'lib/deltacloud/helpers/blob_stream'
+require 'sinatra/rack_driver_select'
+
+set :version, '0.1.0'
+
+
+use RackDriverSelect
configure do
set :raise_errors => false
@@ -48,23 +54,28 @@ Sinatra::Application.register Sinatra::R
# Redirect to /api
get '/' do redirect url_for('/api'); end
+get '/api/drivers\/?' do
+ respond_to do |format|
+ format.xml { haml :"api/drivers" }
+ end
+end
+
get '/api\/?' do
- @version = 0.1
- if params[:force_auth]
- return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
- end
- respond_to do |format|
- format.xml { haml :"api/show" }
- format.json do
- { :api => {
- :version => @version,
- :driver => DRIVER,
- :links => entry_points.collect { |l| { :rel => l[0], :href => l[1]} }
- }
- }.to_json
- end
- format.html { haml :"api/show" }
+ if params[:force_auth]
+ return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
+ end
+ respond_to do |format|
+ format.xml { haml :"api/show" }
+ format.json do
+ { :api => {
+ :version => settings.version,
+ :driver => driver_symbol,
+ :links => entry_points.collect { |l| { :rel => l[0], :href => l[1]} }
+ }
+ }.to_json
end
+ format.html { haml :"api/show" }
+ end
end
# Rabbit DSL
Added: incubator/deltacloud/trunk/server/views/api/drivers.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/api/drivers.xml.haml?rev=1041354&view=auto
==============================================================================
--- incubator/deltacloud/trunk/server/views/api/drivers.xml.haml (added)
+++ incubator/deltacloud/trunk/server/views/api/drivers.xml.haml Thu Dec 2 12:56:05 2010
@@ -0,0 +1,6 @@
+%api{ :version => settings.version }
+ %drivers
+ - DRIVERS.each do |id, details|
+ %driver{ :id => id }
+ %name<
+ =details[:name]
Modified: incubator/deltacloud/trunk/server/views/api/show.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/api/show.html.haml?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/api/show.html.haml (original)
+++ incubator/deltacloud/trunk/server/views/api/show.html.haml Thu Dec 2 12:56:05 2010
@@ -1,5 +1,5 @@
%h1
- API v#{@version}
+ API v#{settings.version}
%ul
- collections.keys.sort_by { |k| k.to_s }.each do |key|
@@ -12,4 +12,4 @@
= op
%li
%strong
- %a{:href => url_for("/api/docs")} Documentation (v#{@version})
+ %a{:href => url_for("/api/docs")} Documentation (#{settings.version})
Modified: incubator/deltacloud/trunk/server/views/api/show.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/api/show.xml.haml?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/api/show.xml.haml (original)
+++ incubator/deltacloud/trunk/server/views/api/show.xml.haml Thu Dec 2 12:56:05 2010
@@ -1,4 +1,4 @@
-%api{ :version=>@version, :driver=>DRIVER }
+%api{ :version => settings.version, :driver => driver_symbol }
- for entry_point in entry_points
%link{ :rel=>entry_point[0], :href=>entry_point[1] }
- for feature in driver.features(entry_point[0])
Modified: incubator/deltacloud/trunk/server/views/errors/backend_error.xml.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/errors/backend_error.xml.haml?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/errors/backend_error.xml.haml (original)
+++ incubator/deltacloud/trunk/server/views/errors/backend_error.xml.haml Thu Dec 2 12:56:05 2010
@@ -1,6 +1,6 @@
%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
%kind backend_error
- %backend{ :driver => DRIVER }
+ %backend{ :driver => driver_symbol }
%code= @error.code
%cause= @error.cause
- if @error.details
Modified: incubator/deltacloud/trunk/server/views/layout.html.haml
URL: http://svn.apache.org/viewvc/incubator/deltacloud/trunk/server/views/layout.html.haml?rev=1041354&r1=1041353&r2=1041354&view=diff
==============================================================================
--- incubator/deltacloud/trunk/server/views/layout.html.haml (original)
+++ incubator/deltacloud/trunk/server/views/layout.html.haml Thu Dec 2 12:56:05 2010
@@ -19,7 +19,7 @@
= yield
#footer
#driver_info
- Driver: #{DRIVER}
+ Driver: #{driver_symbol} | API version: #{settings.version}
#copyright
Copyright 2009, 2010
%a{:href => 'http://redhat.com'} Red Hat