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 2013/02/15 11:36:28 UTC

Introducing 'initializers'

Hi,

This patch is something like a 'cleanup' in the way how we initialize
things when Deltacloud server is starting up.

Right now, these things are 'initialized' during server boot:

1. Mock directory is created and populated (this happen in mock driver)
2. Database file and schema is created (db.rb)
3. Frontends are configured (config.ru)

As you might see, we initialize things all over the code, which makes it hard
to keep track of this :)

For example there is a bug when you start Deltacloud with '-f cimi' after fresh
install, the '/var/tmp/deltacloud-mock-USER' dir is not created and the server
will fail to start...

  -- Michal


Re: [PATCH core 3/4] Core: Make DeltacloudLogger compatible with Ruby Logger

Posted by David Lutterkort <lu...@redhat.com>.
On Fri, 2013-02-15 at 11:36 +0100, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> This patch will make our DeltacloudLogger more compatible
> wit the default Ruby 'Logger' class.

ACK

David



[PATCH core 3/4] Core: Make DeltacloudLogger compatible with Ruby Logger

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

This patch will make our DeltacloudLogger more compatible
wit the default Ruby 'Logger' class.

Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/sinatra/rack_logger.rb | 59 +++++++++++++++++++++++----------------
 1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/server/lib/sinatra/rack_logger.rb b/server/lib/sinatra/rack_logger.rb
index 02bbf2a..572ef63 100644
--- a/server/lib/sinatra/rack_logger.rb
+++ b/server/lib/sinatra/rack_logger.rb
@@ -26,33 +26,40 @@ module Rack
   # rack.errors by default.
   class DeltacloudLogger
 
-    def self.log_path(path=nil)
-      @log_file ||= path
-    end
+    class << self
+      def log_path(path=nil)
+        @log_file ||= path
+      end
 
-    def self.verbose?
-      @verbose
-    end
+      def verbose?
+        @verbose
+      end
 
-    def self.verbose(v=nil)
-      @verbose ||= v
-    end
+      def verbose(v=nil)
+        @verbose ||= v
+      end
 
-    def self.setup(path, be_verbose=false)
-      verbose(be_verbose)
-      return self if path.nil?
-      dir = ::File.dirname(path)
-      if ::File.exists?(dir) and ::File.writable?(dir)
-        log_path(path)
-      else
-        warn "Warning: The log directory (#{dir}) is not writeable."
+      def setup(path, be_verbose=false)
+        verbose(be_verbose)
+        return self if path.nil?
+        dir = ::File.dirname(path)
+        if ::File.exists?(dir) and ::File.writable?(dir)
+          log_path(path)
+        else
+          warn "Warning: The log directory (#{dir}) is not writeable."
+        end
+        self
       end
-      self
-    end
 
-    def self.error(code, &block)
-      @logger ||= ::Logger.new(log_path || $stdout)
-      @logger.error(code, &block)
+      def logger
+        @logger ||= ::Logger.new(log_path || $stdout)
+      end
+
+      [:error, :warn, :info].each do |method_name|
+        define_method method_name do |msg, &block|
+          logger.send(method_name, msg, &block)
+        end
+      end
     end
 
     # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
@@ -62,10 +69,14 @@ module Rack
 
     VERBOSE_FORMAT = %{%s - %s [%s] "%s %s%s%s %s" %s %s %d %s %0.4f\n}
 
+    # If Deltacloud is started with the -L/--log option then
+    # we set logger to this file, otherwise use the default
+    # Sinatra logger facility
+    #
     def initialize(app, logger=nil)
       @app = app
-      unless self.class.log_path.nil?
-        @logger = ::Logger.new(self.class.log_path)
+      if self.class.log_path
+        @logger = self.class.logger
       else
         @logger = logger
       end
-- 
1.8.1.2


Re: Introducing 'initializers'

Posted by Michal Fojtik <mf...@redhat.com>.
On 02/15, mfojtik@redhat.com wrote:

Also recorded here:

http://tracker.deltacloud.org/set/318

