deltacloud-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mfoj...@redhat.com
Subject [PATCH core 4/5] Core: Fix code duplication in how we load collections
Date Thu, 21 Feb 2013 13:39:46 GMT
From: Michal Fojtik <mfojtik@redhat.com>

This patch introduce new helper that provide mechanism
to load all collection for the given frontend

Signed-off-by: Michal fojtik <mfojtik@redhat.com>
---
 server/lib/cimi/collections.rb                     |  36 +------
 server/lib/cimi/models/cloud_entry_point.rb        |   2 +-
 server/lib/deltacloud/collections.rb               |  34 +------
 server/lib/deltacloud/drivers/base_driver.rb       |   2 +-
 server/lib/deltacloud/helpers/collection_helper.rb | 106 +++++++++++++++++++++
 server/tests/deltacloud/collections_test.rb        |   6 +-
 6 files changed, 119 insertions(+), 67 deletions(-)
 create mode 100644 server/lib/deltacloud/helpers/collection_helper.rb

diff --git a/server/lib/cimi/collections.rb b/server/lib/cimi/collections.rb
index e0a93b5..9990fa5 100644
--- a/server/lib/cimi/collections.rb
+++ b/server/lib/cimi/collections.rb
@@ -15,46 +15,18 @@
 # under the License.
 
 require_relative './collections/base'
+require_relative './../deltacloud/helpers/collection_helper'
 
 module CIMI
 
-  def self.collection_names
-    @collections.map { |c| c.collection_name }
-  end
-
-  def self.collections
-    @collections ||= []
-  end
-
   module Collections
+    extend Deltacloud::CollectionHelper
 
-    def self.collection(name)
-      CIMI.collections.find { |c| c.collection_name == name }
-    end
-
-    def self.cimi_modules
-      @cimi_modules ||= []
-    end
-
-    Dir[File.join(File::dirname(__FILE__), "collections", "*.rb")].each do |collection|
-      base_collection_name = File.basename(collection).gsub('.rb', '')
-      next if base_collection_name == 'base'
-      require collection
-      cimi_module_class = CIMI::Collections.const_get(base_collection_name.camelize)
-      cimi_modules << cimi_module_class
-      unless cimi_module_class.collections.nil?
-        cimi_module_class.collections.each do |c|
-          raise "ERROR: CIMI collection #{c} already registred" if CIMI.collections.include?
c
-          CIMI.collections << c
-        end
-      else
-        warn "WARNING: File %s placed in collections directory but does not have any collections
defined" % base_collection_name
-      end
-    end
+    load_collections_for :cimi, :from => File.join(File.dirname(__FILE__), 'collections')
 
     def self.included(klass)
       klass.class_eval do
-        CIMI::Collections.cimi_modules.each { |c| use c }
+        CIMI::Collections.modules(:cimi).each { |c| use c }
       end
     end
 
diff --git a/server/lib/cimi/models/cloud_entry_point.rb b/server/lib/cimi/models/cloud_entry_point.rb
index 7f274e9..6c28e53 100644
--- a/server/lib/cimi/models/cloud_entry_point.rb
+++ b/server/lib/cimi/models/cloud_entry_point.rb
@@ -51,7 +51,7 @@ class CIMI::Model::CloudEntryPoint < CIMI::Model::Base
 
   # Return an Hash of the CIMI root entities used in CloudEntryPoint
   def self.entities(context)
-    CIMI::Collections.cimi_modules.inject({}) do |supported_entities, m|
+    CIMI::Collections.modules(:cimi).inject({}) do |supported_entities, m|
       m.collections.each do |c|
         index_operation_capability = c.operation(:index).required_capability
         next if m.settings.respond_to?(:capability) and !m.settings.capability(index_operation_capability)
diff --git a/server/lib/deltacloud/collections.rb b/server/lib/deltacloud/collections.rb
index d3517b8..b41ef06 100644
--- a/server/lib/deltacloud/collections.rb
+++ b/server/lib/deltacloud/collections.rb
@@ -15,44 +15,18 @@
 # under the License.
 
 require_relative './collections/base'
+require_relative './helpers/collection_helper'
 
 module Deltacloud
 
-  def self.collection_names
-    @collections.map { |c| c.collection_name }
-  end
-
-  def self.collections
-    @collections ||= []
-  end
-
   module Collections
+    extend Deltacloud::CollectionHelper
 
-    def self.collection(name)
-      Deltacloud.collections.find { |c| c.collection_name == name }
-    end
-
-    def self.deltacloud_modules
-      @deltacloud_modules ||= []
-    end
-
-    Dir[File.join(File::dirname(__FILE__), "collections", "*.rb")].each do |collection|
-      base_collection_name = File.basename(collection).gsub('.rb', '')
-      next if base_collection_name == 'base'
-      require collection
-      deltacloud_module_class = Deltacloud::Collections.const_get(base_collection_name.camelize)
-      deltacloud_modules << deltacloud_module_class
-      deltacloud_module_class.collections.each do |c|
-        if Deltacloud.collections.include? c
-          raise "ERROR: Deltacloud collection #{c} already registred"
-        end
-        Deltacloud.collections << c
-      end unless deltacloud_module_class.collections.nil?
-    end
+    load_collections_for :deltacloud, :from => File.join(File.dirname(__FILE__), 'collections')
 
     def self.included(klass)
       klass.class_eval do
