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