> Hi,
> 
> This patch is something like a 'cleanup' in the way how we initialize
> things when Deltacloud server is starting up.
> 
> Right now, these things are 'initialized' during server boot:
> 
> 1. Mock directory is created and populated (this happen in mock driver)
> 2. Database file and schema is created (db.rb)
> 3. Frontends are configured (config.ru)
> 
> As you might see, we initialize things all over the code, which makes it hard
> to keep track of this :)
> 
> For example there is a bug when you start Deltacloud with '-f cimi' after fresh
> install, the '/var/tmp/deltacloud-mock-USER' dir is not created and the server
> will fail to start...
> 
>   -- Michal
> 

-- 
Michal Fojtik <mf...@redhat.com>
Deltacloud API, CloudForms

Re: [PATCH core 4/4] Tests: Use 'initializers' in all our tests.

Posted by Michal Fojtik <mf...@redhat.com>.
On 02/15, David Lutterkort wrote:
> On Fri, 2013-02-15 at 11:36 +0100, mfojtik@redhat.com wrote:
> > From: Michal Fojtik <mf...@redhat.com>
> > 
> > This patch will make possible to run our unit-tests without
> > initializing the Deltacloud.configure classes, because we already
> > do that in initializers.
> > 
> > For CIMI tests, this will make sure the database directory exists.
> 
> ACK.
> 
> Comments inline:
> 
> > diff --git a/server/tests/cimi/collections/cloud_entry_point_test.rb b/server/tests/cimi/collections/cloud_entry_point_test.rb
> > index eed8721..a7fdd89 100644
> > --- a/server/tests/cimi/collections/cloud_entry_point_test.rb
> > +++ b/server/tests/cimi/collections/cloud_entry_point_test.rb
> > @@ -18,7 +18,7 @@ describe CIMI::Collections::CloudEntryPoint do
> >    it 'set the CIMI-Version header' do
> >      get root_url
> >      headers['CIMI-Specification-Version'].wont_be_nil
> > -    headers['CIMI-Specification-Version'].must_equal '1.0.0'
> > +    headers['CIMI-Specification-Version'].must_equal Deltacloud::CIMI_API_VERSION
> 

Yes, I removed al references to that header in code and tests. Thanks!

> You can actually completely remove this header - CIMI 1.0.1 doesn't
> mention it anymore, as we've revamped how versioning is done.
> 
> David
> 
> 

-- 
Michal Fojtik <mf...@redhat.com>
Deltacloud API, CloudForms

Re: [PATCH core 4/4] Tests: Use 'initializers' in all our tests.

Posted by David Lutterkort <lu...@redhat.com>.
On Fri, 2013-02-15 at 11:36 +0100, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> This patch will make possible to run our unit-tests without
> initializing the Deltacloud.configure classes, because we already
> do that in initializers.
> 
> For CIMI tests, this will make sure the database directory exists.

ACK.

Comments inline:

> diff --git a/server/tests/cimi/collections/cloud_entry_point_test.rb b/server/tests/cimi/collections/cloud_entry_point_test.rb
> index eed8721..a7fdd89 100644
> --- a/server/tests/cimi/collections/cloud_entry_point_test.rb
> +++ b/server/tests/cimi/collections/cloud_entry_point_test.rb
> @@ -18,7 +18,7 @@ describe CIMI::Collections::CloudEntryPoint do
>    it 'set the CIMI-Version header' do
>      get root_url
>      headers['CIMI-Specification-Version'].wont_be_nil
> -    headers['CIMI-Specification-Version'].must_equal '1.0.0'
> +    headers['CIMI-Specification-Version'].must_equal Deltacloud::CIMI_API_VERSION

You can actually completely remove this header - CIMI 1.0.1 doesn't
mention it anymore, as we've revamped how versioning is done.

David



[PATCH core 4/4] Tests: Use 'initializers' in all our tests.

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

This patch will make possible to run our unit-tests without
initializing the Deltacloud.configure classes, because we already
do that in initializers.