-        Deltacloud::Collections.deltacloud_modules.each do |collection_class|
+        Deltacloud::Collections.modules(:deltacloud).each do |collection_class|
           use collection_class
         end
       end
diff --git a/server/lib/deltacloud/drivers/base_driver.rb b/server/lib/deltacloud/drivers/base_driver.rb
index 61e1989..1bb80d5 100644
--- a/server/lib/deltacloud/drivers/base_driver.rb
+++ b/server/lib/deltacloud/drivers/base_driver.rb
@@ -156,7 +156,7 @@ module Deltacloud
 
     def supported_collections(credentials)
       collection_arr = []
-      Deltacloud::Collections.deltacloud_modules.each do |m|
+      Deltacloud::Collections.modules(:deltacloud).each do |m|
         m.collections.each do |c|
           # Get the required capability for the :index operation (like 'realms' or 'instance_state_machine')
           index_operation_capability = c.operation(:index).required_capability
diff --git a/server/lib/deltacloud/helpers/collection_helper.rb b/server/lib/deltacloud/helpers/collection_helper.rb
new file mode 100644
index 0000000..a4347a4
--- /dev/null
+++ b/server/lib/deltacloud/helpers/collection_helper.rb
@@ -0,0 +1,106 @@
+# 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 required 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.
+
+module Deltacloud
+
+  # Collection methods that every frontend need to provide.
+  #
+  module CollectionMethods
+
+    # Return all collections provided by the current frontend
+    #
+    def collections
+      module_klass::Collections.collections
+    end
+
+    # Return all collection names provided by the current frontend
+    #
+    def collection_names
+      module_klass::Collections.collection_names
+    end
+
+    # Simple check if the collection is available in the current frontend
+    #
+    def collection_exists?(c)
+      collections.include? c
+    end
+
+    private
+
+    def module_klass
+      @klass ||= self
+    end
+
+  end
+
+  extend CollectionMethods
+
+  module CollectionHelper
+
+    def collection_names
+      collections.map { |c| c.collection_name }
+    end
+
+    def collections
+      @collections ||= []
+    end
+
+    def collection(name)
+      collections.find { |c| c.collection_name == name }
+    end
+
+
+    def modules(frontend)
+      case frontend
+        when :cimi then @cimi_modules ||= []
+        when :deltacloud then @deltacloud_modules ||= []
+      end
+    end
+
+    # This method will load all collections from given directory.
+    #
+    # Syntax:
+    #
+    # load_collections_for :cimi, :from => DIRECTORY
+    #
+    def load_collections_for(frontend, opts={})
+      frontend_module = (frontend == :cimi) ? CIMI : Deltacloud
+      Dir[File.join(opts[:from], '*.rb')].each do |collection|
+        base_collection_name = File.basename(collection).gsub('.rb', '')
+        next if base_collection_name == 'base'
+        require collection
+        collection_module_class = frontend_module::Collections.const_get(
+          base_collection_name.camelize
+        )
+        modules(frontend) << collection_module_class
+        if collection_module_class.collections.nil?
+          warn "WARNING: #{collection_module_class} does not include any collections"
+        else
+          collection_module_class.collections.each do |c|
+            if frontend_module.collection_exists?(c)
+              raise "ERROR: Collection already registred #{c}"
+            end
+            frontend_module.collections << c
+          end
+        end
+      end
+    end
+
+  end
+end
+
+module CIMI
+  extend Deltacloud::CollectionMethods
+end
diff --git a/server/tests/deltacloud/collections_test.rb b/server/tests/deltacloud/collections_test.rb
index d3e41e9..47dfb6c 100644
--- a/server/tests/deltacloud/collections_test.rb
+++ b/server/tests/deltacloud/collections_test.rb
@@ -24,9 +24,9 @@ describe Deltacloud do
     end
 
     it 'must provide access to Deltacloud Sinatra modules' do
-      Deltacloud::Collections.must_respond_to :deltacloud_modules
-      Deltacloud::Collections.deltacloud_modules.wont_be_empty
-      Deltacloud::Collections.deltacloud_modules.must_include Deltacloud::Collections::Drivers
+      Deltacloud::Collections.must_respond_to :modules
+      Deltacloud::Collections.modules(:deltacloud).wont_be_empty
+      Deltacloud::Collections.modules(:deltacloud).must_include Deltacloud::Collections::Drivers
     end
 
   end
-- 
1.8.1.2


Mime
View raw message