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 2012/08/03 15:15:29 UTC
[PATCH core 6/8] Core: Improved frontend loading and usage of ENV vars
From: Michal Fojtik <mf...@redhat.com>
* Added Deltacloud[:ec2].require! to load frontend class
* Added Deltacloud.default_frontend instead of ENV['API_FRONTEND']
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/config.ru | 9 ++++---
server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 2 +-
server/lib/deltacloud/helpers/driver_helper.rb | 2 +-
server/lib/deltacloud/helpers/url_helper.rb | 2 +-
server/lib/deltacloud_rack.rb | 32 +++++++++++++++++++++--
server/lib/sinatra/rack_accept.rb | 2 +-
6 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/server/config.ru b/server/config.ru
index 254baf2..16b025a 100644
--- a/server/config.ru
+++ b/server/config.ru
@@ -54,21 +54,22 @@ routes = {}
if ENV['API_FRONTEND'].split(',').size > 1
ENV['API_FRONTEND'].split(',').each do |frontend|
- Deltacloud.require_frontend!(frontend)
+ Deltacloud[frontend.to_sym].require!
routes.merge!({
Deltacloud[frontend].root_url => Deltacloud[frontend].klass
})
end
else
- Deltacloud.require_frontend!(ENV['API_FRONTEND'])
+ Deltacloud[ENV['API_FRONTEND'].to_sym].require!
+ Deltacloud[ENV['API_FRONTEND'].to_sym].default_frontend!
class IndexEntrypoint < Sinatra::Base
get "/" do
- redirect Deltacloud[ENV['API_FRONTEND']].root_url, 301
+ redirect Deltacloudd.default_frontend.root_url, 301
end
end
routes['/'] = IndexEntrypoint.new
- routes[Deltacloud[ENV['API_FRONTEND']].root_url] = Deltacloud[ENV['API_FRONTEND']].klass
+ routes[Deltacloud.default_frontend.root_url] = Deltacloud.default_frontend.klass
end
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 714b3e8..79dd9d2 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -776,7 +776,7 @@ module Deltacloud
def providers(credentials, opts={})
ec2 = new_client(credentials)
@providers ||= ec2.describe_regions.map{|r| Provider.new( {:id=>r, :name=>r,
- :url=>"#{ENV['API_HOST']}:#{ENV['API_PORT']}#{Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url}\;provider=#{r}" }) }
+ :url=>"#{ENV['API_HOST']}:#{ENV['API_PORT']}#{Deltacloud.default_frontend.root_url}\;provider=#{r}" }) }
end
def configured_providers
diff --git a/server/lib/deltacloud/helpers/driver_helper.rb b/server/lib/deltacloud/helpers/driver_helper.rb
index ab0e3c6..009effd 100644
--- a/server/lib/deltacloud/helpers/driver_helper.rb
+++ b/server/lib/deltacloud/helpers/driver_helper.rb
@@ -22,7 +22,7 @@ module Deltacloud::Helpers
end
def driver_name
- Thread.current[:driver] ||= ENV['API_DRIVER']
+ Thread.current[:driver] ||= Deltacloud.default_frontend.default_driver.to_s
end
def provider_name
diff --git a/server/lib/deltacloud/helpers/url_helper.rb b/server/lib/deltacloud/helpers/url_helper.rb
index bf82867..1b084d4 100644
--- a/server/lib/deltacloud/helpers/url_helper.rb
+++ b/server/lib/deltacloud/helpers/url_helper.rb
@@ -79,7 +79,7 @@ module Sinatra
def url_for url_fragment, mode=:path_only
case mode
when :path_only
- base = request.script_name.empty? ? Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url : request.script_name
+ base = request.script_name.empty? ? Deltacloud.default_frontend.root_url : request.script_name
when :full
scheme = request.scheme
port = request.port
diff --git a/server/lib/deltacloud_rack.rb b/server/lib/deltacloud_rack.rb
index 28b3045..54474c3 100644
--- a/server/lib/deltacloud_rack.rb
+++ b/server/lib/deltacloud_rack.rb
@@ -26,7 +26,7 @@ module Deltacloud
def self.configure(frontend=:deltacloud, &block)
frontend = frontend.to_sym
- config[frontend] = Server.new(&block)
+ config[frontend] ||= Server.new(frontend, &block)
self
end
@@ -36,22 +36,37 @@ module Deltacloud
def self.require_frontend!(frontend=:deltacloud)
frontend = frontend.to_sym
+ return false if frontend_required?(frontend)
require_relative File.join(frontend.to_s, 'server.rb')
Deltacloud[frontend].klass eval('::'+Deltacloud[frontend].klass)
end
+ def self.frontend_required?(frontend)
+ true unless Deltacloud[frontend].klass.kind_of? String
+ end
+
+ def self.default_frontend(frontend=nil)
+ @default_frontend = frontend unless frontend.nil?
+ raise "Could not determine default API frontend" if @default_frontend.nil? and !config[:deltacloud]
+ @default_frontend || config[:deltacloud]
+ end
+
class Server
+ attr_reader :name
attr_reader :root_url
attr_reader :version
attr_reader :klass
attr_reader :logger
+ attr_reader :default_driver
- def initialize(opts={}, &block)
+ def initialize(frontend, opts={}, &block)
+ @name=frontend.to_sym
@root_url = opts[:root_url]
@version = opts[:version]
@klass = opts[:klass]
@logger = opts[:logger] || Rack::DeltacloudLogger
+ @default_driver = opts[:default_driver] || :mock
instance_eval(&block)
end
@@ -71,11 +86,24 @@ module Deltacloud
@klass = k
end
+ def default_driver(drv=nil)
+ return @default_driver if drv.nil?
+ @default_driver = drv
+ end
+
def logger(logger=nil)
return @logger if logger.nil?
@logger = logger
end
+ def require!
+ Deltacloud.require_frontend!(@name)
+ end
+
+ def default_frontend!
+ Deltacloud.default_frontend(self)
+ end
+
end
end
diff --git a/server/lib/sinatra/rack_accept.rb b/server/lib/sinatra/rack_accept.rb
index cef287f..bcfb4d0 100644
--- a/server/lib/sinatra/rack_accept.rb
+++ b/server/lib/sinatra/rack_accept.rb
@@ -73,7 +73,7 @@ module Rack
self[type] = handler
end
yield wants
- if ENV['API_FRONTEND'] == "cimi"
+ if Deltacloud.default_frontend.name == :cimi
@media_type = (accepting_formats.has_key?(:xml) ? [:xml, accepting_formats[:xml]] : nil)
end
@media_type ||= accepting_formats.to_a.sort { |a,b| a[1]<=>b[1] }.reverse.select do |format, priority|
--
1.7.10.2
Re: [PATCH core 6/8] Core: Improved frontend loading and usage of ENV vars
Posted by Michal Fojtik <mf...@redhat.com>.
Hi,
I just found a small bug in config.ru on this.
You need to have:
server.default_driver ENV['API_DRIVER']
in each frontend config to make deltacloudd -i work.
Michal Fojtik
http://deltacloud.org
mfojtik@redhat.com
On Aug 3, 2012, at 3:15 PM, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
>
> * Added Deltacloud[:ec2].require! to load frontend class
> * Added Deltacloud.default_frontend instead of ENV['API_FRONTEND']
>
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
> server/config.ru | 9 ++++---
> server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 2 +-
> server/lib/deltacloud/helpers/driver_helper.rb | 2 +-
> server/lib/deltacloud/helpers/url_helper.rb | 2 +-
> server/lib/deltacloud_rack.rb | 32 +++++++++++++++++++++--
> server/lib/sinatra/rack_accept.rb | 2 +-
> 6 files changed, 39 insertions(+), 10 deletions(-)
>
> diff --git a/server/config.ru b/server/config.ru
> index 254baf2..16b025a 100644
> --- a/server/config.ru
> +++ b/server/config.ru
> @@ -54,21 +54,22 @@ routes = {}
> if ENV['API_FRONTEND'].split(',').size > 1
>
> ENV['API_FRONTEND'].split(',').each do |frontend|
> - Deltacloud.require_frontend!(frontend)
> + Deltacloud[frontend.to_sym].require!
> routes.merge!({
> Deltacloud[frontend].root_url => Deltacloud[frontend].klass
> })
> end
>
> else
> - Deltacloud.require_frontend!(ENV['API_FRONTEND'])
> + Deltacloud[ENV['API_FRONTEND'].to_sym].require!
> + Deltacloud[ENV['API_FRONTEND'].to_sym].default_frontend!
> class IndexEntrypoint < Sinatra::Base
> get "/" do
> - redirect Deltacloud[ENV['API_FRONTEND']].root_url, 301
> + redirect Deltacloudd.default_frontend.root_url, 301
> end
> end
> routes['/'] = IndexEntrypoint.new
> - routes[Deltacloud[ENV['API_FRONTEND']].root_url] = Deltacloud[ENV['API_FRONTEND']].klass
> + routes[Deltacloud.default_frontend.root_url] = Deltacloud.default_frontend.klass
> end
>
>
> diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> index 714b3e8..79dd9d2 100644
> --- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> +++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
> @@ -776,7 +776,7 @@ module Deltacloud
> def providers(credentials, opts={})
> ec2 = new_client(credentials)
> @providers ||= ec2.describe_regions.map{|r| Provider.new( {:id=>r, :name=>r,
> - :url=>"#{ENV['API_HOST']}:#{ENV['API_PORT']}#{Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url}\;provider=#{r}" }) }
> + :url=>"#{ENV['API_HOST']}:#{ENV['API_PORT']}#{Deltacloud.default_frontend.root_url}\;provider=#{r}" }) }
> end
>
> def configured_providers
> diff --git a/server/lib/deltacloud/helpers/driver_helper.rb b/server/lib/deltacloud/helpers/driver_helper.rb
> index ab0e3c6..009effd 100644
> --- a/server/lib/deltacloud/helpers/driver_helper.rb
> +++ b/server/lib/deltacloud/helpers/driver_helper.rb
> @@ -22,7 +22,7 @@ module Deltacloud::Helpers
> end
>
> def driver_name
> - Thread.current[:driver] ||= ENV['API_DRIVER']
> + Thread.current[:driver] ||= Deltacloud.default_frontend.default_driver.to_s
> end
>
> def provider_name
> diff --git a/server/lib/deltacloud/helpers/url_helper.rb b/server/lib/deltacloud/helpers/url_helper.rb
> index bf82867..1b084d4 100644
> --- a/server/lib/deltacloud/helpers/url_helper.rb
> +++ b/server/lib/deltacloud/helpers/url_helper.rb
> @@ -79,7 +79,7 @@ module Sinatra
> def url_for url_fragment, mode=:path_only
> case mode
> when :path_only
> - base = request.script_name.empty? ? Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url : request.script_name
> + base = request.script_name.empty? ? Deltacloud.default_frontend.root_url : request.script_name
> when :full
> scheme = request.scheme
> port = request.port
> diff --git a/server/lib/deltacloud_rack.rb b/server/lib/deltacloud_rack.rb
> index 28b3045..54474c3 100644
> --- a/server/lib/deltacloud_rack.rb
> +++ b/server/lib/deltacloud_rack.rb
> @@ -26,7 +26,7 @@ module Deltacloud
>
> def self.configure(frontend=:deltacloud, &block)
> frontend = frontend.to_sym
> - config[frontend] = Server.new(&block)
> + config[frontend] ||= Server.new(frontend, &block)
> self
> end
>
> @@ -36,22 +36,37 @@ module Deltacloud
>
> def self.require_frontend!(frontend=:deltacloud)
> frontend = frontend.to_sym
> + return false if frontend_required?(frontend)
> require_relative File.join(frontend.to_s, 'server.rb')
> Deltacloud[frontend].klass eval('::'+Deltacloud[frontend].klass)
> end
>
> + def self.frontend_required?(frontend)
> + true unless Deltacloud[frontend].klass.kind_of? String
> + end
> +
> + def self.default_frontend(frontend=nil)
> + @default_frontend = frontend unless frontend.nil?
> + raise "Could not determine default API frontend" if @default_frontend.nil? and !config[:deltacloud]
> + @default_frontend || config[:deltacloud]
> + end
> +
> class Server
>
> + attr_reader :name
> attr_reader :root_url
> attr_reader :version
> attr_reader :klass
> attr_reader :logger
> + attr_reader :default_driver
>
> - def initialize(opts={}, &block)
> + def initialize(frontend, opts={}, &block)
> + @name=frontend.to_sym
> @root_url = opts[:root_url]
> @version = opts[:version]
> @klass = opts[:klass]
> @logger = opts[:logger] || Rack::DeltacloudLogger
> + @default_driver = opts[:default_driver] || :mock
> instance_eval(&block)
> end
>
> @@ -71,11 +86,24 @@ module Deltacloud
> @klass = k
> end
>
> + def default_driver(drv=nil)
> + return @default_driver if drv.nil?
> + @default_driver = drv
> + end
> +
> def logger(logger=nil)
> return @logger if logger.nil?
> @logger = logger
> end
>
> + def require!
> + Deltacloud.require_frontend!(@name)
> + end
> +
> + def default_frontend!
> + Deltacloud.default_frontend(self)
> + end
> +
> end
>
> end
> diff --git a/server/lib/sinatra/rack_accept.rb b/server/lib/sinatra/rack_accept.rb
> index cef287f..bcfb4d0 100644
> --- a/server/lib/sinatra/rack_accept.rb
> +++ b/server/lib/sinatra/rack_accept.rb
> @@ -73,7 +73,7 @@ module Rack
> self[type] = handler
> end
> yield wants
> - if ENV['API_FRONTEND'] == "cimi"
> + if Deltacloud.default_frontend.name == :cimi
> @media_type = (accepting_formats.has_key?(:xml) ? [:xml, accepting_formats[:xml]] : nil)
> end
> @media_type ||= accepting_formats.to_a.sort { |a,b| a[1]<=>b[1] }.reverse.select do |format, priority|
> --
> 1.7.10.2
>