For CIMI tests, this will make sure the database directory exists.

Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/tests/cimi/collections/cloud_entry_point_test.rb | 2 +-
 server/tests/cimi/db/database_helper_test.rb            | 8 --------
 server/tests/cimi/spec_helper.rb                        | 3 +++
 server/tests/deltacloud/common.rb                       | 4 +++-
 server/tests/deltacloud/rack_test.rb                    | 4 ++--
 server/tests/test_helper.rb                             | 1 +
 tests/cimi/test_helper.rb                               | 5 ++++-
 7 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/server/tests/cimi/collections/cloud_entry_point_test.rb b/server/tests/cimi/collections/cloud_entry_point_test.rb
index eed8721..a7fdd89 100644
--- a/server/tests/cimi/collections/cloud_entry_point_test.rb
+++ b/server/tests/cimi/collections/cloud_entry_point_test.rb
@@ -18,7 +18,7 @@ describe CIMI::Collections::CloudEntryPoint do
   it 'set the CIMI-Version header' do
     get root_url
     headers['CIMI-Specification-Version'].wont_be_nil
-    headers['CIMI-Specification-Version'].must_equal '1.0.0'
+    headers['CIMI-Specification-Version'].must_equal Deltacloud::CIMI_API_VERSION
   end
 
   it 'advertise CIMI collections in XML format' do
diff --git a/server/tests/cimi/db/database_helper_test.rb b/server/tests/cimi/db/database_helper_test.rb
index 30772f8..4d5f7fb 100644
--- a/server/tests/cimi/db/database_helper_test.rb
+++ b/server/tests/cimi/db/database_helper_test.rb
@@ -18,18 +18,10 @@ describe Deltacloud::Helpers::Database do
   BaseModel = CIMI::Model::Base
 
   before do
-    ENV['RACK_ENV'] = 'development'
     @db = DatabaseHelper.new
     @prov = Provider::lookup
   end
 
-  it 'report if application is running under test environment' do
-    ENV['RACK_ENV'] = 'test'
-    @db.test_environment?.must_equal true
-    ENV['RACK_ENV'] = 'development'
-    @db.test_environment?.must_equal false
-  end
-
   it 'report if given entity is provided by database' do
     @db.provides?('machine_template').must_equal true
     @db.provides?('machine').must_equal false
diff --git a/server/tests/cimi/spec_helper.rb b/server/tests/cimi/spec_helper.rb
index 647a520..1f6f9ea 100644
--- a/server/tests/cimi/spec_helper.rb
+++ b/server/tests/cimi/spec_helper.rb
@@ -21,7 +21,10 @@ require 'xmlsimple'
 require 'json/pure'
 require 'require_relative' if RUBY_VERSION < '1.9'
 
+ENV['API_FRONTEND'] = 'cimi'
+
 require_relative '../../lib/deltacloud/core_ext.rb'
+require_relative '../../lib/initialize'
 require_relative '../../lib/cimi/models.rb'
 
 DATA_DIR = File::join(File::expand_path(File::dirname(__FILE__)), 'data')
diff --git a/server/tests/deltacloud/common.rb b/server/tests/deltacloud/common.rb
index 2b304d6..cded956 100644
--- a/server/tests/deltacloud/common.rb
+++ b/server/tests/deltacloud/common.rb
@@ -1,7 +1,9 @@
 require_relative '../test_helper.rb'
+
+require_relative File.join('..', '..', 'lib', 'initializers', 'mock_initialize')
 require_relative File.join('..', '..', 'lib', 'initializers', 'frontend_initialize')
 
-Deltacloud.require_frontend!(:deltacloud)
+Deltacloud.require_frontend! :deltacloud
 
 def check_json_serialization_for(model, sample_id, optional_attrs=[])
   header 'Accept', 'application/json'
diff --git a/server/tests/deltacloud/rack_test.rb b/server/tests/deltacloud/rack_test.rb
index f6eb717..92b8150 100644
--- a/server/tests/deltacloud/rack_test.rb
+++ b/server/tests/deltacloud/rack_test.rb
@@ -38,12 +38,12 @@ describe Deltacloud do
 
     it 'should provide the correct version' do
       Deltacloud.config[:deltacloud].version.must_equal Deltacloud::API_VERSION
-      Deltacloud.config[:cimi].version.must_equal Deltacloud::API_VERSION
+      Deltacloud.config[:cimi].version.must_equal Deltacloud::CIMI_API_VERSION
     end
 
     it 'should provide the logger facility' do
       Deltacloud.config[:deltacloud].logger.must_equal Rack::DeltacloudLogger
