You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2010/11/26 13:54:15 UTC

[PATCH core 1/2] Moved DRIVER and @version into Sinatra settings (needs Sinatra 1.1.0)

From: Michal Fojtik <mf...@redhat.com>

---
 server/lib/drivers.rb                      |   93 +++++++++++++++-------------
 server/lib/sinatra/lazy_auth.rb            |    2 +-
 server/lib/sinatra/rabbit.rb               |    8 +-
 server/server.rb                           |   14 +++-
 server/views/api/show.html.haml            |    4 +-
 server/views/api/show.xml.haml             |    2 +-
 server/views/errors/backend_error.xml.haml |    2 +-
 server/views/layout.html.haml              |    2 +-
 8 files changed, 70 insertions(+), 57 deletions(-)

diff --git a/server/lib/drivers.rb b/server/lib/drivers.rb
index 6e31bb7..f30ab21 100644
--- a/server/lib/drivers.rb
+++ b/server/lib/drivers.rb
@@ -1,51 +1,56 @@
-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
-
-def driver_name
-  DRIVERS[DRIVER][:name]
-end
+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
+
+  def driver_name
+    DRIVERS[:"#{settings.driver}"][:name]
+  end
 
-def driver_class_name
-  basename = DRIVERS[DRIVER][:class] || "#{driver_name}Driver"
-  "Deltacloud::Drivers::#{driver_name}::#{basename}"
-end
+  def driver_class_name
+    basename = DRIVERS[:"#{settings.driver}"][:class] || "#{driver_name}Driver"
+    "Deltacloud::Drivers::#{driver_name}::#{basename}"
+  end
 
-def driver_source_name
-  File.join("deltacloud", "drivers", "#{DRIVER}", "#{DRIVER}_driver.rb")
-end
+  def driver_source_name
+    File.join("deltacloud", "drivers", "#{settings.driver}", "#{settings.driver}_driver.rb")
+  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_mock_source_name
+    return File.join('deltacloud', 'drivers', "#{settings.driver}", 
+                     "#{settings.driver}_driver.rb") if driver_name.eql? 'Mock'
+  end
 
-def driver
-  require driver_source_name
-  #require 'deltacloud/base_driver/mock_driver.rb'
+  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
+    if Sinatra::Application.environment.eql? :test
+      require driver_mock_source_name if driver_mock_source_name
+    end
 
-  @driver ||= eval( driver_class_name ).new
+    @driver ||= eval( driver_class_name ).new
+  end
 end
+
+include Deltacloud
diff --git a/server/lib/sinatra/lazy_auth.rb b/server/lib/sinatra/lazy_auth.rb
index 2a26fdf..43c4b4e 100644
--- a/server/lib/sinatra/lazy_auth.rb
+++ b/server/lib/sinatra/lazy_auth.rb
@@ -40,7 +40,7 @@ module Sinatra
     end
 
     def authorize!
-      r = "#{DRIVER}-deltacloud@#{HOSTNAME}"
+      r = "#{settings.driver}-deltacloud@#{HOSTNAME}"
       response['WWW-Authenticate'] = %(Basic realm="#{r}")
       throw(:halt, [401, "Not authorized\n"])
     end
diff --git a/server/lib/sinatra/rabbit.rb b/server/lib/sinatra/rabbit.rb
index 94c74e3..05bd6c5 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -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
 
diff --git a/server/server.rb b/server/server.rb
index d3f7d8a..297e556 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -11,6 +11,9 @@ require 'haml'
 require 'open3'
 require 'lib/deltacloud/helpers/blob_stream'
 
+set :driver, (ENV['API_DRIVER'] ? ENV['API_DRIVER'] : :mock)
+set :version, '0.0.1'
+
 configure do
   set :raise_errors => false
   set :show_exceptions, false
@@ -48,8 +51,13 @@ Sinatra::Application.register Sinatra::RespondTo
 # 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
@@ -57,8 +65,8 @@ get '/api\/?' do
         format.xml { haml :"api/show" }
         format.json do
           { :api => {
-            :version => @version,
-            :driver => DRIVER,
+            :version => settings.version,
+            :driver => settings.driver,
             :links => entry_points.collect { |l| { :rel => l[0], :href => l[1]} }
             }
           }.to_json
diff --git a/server/views/api/show.html.haml b/server/views/api/show.html.haml
index 0077972..74ec175 100644
--- a/server/views/api/show.html.haml
+++ b/server/views/api/show.html.haml
@@ -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})
diff --git a/server/views/api/show.xml.haml b/server/views/api/show.xml.haml
index 70c26c9..9b69bf5 100644
--- a/server/views/api/show.xml.haml
+++ b/server/views/api/show.xml.haml
@@ -1,4 +1,4 @@
-%api{ :version=>@version, :driver=>DRIVER }
+%api{ :version => settings.version, :driver => settings.driver }
   - for entry_point in entry_points
     %link{ :rel=>entry_point[0], :href=>entry_point[1] }
       - for feature in driver.features(entry_point[0])
diff --git a/server/views/errors/backend_error.xml.haml b/server/views/errors/backend_error.xml.haml
index 75866eb..62d067d 100644
--- a/server/views/errors/backend_error.xml.haml
+++ b/server/views/errors/backend_error.xml.haml
@@ -1,6 +1,6 @@
 %error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
   %kind backend_error
-  %backend{ :driver => DRIVER }
+  %backend{ :driver => settings.driver }
     %code= @error.code
     %cause= @error.cause
     - if @error.details
diff --git a/server/views/layout.html.haml b/server/views/layout.html.haml
index c46b15b..9e6dba7 100644
--- a/server/views/layout.html.haml
+++ b/server/views/layout.html.haml
@@ -19,7 +19,7 @@
         = yield
       #footer
         #driver_info
-          Driver: #{DRIVER}
+          Driver: #{settings.driver} | API version: #{settings.version}
         #copyright
           Copyright 2009, 2010
           %a{:href => 'http://redhat.com'} Red Hat
-- 
1.7.3.2