From: marios <[email protected]> (related https://issues.apache.org/jira/browse/DTACLOUD-316)
Signed-off-by: marios <[email protected]> --- server/lib/deltacloud/drivers/base_driver.rb | 17 +++++++++++++++++ .../deltacloud/drivers/openstack/openstack_driver.rb | 18 ++++++++---------- server/lib/deltacloud/helpers/deltacloud_helper.rb | 16 ---------------- server/lib/deltacloud/server.rb | 9 +++------ server/tests/deltacloud/deltacloud_helper_test.rb | 18 ++++++++++-------- server/views/api/show.html.haml | 2 +- server/views/api/show.xml.haml | 2 +- 7 files changed, 40 insertions(+), 42 deletions(-) diff --git a/server/lib/deltacloud/drivers/base_driver.rb b/server/lib/deltacloud/drivers/base_driver.rb index 41b6923..3b37721 100644 --- a/server/lib/deltacloud/drivers/base_driver.rb +++ b/server/lib/deltacloud/drivers/base_driver.rb @@ -155,6 +155,23 @@ module Deltacloud (self.class.instance_methods - superclass_methods).include? method end + def supported_collections(credentials) + collection_arr = [] + Deltacloud::Collections.deltacloud_modules.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 + # Then use this capability to check if the 'capability' lambda defined + # for the Sinatra::Base class evaluate to 'true' + next if m.settings.respond_to?(:capability) and !m.settings.capability(index_operation_capability) + yield c if block_given? + collection_arr << c + end + end + collection_arr + end + + ## Capabilities # The rabbit dsl supports declaring a capability that is required # in the backend driver for the call to succeed. A driver can diff --git a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb index ca824bd..7e11258 100644 --- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb +++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb @@ -40,17 +40,15 @@ module Deltacloud define_hardware_profile('default') - def respond_to?(capability)#, credentials) - if capability == :buckets - begin - client = new_client(Deltacloud.config["openstack_creds"], capability) - rescue Deltacloud::ExceptionHandler::NotImplemented #OpenStack::Exception::NotImplemented... - return false - end - return true - else - super(capability) + def supported_collections(credentials) + #get the collections as defined by 'capability' and 'respond_to?' blocks + super_collections = super + begin + client = new_client(credentials, :buckets) + rescue Deltacloud::ExceptionHandler::NotImplemented #OpenStack::Exception::NotImplemented... + return super_collections - [Sinatra::Rabbit::BucketsCollection] end + super_collections end def hardware_profiles(credentials, opts = {}) diff --git a/server/lib/deltacloud/helpers/deltacloud_helper.rb b/server/lib/deltacloud/helpers/deltacloud_helper.rb index 33fbe23..404e293 100644 --- a/server/lib/deltacloud/helpers/deltacloud_helper.rb +++ b/server/lib/deltacloud/helpers/deltacloud_helper.rb @@ -18,22 +18,6 @@ module Deltacloud::Helpers require 'benchmark' - def supported_collections - collection_arr = [] - Deltacloud::Collections.deltacloud_modules.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 - # Then use this capability to check if the 'capability' lambda defined - # for the Sinatra::Base class evaluate to 'true' - next if m.settings.respond_to?(:capability) and !m.settings.capability(index_operation_capability) - yield c if block_given? - collection_arr << c - end - end - collection_arr - end - def auth_feature_name return 'key' if driver.class.has_feature?(:instances, :authentication_key) return 'password' if driver.class.has_feature?(:instances, :authentication_password) diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb index e2b2a8f..4ed527a 100644 --- a/server/lib/deltacloud/server.rb +++ b/server/lib/deltacloud/server.rb @@ -46,13 +46,10 @@ module Deltacloud set :config, Deltacloud[:deltacloud] get '/' do - if driver.name == "openstack" or params[:force_auth] + if params[:force_auth] return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials) - if driver.name == "openstack" - Deltacloud.config["openstack_creds"] = credentials - #or here also works: Thread.current["openstack_creds"] = credentials - end end + @collections = driver.supported_collections(credentials) respond_to do |format| format.xml { haml :"api/show" } format.json { xml_to_json :"api/show" } @@ -61,7 +58,7 @@ module Deltacloud end options '/' do - headers 'Allow' => supported_collections { |c| c.collection_name }.join(',') + headers 'Allow' => driver.supported_collections { |c| c.collection_name }.join(',') end post '/' do diff --git a/server/tests/deltacloud/deltacloud_helper_test.rb b/server/tests/deltacloud/deltacloud_helper_test.rb index b7de3e6..060948b 100644 --- a/server/tests/deltacloud/deltacloud_helper_test.rb +++ b/server/tests/deltacloud/deltacloud_helper_test.rb @@ -13,14 +13,16 @@ describe Deltacloud::Helpers::Application do @helper = ApplicationHelper.new end - it 'provides list of supported collections for the current driver' do - @helper.supported_collections.wont_be_empty - @helper.supported_collections.must_include Sinatra::Rabbit::InstancesCollection - @helper.supported_collections.wont_include Sinatra::Rabbit::LoadBalancersCollection - Thread.current[:driver] = 'ec2' - @helper.supported_collections.must_include Sinatra::Rabbit::LoadBalancersCollection - Thread.current[:driver] = 'mock' - end + +#THIS TEST SHOULD BE MOVED TO server/tests/drivers/base/base_driver_test.rb ? +# it 'provides list of supported collections for the current driver' do +# @helper.supported_collections.wont_be_empty +# @helper.supported_collections.must_include Sinatra::Rabbit::InstancesCollection +# @helper.supported_collections.wont_include Sinatra::Rabbit::LoadBalancersCollection +# Thread.current[:driver] = 'ec2' +# @helper.supported_collections.must_include Sinatra::Rabbit::LoadBalancersCollection +# Thread.current[:driver] = 'mock' +# end it 'provides name for the authentication feature' do @helper.auth_feature_name.wont_be_nil diff --git a/server/views/api/show.html.haml b/server/views/api/show.html.haml index 541c388..15a3490 100644 --- a/server/views/api/show.html.haml +++ b/server/views/api/show.html.haml @@ -3,7 +3,7 @@ %div{ :'data-role' => :content, :'data-theme' => 'c'} %ul{ :'data-role' => :listview, :'data-inset' => 'true'} - - supported_collections do |c| + - @collections.each do |c| %li %a{ :href => url_for(c.collection_name), :'data-icon' => "arrow-r"}=c.collection_name.to_s.gsub('_', ' ').titlecase diff --git a/server/views/api/show.xml.haml b/server/views/api/show.xml.haml index 73e7171..c9d970e 100644 --- a/server/views/api/show.xml.haml +++ b/server/views/api/show.xml.haml @@ -1,5 +1,5 @@ %api{ :version => settings.version, :driver => driver_symbol, :provider => Thread.current[:provider] || ENV['API_PROVIDER'] } - - supported_collections do |c| + - @collections.each do |c| %link{ :rel => c.collection_name, :href => self.send(:"#{c.collection_name}_url")} - c.features.select { |f| driver.class.has_feature?(c.collection_name, f.name) }.each do |f| %feature{ :name => f.name } -- 1.7.11.4