-      Deltacloud.config[:cimi].logger.must_equal Logger
+      Deltacloud.config[:cimi].logger.must_equal Rack::DeltacloudLogger
     end
 
   end
diff --git a/server/tests/test_helper.rb b/server/tests/test_helper.rb
index 5785a43..ff16de4 100644
--- a/server/tests/test_helper.rb
+++ b/server/tests/test_helper.rb
@@ -8,6 +8,7 @@ require 'require_relative' if RUBY_VERSION < '1.9'
 
 require 'singleton'
 
+require_relative '../lib/initializers/mock_initialize'
 require_relative '../lib/deltacloud/api.rb'
 
 ENV['RACK_ENV'] = 'test'
diff --git a/tests/cimi/test_helper.rb b/tests/cimi/test_helper.rb
index 1720dd7..96e94f6 100644
--- a/tests/cimi/test_helper.rb
+++ b/tests/cimi/test_helper.rb
@@ -18,8 +18,11 @@ require 'rubygems'
 require 'require_relative' if RUBY_VERSION < '1.9'
 require_relative '../helpers/common.rb'
 require 'singleton'
+
+ENV['API_FRONTEND'] = 'cimi'
+
+require_relative '../../server/lib/initialize'
 require_relative "../../server/lib/cimi/models"
-require 'logger'
 
 # Add CIMI specific config stuff
 module CIMI
-- 
1.8.1.2


Re: [PATCH core 1/4] Core: Added 'lib/initializers' directory

Posted by Michal Fojtik <mf...@redhat.com>.
On 02/15, David Lutterkort wrote:
> On Fri, 2013-02-15 at 11:36 +0100, mfojtik@redhat.com wrote:
> > From: Michal Fojtik <mf...@redhat.com>
> > 
> > Before this patch, we used to initialize stuff like database
> > or mock directories in random places in source code.
> > 
> > This patch should make all initialization happen in one place.
> 
> ACK.  Bringing some order into the initialization process is long
> overdue ...
> 
> > diff --git a/server/config.ru b/server/config.ru
> > index 406c769..305ab4b 100644
> > --- a/server/config.ru
> > +++ b/server/config.ru
> ...
> 
> > +load File.join(File.dirname(__FILE__), 'lib', 'initialize.rb')
> 
> Why load ? Do we ever want to run initialization more than once ? If
> not, require_relative would be enough.

With require_relative I get this result:

/home/mfojtik/code/core/server/config.ru:19:in `require_relative': cannot
infer basepath (LoadError)
  from /home/mfojtik/code/core/server/config.ru:19:in `block in <main>'

The 'require' works using the 'relative' path under 1.9 but not in 1.8...

That was the reason to use 'load'. We are not loading the 'config.ru' so
the 'load' method should not make any damage here...

  -- Michal

-- 
Michal Fojtik <mf...@redhat.com>
Deltacloud API, CloudForms

Re: [PATCH core 1/4] Core: Added 'lib/initializers' directory

Posted by David Lutterkort <lu...@redhat.com>.
On Fri, 2013-02-15 at 11:36 +0100, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> Before this patch, we used to initialize stuff like database
> or mock directories in random places in source code.
> 
> This patch should make all initialization happen in one place.

ACK.  Bringing some order into the initialization process is long
overdue ...

> diff --git a/server/config.ru b/server/config.ru
> index 406c769..305ab4b 100644
> --- a/server/config.ru
> +++ b/server/config.ru
...

> +load File.join(File.dirname(__FILE__), 'lib', 'initialize.rb')

Why load ? Do we ever want to run initialization more than once ? If
not, require_relative would be enough.

David



[PATCH core 1/4] Core: Added 'lib/initializers' directory

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

Before this patch, we used to initialize stuff like database
or mock directories in random places in source code.

This patch should make all initialization happen in one place.

Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/config.ru                                  | 65 +++++------------------
 server/lib/cimi/dependencies.rb                   |  2 -
 server/lib/cimi/models.rb                         | 18 +++----
 server/lib/db.rb                                  | 17 ------
 server/lib/deltacloud/drivers/mock/mock_driver.rb |  9 +---
 server/lib/deltacloud_rack.rb                     | 13 +++++
 server/lib/initialize.rb                          | 25 +++++++++
 server/lib/initializers/database_initialize.rb    | 28 ++++++++++
 server/lib/initializers/frontend_initialize.rb    | 49 +++++++++++++++++
 server/lib/initializers/mock_initialize.rb        | 15 ++++++
 server/tests/deltacloud/common.rb                 | 14 +----
 server/tests/drivers/base/common.rb               | 14 +----
 12 files changed, 155 insertions(+), 114 deletions(-)
 create mode 100644 server/lib/initialize.rb
 create mode 100644 server/lib/initializers/database_initialize.rb
 create mode 100644 server/lib/initializers/frontend_initialize.rb
 create mode 100644 server/lib/initializers/mock_initialize.rb

diff --git a/server/config.ru b/server/config.ru
index 406c769..305ab4b 100644
--- a/server/config.ru
+++ b/server/config.ru
@@ -14,56 +14,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-# The default URL prefix (where to mount Deltacloud API)
-
-# The default driver is 'mock'
-ENV['API_DRIVER'] ||= 'mock'
-ENV['API_FRONTEND'] ||= 'deltacloud'
-
-load File.join(File.dirname(__FILE__), 'lib', 'deltacloud_rack.rb')
-
-Deltacloud::configure do |server|
-  server.root_url '/api'
-  server.version Deltacloud::API_VERSION
-  server.klass 'Deltacloud::API'
-end
-
-Deltacloud::configure(:cimi) do |server|
-  server.root_url '/cimi'
-  server.version Deltacloud::CIMI_API_VERSION
-  server.klass 'CIMI::API'
-end
-
-Deltacloud::configure(:ec2) do |server|
-  server.root_url '/ec2'
-  server.version '2012-04-01'
-  server.klass 'Deltacloud::EC2::API'
-end
-
-routes = {}
-
-def frontends
-  ENV['API_FRONTEND'].split(',').size > 1 ?
-    ENV['API_FRONTEND'].split(',') : [ENV['API_FRONTEND']]
-end
-
-# If user wants to launch multiple frontends withing a single instance of DC API
-# then require them and prepare the routes for Rack
-#
-# NOTE: The '/' will not be generated, since multiple frontends could have
-#       different root_url's
-#
-frontends.each do |frontend|
-  frontend = frontend.strip
-  if Deltacloud[frontend.to_sym].nil?
-    puts "ERROR: Unknown frontend (#{frontend}). Valid values are 'deltacloud,cimi,ec2'"
-    exit(1)
-  end
-  Deltacloud[frontend.to_sym].require!
-  routes.merge!({
-    Deltacloud[frontend].root_url => Deltacloud[frontend].klass
-  })
-end
+load File.join(File.dirname(__FILE__), 'lib', 'initialize.rb')
 
 def static_dir_for(name)
   Rack::Directory.new( File.join(File.dirname(__FILE__), "public", name))
@@ -71,14 +22,22 @@ end
 
 # Mount static assets directories and index entrypoint
 #
-routes.merge!({
+# The 'IndexApp' is small Sinatra::Base application that
+# sits on the '/' route and display list of available frontends.
+#
+static_files = {
   '/' => Deltacloud::IndexApp,
   '/stylesheets' =>  static_dir_for('stylesheets'),
   '/javascripts' =>  static_dir_for('javascripts'),
   '/images' =>  static_dir_for('images')
-})
+}
+
+# The 'generate_routes_for' also require the frontend
+# servers and all dependencies.
+#
+routes = Deltacloud.generate_routes_for(frontends)
 
 run Rack::Builder.new {
   use Rack::MatrixParams
-  run Rack::URLMap.new(routes)
+  run Rack::URLMap.new(routes.merge(static_files))
 }
diff --git a/server/lib/cimi/dependencies.rb b/server/lib/cimi/dependencies.rb
index 6f0000c..9b7dcf2 100644
--- a/server/lib/cimi/dependencies.rb
+++ b/server/lib/cimi/dependencies.rb
@@ -58,5 +58,3 @@ require 'sinatra/rack_date'
 require 'sinatra/rack_matrix_params'
 require 'sinatra/rack_syslog'
 require 'sinatra/sinatra_verbose'
-
-CMWG_NAMESPACE = "http://schemas.dmtf.org/cimi/1"
diff --git a/server/lib/cimi/models.rb b/server/lib/cimi/models.rb
index 20c0ef1..39beae4 100644
--- a/server/lib/cimi/models.rb
+++ b/server/lib/cimi/models.rb
@@ -36,17 +36,15 @@ module CIMI
 end
 
 require 'require_relative' if RUBY_VERSION < '1.9'
-require_relative '../db'
 
-unless Deltacloud.test_environment?
-  Deltacloud::initialize_database
-  require_relative './../db/provider'
-  require_relative './../db/entity'
-  require_relative './../db/machine_template'
-  require_relative './../db/address_template'
-  require_relative './../db/volume_configuration'
-  require_relative './../db/volume_template'
-end
+# Database entities
+#
+require_relative './../db/provider'
+require_relative './../db/entity'
+require_relative './../db/machine_template'
+require_relative './../db/address_template'
+require_relative './../db/volume_configuration'
+require_relative './../db/volume_template'
 
 require_relative './models/schema'
 require_relative './models/resource'
diff --git a/server/lib/db.rb b/server/lib/db.rb
index 827a54c..9bf7ead 100644
--- a/server/lib/db.rb
+++ b/server/lib/db.rb
@@ -15,23 +15,6 @@
 
 module Deltacloud
 
-  def self.test_environment?
-    ENV['RACK_ENV'] == 'test'
-  end
-
-  unless test_environment?
-    require 'sequel'
-    require 'logger'
-    Sequel::Model.plugin :validation_class_methods
-  end
-
-  if RUBY_PLATFORM == 'java'
-    DATABASE_LOCATION = ENV['DATABASE_LOCATION'] ||
-      'jdbc:sqlite:'+File.join('/', 'var', 'tmp', "deltacloud-mock-#{ENV['USER']}", 'db.sqlite')
-  else
-    DATABASE_LOCATION = ENV['DATABASE_LOCATION'] ||
-      'sqlite://'+File.join('/', 'var', 'tmp', "deltacloud-mock-#{ENV['USER']}", 'db.sqlite')
-  end
 
   def self.database(opts={})
     opts[:logger] = ::Logger.new($stdout) if ENV['API_VERBOSE']
diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index cb18e92..fe930c2 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -94,14 +94,7 @@ module Deltacloud::Drivers::Mock
 
 
     def initialize
-      if ENV["DELTACLOUD_MOCK_STORAGE"]
-        storage_root = ENV["DELTACLOUD_MOCK_STORAGE"]
-      elsif Etc.getlogin
-        storage_root = File::join("/var/tmp", "deltacloud-mock-#{ENV["USER"]}")
-      else
-        raise "Please set either the DELTACLOUD_MOCK_STORAGE or USER environment variable"
-      end
-      @client = Client.new(storage_root)
+      @client = Client.new(MOCK_STORAGE_DIR)
     end
 
     def realms(credentials, opts={})
diff --git a/server/lib/deltacloud_rack.rb b/server/lib/deltacloud_rack.rb
index b8e605b..f656d1d 100644
--- a/server/lib/deltacloud_rack.rb
+++ b/server/lib/deltacloud_rack.rb
@@ -57,6 +57,19 @@ module Deltacloud
     @default_frontend || config[:deltacloud]
   end
 
+  def self.generate_routes_for(frontends)
+    frontends.inject({}) do |result, frontend|
+      frontend = frontend.strip
+      if Deltacloud[frontend.to_sym].nil?
+        puts "ERROR: Unknown frontend (#{frontend}). Valid values are 'deltacloud,cimi,ec2'"
+        exit(1)
+      end
+      Deltacloud[frontend.to_sym].require!
+      result[Deltacloud[frontend].root_url] = Deltacloud[frontend].klass
+      result
+    end
+  end
+
   require 'sinatra/base'
   require_relative './deltacloud/helpers/deltacloud_helper'
   require_relative './sinatra/rack_accept'
diff --git a/server/lib/initialize.rb b/server/lib/initialize.rb
new file mode 100644
index 0000000..54060a7
--- /dev/null
+++ b/server/lib/initialize.rb
@@ -0,0 +1,25 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless require_relatived by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Deltacloud server initialization scripts:
+
+# Initialize storage for mock and CIMI database
+require_relative './initializers/mock_initialize'
+
+# Configure available frontends
+require_relative './initializers/frontend_initialize'
+
+# If CIMI is enabled, then initialize database stuff
+require_relative './initializers/database_initialize' if frontends.include? 'cimi'
diff --git a/server/lib/initializers/database_initialize.rb b/server/lib/initializers/database_initialize.rb
new file mode 100644
index 0000000..32badb2
--- /dev/null
+++ b/server/lib/initializers/database_initialize.rb
@@ -0,0 +1,28 @@
+# Initialize the storage layer we use to persist some CIMI entities
+# and attributes.
+#
+# By default the database backend is sqlite3
+
+require 'sequel'
+require 'logger'
+
+require_relative '../db'
+
+# We want to enable validation plugin for all database models
+#
+Sequel::Model.plugin :validation_class_methods
+
+# For JRuby we need to different Sequel driver
+#
+sequel_driver = (RUBY_PLATFORM=='java') ? 'jdbc:sqlite:' : 'sqlite://'
+
+# The default sqlite3 database could be override by 'DATABASE_LOCATION'
+# environment variable.
+#
+# For more details about possible values see:
+# http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html
+#
+DATABASE_LOCATION = ENV['DATABASE_LOCATION'] ||
+  "#{sequel_driver}#{File.join(BASE_STORAGE_DIR, 'db.sqlite')}"
+
+Deltacloud::initialize_database
diff --git a/server/lib/initializers/frontend_initialize.rb b/server/lib/initializers/frontend_initialize.rb
new file mode 100644
index 0000000..bfa1871
--- /dev/null
+++ b/server/lib/initializers/frontend_initialize.rb
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless require_relatived by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# The default driver if the API_DRIVER environment variable is not set:
+ENV['API_DRIVER'] ||= 'mock'
+
+# The default frontend if the API_FRONTEND environment variable is not set:
+ENV['API_FRONTEND'] ||= 'deltacloud'
+
+require_relative './../deltacloud_rack'
+
+# This will configure the URL mapping, verions and different servers
+# that multiple frontends require. You might not need to change this :)
+
+def frontends
+  ENV['API_FRONTEND'] ||= 'deltacloud'
+  ENV['API_FRONTEND'].split(',').size > 1 ?
+    ENV['API_FRONTEND'].split(',') : [ENV['API_FRONTEND']]
+end
+
+Deltacloud::configure do |server|
+  server.root_url '/api'
+  server.version Deltacloud::API_VERSION
+  server.klass 'Deltacloud::API'
+end
+
+Deltacloud::configure(:cimi) do |server|
+  server.root_url '/cimi'
+  server.version Deltacloud::CIMI_API_VERSION
+  server.klass 'CIMI::API'
+end
+
+Deltacloud::configure(:ec2) do |server|
+  server.root_url '/ec2'
+  server.version '2012-04-01'
+  server.klass 'Deltacloud::EC2::API'
+end
diff --git a/server/lib/initializers/mock_initialize.rb b/server/lib/initializers/mock_initialize.rb
new file mode 100644
index 0000000..c8c24e9
--- /dev/null
+++ b/server/lib/initializers/mock_initialize.rb
@@ -0,0 +1,15 @@
+# This will create the directory we use for storing Mock driver
+# data and also CIMI database file
+#
+
+# By default the location is /var/tmp/deltacloud-{USER}/
+#
+BASE_STORAGE_DIR = File.join('/', 'var', 'tmp', "deltacloud-#{ENV['USER']}")
+
+# The mock driver YAML files are stored in BASE_STORAGE_DIR/mock
+# You can overide this by setting 'DELTACLOUD_MOCK_STORAGE' environment variable
+#
+MOCK_STORAGE_DIR = ENV['DELTACLOUD_MOCK_STORAGE'] || File.join(BASE_STORAGE_DIR, 'mock')
+
+FileUtils.mkpath(BASE_STORAGE_DIR, :mode => 0750) unless File.directory?(BASE_STORAGE_DIR)
+FileUtils.mkpath(BASE_STORAGE_DIR, :mode => 0750) unless File.directory?(MOCK_STORAGE_DIR)
diff --git a/server/tests/deltacloud/common.rb b/server/tests/deltacloud/common.rb
index 1c3f45c..2b304d6 100644
--- a/server/tests/deltacloud/common.rb
+++ b/server/tests/deltacloud/common.rb
@@ -1,17 +1,7 @@
 require_relative '../test_helper.rb'
-require_relative File.join('..', '..', 'lib', 'deltacloud_rack.rb')
+require_relative File.join('..', '..', 'lib', 'initializers', 'frontend_initialize')
 
-# Setup Deltacloud::API Sinatra instance
-
-Deltacloud::configure do |server|
-  server.root_url '/api'
-  server.version Deltacloud::API_VERSION
-  server.klass 'Deltacloud::API'
-  server.logger Rack::DeltacloudLogger.setup(ENV['API_LOG'], ENV['API_VERBOSE'])
-  server.default_driver :mock
-end
-
-Deltacloud.require_frontend!
+Deltacloud.require_frontend!(:deltacloud)
 
 def check_json_serialization_for(model, sample_id, optional_attrs=[])
   header 'Accept', 'application/json'
diff --git a/server/tests/drivers/base/common.rb b/server/tests/drivers/base/common.rb
index 163a715..02d8673 100644
--- a/server/tests/drivers/base/common.rb
+++ b/server/tests/drivers/base/common.rb
@@ -1,15 +1,5 @@
 require_relative '../../test_helper'
 
-require_relative File.join('..', '..', '..', 'lib', 'deltacloud_rack.rb')
+require_relative File.join('..', '..', '..', 'lib', 'initializers', 'frontend_initialize')
 
-# Setup Deltacloud::API Sinatra instance
-
-Deltacloud::configure do |server|
-  server.root_url '/api'
-  server.version Deltacloud::API_VERSION
-  server.klass 'Deltacloud::API'
-  server.logger Rack::DeltacloudLogger.setup(ENV['API_LOG'], ENV['API_VERBOSE'])
-  server.default_driver :mock
-end
-
-Deltacloud.require_frontend!
+Deltacloud.require_frontend!(:deltacloud)
-- 
1.8.1.2


Re: [PATCH core 2/4] CIMI: If API_VERBOSE is enabled, log into Deltacloud logger

Posted by David Lutterkort <lu...@redhat.com>.
On Fri, 2013-02-15 at 11:36 +0100, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> This patch will make sure that logs produced by Sequel (SQL logs)
> will go to DeltacloudLogger instead of default Ruby Logger.
> 
> The reason is that user can set the '-L/--log' option and redirect
> all logs into a file. In that case, this patch will make sure
> that SQL logs are saved into that file as well.

ACK



[PATCH core 2/4] CIMI: If API_VERBOSE is enabled, log into Deltacloud logger

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

This patch will make sure that logs produced by Sequel (SQL logs)
will go to DeltacloudLogger instead of default Ruby Logger.

The reason is that user can set the '-L/--log' option and redirect
all logs into a file. In that case, this patch will make sure
that SQL logs are saved into that file as well.

Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/db.rb | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/server/lib/db.rb b/server/lib/db.rb
index 9bf7ead..5615f50 100644
--- a/server/lib/db.rb
+++ b/server/lib/db.rb
@@ -17,7 +17,13 @@ module Deltacloud
 
 
   def self.database(opts={})
-    opts[:logger] = ::Logger.new($stdout) if ENV['API_VERBOSE']
+    if ENV['API_VERBOSE']
+      if Deltacloud.respond_to? :config
+        opts[:logger] = Deltacloud.config[:cimi].logger
+      else
+        opts[:logger] = ::Logger.new($stdout)
+      end
+    end
     @db ||=  Sequel.connect(DATABASE_LOCATION, opts)
   end
 
-- 
1.8.1.2