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/07/10 14:39:22 UTC

Fix for broken driver switching (DTACLOUD-254)

Hi,

To verify this issue you need to:

1. gem update sinatra-rabbit

(the required version of sinatra-rabbit is 1.0.7)

2. apply the patch

Then to test:

$ deltacloudd -i mock

curl -v -X GET --user 'mockuser:mockpassword' -H 'X-Deltacloud-Driver: mock' 'http://localhost:3001/api/firewalls?format=xml'

=> This should fail with 412 with Expect header set to 'firewalls'.

curl -v -X GET --user 'mockuser:mockpassword' -H 'X-Deltacloud-Driver: ec2' 'http://localhost:3001/api/firewalls?format=xml'

=> Should work (401, which is fine)

As a bonus, I added a new API call:

curl -v -X OPTIONS -H 'X-Deltacloud-Driver: ec2' 'http://localhost:3001/api'
curl -v -X OPTIONS -H 'X-Deltacloud-Driver: mock' 'http://localhost:3001/api'

=> Should return all 'supported' collections for the current driver in 'Allow'
header.

  -- Michal


Re: [PATCH core] Core: Replaced 'check_capability' method with Sinatra::Base 'set' method

Posted by "marios@redhat.com" <ma...@redhat.com>.
side note - this worked for me even with sinatra-rabbit 1.0.6... not
sure if that's expected (noticed your instructions)

On 10/07/12 15:43, marios@redhat.com wrote:
> ACK - solves issue reported in
> https://issues.apache.org/jira/browse/DTACLOUD-254
> 
> On 10/07/12 15:39, mfojtik@redhat.com wrote:
>> From: Michal Fojtik <mf...@redhat.com>
>>
>> The 'check_capability' method set a class variable in Sinatra::Rabbit
>> to a lambda that was evaluated when server was starting.
>> However this class variable was not replaced when client switched the
>> driver using HTTP headers.
>>
>> This patch will replace it with 'set' and now the lambda is evaluated
>> for every request in Sinatra::Rabbit (sinatra-rabbit 1.0.7)
>>
>> Signed-off-by: Michal fojtik <mf...@redhat.com>
>> ---
>>  server/lib/deltacloud/collections/addresses.rb         |    2 +-
>>  server/lib/deltacloud/collections/buckets.rb           |    3 ++-
>>  server/lib/deltacloud/collections/firewalls.rb         |    3 ++-
>>  server/lib/deltacloud/collections/hardware_profiles.rb |    2 +-
>>  server/lib/deltacloud/collections/images.rb            |    2 +-
>>  server/lib/deltacloud/collections/instance_states.rb   |    2 +-
>>  server/lib/deltacloud/collections/instances.rb         |    2 +-
>>  server/lib/deltacloud/collections/keys.rb              |    2 +-
>>  server/lib/deltacloud/collections/load_balancers.rb    |    3 ++-
>>  server/lib/deltacloud/collections/metrics.rb           |    3 ++-
>>  server/lib/deltacloud/collections/realms.rb            |    2 +-
>>  server/lib/deltacloud/collections/storage_snapshots.rb |    3 ++-
>>  server/lib/deltacloud/collections/storage_volumes.rb   |    2 +-
>>  server/lib/deltacloud/helpers.rb                       |    4 ----
>>  server/lib/deltacloud/server.rb                        |    4 ++++
>>  server/lib/sinatra/rack_driver_select.rb               |    4 ++--
>>  16 files changed, 24 insertions(+), 19 deletions(-)
>>
>> diff --git a/server/lib/deltacloud/collections/addresses.rb b/server/lib/deltacloud/collections/addresses.rb
>> index 95c4ae5..c43f478 100644
>> --- a/server/lib/deltacloud/collections/addresses.rb
>> +++ b/server/lib/deltacloud/collections/addresses.rb
>> @@ -16,7 +16,7 @@
>>  module Deltacloud::Collections
>>    class Addresses < Base
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>  
>>      get route_for('/addresses/:id/associate') do
>>        @address = driver.address(credentials, params )
>> diff --git a/server/lib/deltacloud/collections/buckets.rb b/server/lib/deltacloud/collections/buckets.rb
>> index 28b6d5a..77a431c 100644
>> --- a/server/lib/deltacloud/collections/buckets.rb
>> +++ b/server/lib/deltacloud/collections/buckets.rb
>> @@ -18,7 +18,8 @@ module Deltacloud::Collections
>>  
>>      include Deltacloud::Features
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>> +
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>>  
>>      new_route_for :buckets
>> diff --git a/server/lib/deltacloud/collections/firewalls.rb b/server/lib/deltacloud/collections/firewalls.rb
>> index 0a4242a..603a62e 100644
>> --- a/server/lib/deltacloud/collections/firewalls.rb
>> +++ b/server/lib/deltacloud/collections/firewalls.rb
>> @@ -16,7 +16,8 @@
>>  module Deltacloud::Collections
>>    class Firewalls < Base
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>> +
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>>  
>>      get route_for('/firewalls/:id/new_rule') do
>> diff --git a/server/lib/deltacloud/collections/hardware_profiles.rb b/server/lib/deltacloud/collections/hardware_profiles.rb
>> index 5c72aff..d5bf400 100644
>> --- a/server/lib/deltacloud/collections/hardware_profiles.rb
>> +++ b/server/lib/deltacloud/collections/hardware_profiles.rb
>> @@ -16,7 +16,7 @@
>>  module Deltacloud::Collections
>>    class HardwareProfiles < Base
>>  
>> -    check_capability :for => lambda { |m| !driver.class.send(m).empty? }
>> +    set :capability, lambda { |m| !driver.class.send(m).empty? }
>>  
>>      collection :hardware_profiles do
>>  
>> diff --git a/server/lib/deltacloud/collections/images.rb b/server/lib/deltacloud/collections/images.rb
>> index 0edd7c0..2bb836e 100644
>> --- a/server/lib/deltacloud/collections/images.rb
>> +++ b/server/lib/deltacloud/collections/images.rb
>> @@ -18,8 +18,8 @@ module Deltacloud::Collections
>>  
>>      include Deltacloud::Features
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>  
>>      new_route_for :images do
>>        @instance = Instance.new( :id => params[:instance_id] )
>> diff --git a/server/lib/deltacloud/collections/instance_states.rb b/server/lib/deltacloud/collections/instance_states.rb
>> index 6122cca..74328a8 100644
>> --- a/server/lib/deltacloud/collections/instance_states.rb
>> +++ b/server/lib/deltacloud/collections/instance_states.rb
>> @@ -16,7 +16,7 @@
>>  module Deltacloud::Collections
>>    class InstanceStates < Base
>>  
>> -    check_capability :for => lambda { |m| !driver.send(m).nil? }
>> +    set :capability, lambda { |m| !driver.send(m).nil? }
>>  
>>      collection :instance_states do
>>        operation :index, :with_capability => :instance_state_machine do
>> diff --git a/server/lib/deltacloud/collections/instances.rb b/server/lib/deltacloud/collections/instances.rb
>> index 0faea0c..742b16a 100644
>> --- a/server/lib/deltacloud/collections/instances.rb
>> +++ b/server/lib/deltacloud/collections/instances.rb
>> @@ -18,7 +18,7 @@ module Deltacloud::Collections
>>  
>>      include Deltacloud::Features
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>>  
>>      new_route_for(:instances) do
>> diff --git a/server/lib/deltacloud/collections/keys.rb b/server/lib/deltacloud/collections/keys.rb
>> index 6d0ef03..c59eb15 100644
>> --- a/server/lib/deltacloud/collections/keys.rb
>> +++ b/server/lib/deltacloud/collections/keys.rb
>> @@ -18,7 +18,7 @@ module Deltacloud::Collections
>>  
>>      include Deltacloud::Features
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>>  
>>      get route_for('/keys/new') do
>> diff --git a/server/lib/deltacloud/collections/load_balancers.rb b/server/lib/deltacloud/collections/load_balancers.rb
>> index 7d6392b..2a10311 100644
>> --- a/server/lib/deltacloud/collections/load_balancers.rb
>> +++ b/server/lib/deltacloud/collections/load_balancers.rb
>> @@ -15,7 +15,8 @@
>>  
>>  module Deltacloud::Collections
>>    class LoadBalancers < Base
>> -    check_capability :for => lambda { |m| driver.has_capability? m }
>> +
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>  
>>      new_route_for :load_balancers do
>>        @realms = driver.realms(credentials)
>> diff --git a/server/lib/deltacloud/collections/metrics.rb b/server/lib/deltacloud/collections/metrics.rb
>> index d13ba38..45b0ee5 100644
>> --- a/server/lib/deltacloud/collections/metrics.rb
>> +++ b/server/lib/deltacloud/collections/metrics.rb
>> @@ -15,7 +15,8 @@
>>  
>>  module Deltacloud::Collections
>>    class Metrics < Base
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>  
>>      collection :metrics do
>>        description 'Metrics provide monitoring for the cloud resources'
>> diff --git a/server/lib/deltacloud/collections/realms.rb b/server/lib/deltacloud/collections/realms.rb
>> index 609a1dd..619e31a 100644
>> --- a/server/lib/deltacloud/collections/realms.rb
>> +++ b/server/lib/deltacloud/collections/realms.rb
>> @@ -15,7 +15,7 @@
>>  
>>  module Deltacloud::Collections
>>    class Realms < Base
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>  
>>      collection :realms do
>>        description "Within a cloud provider a realm represents a boundary containing resources"
>> diff --git a/server/lib/deltacloud/collections/storage_snapshots.rb b/server/lib/deltacloud/collections/storage_snapshots.rb
>> index b468614..5d5ac53 100644
>> --- a/server/lib/deltacloud/collections/storage_snapshots.rb
>> +++ b/server/lib/deltacloud/collections/storage_snapshots.rb
>> @@ -15,7 +15,8 @@
>>  
>>  module Deltacloud::Collections
>>    class StorageSnapshots < Base
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>>  
>>      new_route_for(:storage_snapshots)
>> diff --git a/server/lib/deltacloud/collections/storage_volumes.rb b/server/lib/deltacloud/collections/storage_volumes.rb
>> index 9cdcd66..147c4c1 100644
>> --- a/server/lib/deltacloud/collections/storage_volumes.rb
>> +++ b/server/lib/deltacloud/collections/storage_volumes.rb
>> @@ -16,7 +16,7 @@
>>  module Deltacloud::Collections
>>    class StorageVolumes < Base
>>  
>> -    check_capability :for => lambda { |m| driver.respond_to? m }
>> +    set :capability, lambda { |m| driver.respond_to? m }
>>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>>  
>>      new_route_for(:storage_volumes)
>> diff --git a/server/lib/deltacloud/helpers.rb b/server/lib/deltacloud/helpers.rb
>> index 77d201e..0c66103 100644
>> --- a/server/lib/deltacloud/helpers.rb
>> +++ b/server/lib/deltacloud/helpers.rb
>> @@ -79,10 +79,6 @@ module Deltacloud::Collections
>>        end
>>      end
>>  
>> -    def self.check_capability(opts={})
>> -      Sinatra::Rabbit.set :check_capability, opts[:for]
>> -    end
>> -
>>      def self.check_features(opts={})
>>        Sinatra::Rabbit.set :check_features, opts[:for]
>>      end
>> diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb
>> index 9f00ca1..10af202 100644
>> --- a/server/lib/deltacloud/server.rb
>> +++ b/server/lib/deltacloud/server.rb
>> @@ -55,6 +55,10 @@ module Deltacloud
>>        end
>>      end
>>  
>> +    options Deltacloud.config[:deltacloud].root_url + '/?' do
>> +      headers 'Allow' => Deltacloud.collections.select { |c| driver.respond_to?(c.collection_name) }.map { |c| c.collection_name }.join(',')
>> +    end
>> +
>>      post Deltacloud.config[:deltacloud].root_url + '/?' do
>>        param_driver, param_provider = params["driver"], params["provider"]
>>        if param_driver
>> diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
>> index 141f399..6bba3e0 100644
>> --- a/server/lib/sinatra/rack_driver_select.rb
>> +++ b/server/lib/sinatra/rack_driver_select.rb
>> @@ -31,10 +31,10 @@ module Rack
>>        original_settings = { }
>>        req = Rack::Request.new(env)
>>        if req.params['api'] and req.params['api']['driver']
>> -	env['HTTP_X_DELTACLOUD_DRIVER'] = req.params['api']['driver']
>> +        env['HTTP_X_DELTACLOUD_DRIVER'] = req.params['api']['driver']
>>        end
>>        if req.params['api'] and req.params['api']['provider']
>> -	env['HTTP_X_DELTACLOUD_PROVIDER'] = req.params['api']['provider']
>> +        env['HTTP_X_DELTACLOUD_PROVIDER'] = req.params['api']['provider']
>>        end
>>        HEADER_TO_ENV_MAP.each do |header, name|
>>          original_settings[name] = Thread.current[name]
>>
> 
> 



Re: [PATCH core] Core: Replaced 'check_capability' method with Sinatra::Base 'set' method

Posted by "marios@redhat.com" <ma...@redhat.com>.
ACK - solves issue reported in
https://issues.apache.org/jira/browse/DTACLOUD-254

On 10/07/12 15:39, mfojtik@redhat.com wrote:
> From: Michal Fojtik <mf...@redhat.com>
> 
> The 'check_capability' method set a class variable in Sinatra::Rabbit
> to a lambda that was evaluated when server was starting.
> However this class variable was not replaced when client switched the
> driver using HTTP headers.
> 
> This patch will replace it with 'set' and now the lambda is evaluated
> for every request in Sinatra::Rabbit (sinatra-rabbit 1.0.7)
> 
> Signed-off-by: Michal fojtik <mf...@redhat.com>
> ---
>  server/lib/deltacloud/collections/addresses.rb         |    2 +-
>  server/lib/deltacloud/collections/buckets.rb           |    3 ++-
>  server/lib/deltacloud/collections/firewalls.rb         |    3 ++-
>  server/lib/deltacloud/collections/hardware_profiles.rb |    2 +-
>  server/lib/deltacloud/collections/images.rb            |    2 +-
>  server/lib/deltacloud/collections/instance_states.rb   |    2 +-
>  server/lib/deltacloud/collections/instances.rb         |    2 +-
>  server/lib/deltacloud/collections/keys.rb              |    2 +-
>  server/lib/deltacloud/collections/load_balancers.rb    |    3 ++-
>  server/lib/deltacloud/collections/metrics.rb           |    3 ++-
>  server/lib/deltacloud/collections/realms.rb            |    2 +-
>  server/lib/deltacloud/collections/storage_snapshots.rb |    3 ++-
>  server/lib/deltacloud/collections/storage_volumes.rb   |    2 +-
>  server/lib/deltacloud/helpers.rb                       |    4 ----
>  server/lib/deltacloud/server.rb                        |    4 ++++
>  server/lib/sinatra/rack_driver_select.rb               |    4 ++--
>  16 files changed, 24 insertions(+), 19 deletions(-)
> 
> diff --git a/server/lib/deltacloud/collections/addresses.rb b/server/lib/deltacloud/collections/addresses.rb
> index 95c4ae5..c43f478 100644
> --- a/server/lib/deltacloud/collections/addresses.rb
> +++ b/server/lib/deltacloud/collections/addresses.rb
> @@ -16,7 +16,7 @@
>  module Deltacloud::Collections
>    class Addresses < Base
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
>  
>      get route_for('/addresses/:id/associate') do
>        @address = driver.address(credentials, params )
> diff --git a/server/lib/deltacloud/collections/buckets.rb b/server/lib/deltacloud/collections/buckets.rb
> index 28b6d5a..77a431c 100644
> --- a/server/lib/deltacloud/collections/buckets.rb
> +++ b/server/lib/deltacloud/collections/buckets.rb
> @@ -18,7 +18,8 @@ module Deltacloud::Collections
>  
>      include Deltacloud::Features
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
> +
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>  
>      new_route_for :buckets
> diff --git a/server/lib/deltacloud/collections/firewalls.rb b/server/lib/deltacloud/collections/firewalls.rb
> index 0a4242a..603a62e 100644
> --- a/server/lib/deltacloud/collections/firewalls.rb
> +++ b/server/lib/deltacloud/collections/firewalls.rb
> @@ -16,7 +16,8 @@
>  module Deltacloud::Collections
>    class Firewalls < Base
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
> +
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>  
>      get route_for('/firewalls/:id/new_rule') do
> diff --git a/server/lib/deltacloud/collections/hardware_profiles.rb b/server/lib/deltacloud/collections/hardware_profiles.rb
> index 5c72aff..d5bf400 100644
> --- a/server/lib/deltacloud/collections/hardware_profiles.rb
> +++ b/server/lib/deltacloud/collections/hardware_profiles.rb
> @@ -16,7 +16,7 @@
>  module Deltacloud::Collections
>    class HardwareProfiles < Base
>  
> -    check_capability :for => lambda { |m| !driver.class.send(m).empty? }
> +    set :capability, lambda { |m| !driver.class.send(m).empty? }
>  
>      collection :hardware_profiles do
>  
> diff --git a/server/lib/deltacloud/collections/images.rb b/server/lib/deltacloud/collections/images.rb
> index 0edd7c0..2bb836e 100644
> --- a/server/lib/deltacloud/collections/images.rb
> +++ b/server/lib/deltacloud/collections/images.rb
> @@ -18,8 +18,8 @@ module Deltacloud::Collections
>  
>      include Deltacloud::Features
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
> +    set :capability, lambda { |m| driver.respond_to? m }
>  
>      new_route_for :images do
>        @instance = Instance.new( :id => params[:instance_id] )
> diff --git a/server/lib/deltacloud/collections/instance_states.rb b/server/lib/deltacloud/collections/instance_states.rb
> index 6122cca..74328a8 100644
> --- a/server/lib/deltacloud/collections/instance_states.rb
> +++ b/server/lib/deltacloud/collections/instance_states.rb
> @@ -16,7 +16,7 @@
>  module Deltacloud::Collections
>    class InstanceStates < Base
>  
> -    check_capability :for => lambda { |m| !driver.send(m).nil? }
> +    set :capability, lambda { |m| !driver.send(m).nil? }
>  
>      collection :instance_states do
>        operation :index, :with_capability => :instance_state_machine do
> diff --git a/server/lib/deltacloud/collections/instances.rb b/server/lib/deltacloud/collections/instances.rb
> index 0faea0c..742b16a 100644
> --- a/server/lib/deltacloud/collections/instances.rb
> +++ b/server/lib/deltacloud/collections/instances.rb
> @@ -18,7 +18,7 @@ module Deltacloud::Collections
>  
>      include Deltacloud::Features
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>  
>      new_route_for(:instances) do
> diff --git a/server/lib/deltacloud/collections/keys.rb b/server/lib/deltacloud/collections/keys.rb
> index 6d0ef03..c59eb15 100644
> --- a/server/lib/deltacloud/collections/keys.rb
> +++ b/server/lib/deltacloud/collections/keys.rb
> @@ -18,7 +18,7 @@ module Deltacloud::Collections
>  
>      include Deltacloud::Features
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>  
>      get route_for('/keys/new') do
> diff --git a/server/lib/deltacloud/collections/load_balancers.rb b/server/lib/deltacloud/collections/load_balancers.rb
> index 7d6392b..2a10311 100644
> --- a/server/lib/deltacloud/collections/load_balancers.rb
> +++ b/server/lib/deltacloud/collections/load_balancers.rb
> @@ -15,7 +15,8 @@
>  
>  module Deltacloud::Collections
>    class LoadBalancers < Base
> -    check_capability :for => lambda { |m| driver.has_capability? m }
> +
> +    set :capability, lambda { |m| driver.respond_to? m }
>  
>      new_route_for :load_balancers do
>        @realms = driver.realms(credentials)
> diff --git a/server/lib/deltacloud/collections/metrics.rb b/server/lib/deltacloud/collections/metrics.rb
> index d13ba38..45b0ee5 100644
> --- a/server/lib/deltacloud/collections/metrics.rb
> +++ b/server/lib/deltacloud/collections/metrics.rb
> @@ -15,7 +15,8 @@
>  
>  module Deltacloud::Collections
>    class Metrics < Base
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +
> +    set :capability, lambda { |m| driver.respond_to? m }
>  
>      collection :metrics do
>        description 'Metrics provide monitoring for the cloud resources'
> diff --git a/server/lib/deltacloud/collections/realms.rb b/server/lib/deltacloud/collections/realms.rb
> index 609a1dd..619e31a 100644
> --- a/server/lib/deltacloud/collections/realms.rb
> +++ b/server/lib/deltacloud/collections/realms.rb
> @@ -15,7 +15,7 @@
>  
>  module Deltacloud::Collections
>    class Realms < Base
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
>  
>      collection :realms do
>        description "Within a cloud provider a realm represents a boundary containing resources"
> diff --git a/server/lib/deltacloud/collections/storage_snapshots.rb b/server/lib/deltacloud/collections/storage_snapshots.rb
> index b468614..5d5ac53 100644
> --- a/server/lib/deltacloud/collections/storage_snapshots.rb
> +++ b/server/lib/deltacloud/collections/storage_snapshots.rb
> @@ -15,7 +15,8 @@
>  
>  module Deltacloud::Collections
>    class StorageSnapshots < Base
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +
> +    set :capability, lambda { |m| driver.respond_to? m }
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>  
>      new_route_for(:storage_snapshots)
> diff --git a/server/lib/deltacloud/collections/storage_volumes.rb b/server/lib/deltacloud/collections/storage_volumes.rb
> index 9cdcd66..147c4c1 100644
> --- a/server/lib/deltacloud/collections/storage_volumes.rb
> +++ b/server/lib/deltacloud/collections/storage_volumes.rb
> @@ -16,7 +16,7 @@
>  module Deltacloud::Collections
>    class StorageVolumes < Base
>  
> -    check_capability :for => lambda { |m| driver.respond_to? m }
> +    set :capability, lambda { |m| driver.respond_to? m }
>      check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
>  
>      new_route_for(:storage_volumes)
> diff --git a/server/lib/deltacloud/helpers.rb b/server/lib/deltacloud/helpers.rb
> index 77d201e..0c66103 100644
> --- a/server/lib/deltacloud/helpers.rb
> +++ b/server/lib/deltacloud/helpers.rb
> @@ -79,10 +79,6 @@ module Deltacloud::Collections
>        end
>      end
>  
> -    def self.check_capability(opts={})
> -      Sinatra::Rabbit.set :check_capability, opts[:for]
> -    end
> -
>      def self.check_features(opts={})
>        Sinatra::Rabbit.set :check_features, opts[:for]
>      end
> diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb
> index 9f00ca1..10af202 100644
> --- a/server/lib/deltacloud/server.rb
> +++ b/server/lib/deltacloud/server.rb
> @@ -55,6 +55,10 @@ module Deltacloud
>        end
>      end
>  
> +    options Deltacloud.config[:deltacloud].root_url + '/?' do
> +      headers 'Allow' => Deltacloud.collections.select { |c| driver.respond_to?(c.collection_name) }.map { |c| c.collection_name }.join(',')
> +    end
> +
>      post Deltacloud.config[:deltacloud].root_url + '/?' do
>        param_driver, param_provider = params["driver"], params["provider"]
>        if param_driver
> diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
> index 141f399..6bba3e0 100644
> --- a/server/lib/sinatra/rack_driver_select.rb
> +++ b/server/lib/sinatra/rack_driver_select.rb
> @@ -31,10 +31,10 @@ module Rack
>        original_settings = { }
>        req = Rack::Request.new(env)
>        if req.params['api'] and req.params['api']['driver']
> -	env['HTTP_X_DELTACLOUD_DRIVER'] = req.params['api']['driver']
> +        env['HTTP_X_DELTACLOUD_DRIVER'] = req.params['api']['driver']
>        end
>        if req.params['api'] and req.params['api']['provider']
> -	env['HTTP_X_DELTACLOUD_PROVIDER'] = req.params['api']['provider']
> +        env['HTTP_X_DELTACLOUD_PROVIDER'] = req.params['api']['provider']
>        end
>        HEADER_TO_ENV_MAP.each do |header, name|
>          original_settings[name] = Thread.current[name]
> 



[PATCH core] Core: Replaced 'check_capability' method with Sinatra::Base 'set' method

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

The 'check_capability' method set a class variable in Sinatra::Rabbit
to a lambda that was evaluated when server was starting.
However this class variable was not replaced when client switched the
driver using HTTP headers.

This patch will replace it with 'set' and now the lambda is evaluated
for every request in Sinatra::Rabbit (sinatra-rabbit 1.0.7)

Signed-off-by: Michal fojtik <mf...@redhat.com>
---
 server/lib/deltacloud/collections/addresses.rb         |    2 +-
 server/lib/deltacloud/collections/buckets.rb           |    3 ++-
 server/lib/deltacloud/collections/firewalls.rb         |    3 ++-
 server/lib/deltacloud/collections/hardware_profiles.rb |    2 +-
 server/lib/deltacloud/collections/images.rb            |    2 +-
 server/lib/deltacloud/collections/instance_states.rb   |    2 +-
 server/lib/deltacloud/collections/instances.rb         |    2 +-
 server/lib/deltacloud/collections/keys.rb              |    2 +-
 server/lib/deltacloud/collections/load_balancers.rb    |    3 ++-
 server/lib/deltacloud/collections/metrics.rb           |    3 ++-
 server/lib/deltacloud/collections/realms.rb            |    2 +-
 server/lib/deltacloud/collections/storage_snapshots.rb |    3 ++-
 server/lib/deltacloud/collections/storage_volumes.rb   |    2 +-
 server/lib/deltacloud/helpers.rb                       |    4 ----
 server/lib/deltacloud/server.rb                        |    4 ++++
 server/lib/sinatra/rack_driver_select.rb               |    4 ++--
 16 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/server/lib/deltacloud/collections/addresses.rb b/server/lib/deltacloud/collections/addresses.rb
index 95c4ae5..c43f478 100644
--- a/server/lib/deltacloud/collections/addresses.rb
+++ b/server/lib/deltacloud/collections/addresses.rb
@@ -16,7 +16,7 @@
 module Deltacloud::Collections
   class Addresses < Base
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
 
     get route_for('/addresses/:id/associate') do
       @address = driver.address(credentials, params )
diff --git a/server/lib/deltacloud/collections/buckets.rb b/server/lib/deltacloud/collections/buckets.rb
index 28b6d5a..77a431c 100644
--- a/server/lib/deltacloud/collections/buckets.rb
+++ b/server/lib/deltacloud/collections/buckets.rb
@@ -18,7 +18,8 @@ module Deltacloud::Collections
 
     include Deltacloud::Features
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
+
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
 
     new_route_for :buckets
diff --git a/server/lib/deltacloud/collections/firewalls.rb b/server/lib/deltacloud/collections/firewalls.rb
index 0a4242a..603a62e 100644
--- a/server/lib/deltacloud/collections/firewalls.rb
+++ b/server/lib/deltacloud/collections/firewalls.rb
@@ -16,7 +16,8 @@
 module Deltacloud::Collections
   class Firewalls < Base
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
+
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
 
     get route_for('/firewalls/:id/new_rule') do
diff --git a/server/lib/deltacloud/collections/hardware_profiles.rb b/server/lib/deltacloud/collections/hardware_profiles.rb
index 5c72aff..d5bf400 100644
--- a/server/lib/deltacloud/collections/hardware_profiles.rb
+++ b/server/lib/deltacloud/collections/hardware_profiles.rb
@@ -16,7 +16,7 @@
 module Deltacloud::Collections
   class HardwareProfiles < Base
 
-    check_capability :for => lambda { |m| !driver.class.send(m).empty? }
+    set :capability, lambda { |m| !driver.class.send(m).empty? }
 
     collection :hardware_profiles do
 
diff --git a/server/lib/deltacloud/collections/images.rb b/server/lib/deltacloud/collections/images.rb
index 0edd7c0..2bb836e 100644
--- a/server/lib/deltacloud/collections/images.rb
+++ b/server/lib/deltacloud/collections/images.rb
@@ -18,8 +18,8 @@ module Deltacloud::Collections
 
     include Deltacloud::Features
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
+    set :capability, lambda { |m| driver.respond_to? m }
 
     new_route_for :images do
       @instance = Instance.new( :id => params[:instance_id] )
diff --git a/server/lib/deltacloud/collections/instance_states.rb b/server/lib/deltacloud/collections/instance_states.rb
index 6122cca..74328a8 100644
--- a/server/lib/deltacloud/collections/instance_states.rb
+++ b/server/lib/deltacloud/collections/instance_states.rb
@@ -16,7 +16,7 @@
 module Deltacloud::Collections
   class InstanceStates < Base
 
-    check_capability :for => lambda { |m| !driver.send(m).nil? }
+    set :capability, lambda { |m| !driver.send(m).nil? }
 
     collection :instance_states do
       operation :index, :with_capability => :instance_state_machine do
diff --git a/server/lib/deltacloud/collections/instances.rb b/server/lib/deltacloud/collections/instances.rb
index 0faea0c..742b16a 100644
--- a/server/lib/deltacloud/collections/instances.rb
+++ b/server/lib/deltacloud/collections/instances.rb
@@ -18,7 +18,7 @@ module Deltacloud::Collections
 
     include Deltacloud::Features
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
 
     new_route_for(:instances) do
diff --git a/server/lib/deltacloud/collections/keys.rb b/server/lib/deltacloud/collections/keys.rb
index 6d0ef03..c59eb15 100644
--- a/server/lib/deltacloud/collections/keys.rb
+++ b/server/lib/deltacloud/collections/keys.rb
@@ -18,7 +18,7 @@ module Deltacloud::Collections
 
     include Deltacloud::Features
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
 
     get route_for('/keys/new') do
diff --git a/server/lib/deltacloud/collections/load_balancers.rb b/server/lib/deltacloud/collections/load_balancers.rb
index 7d6392b..2a10311 100644
--- a/server/lib/deltacloud/collections/load_balancers.rb
+++ b/server/lib/deltacloud/collections/load_balancers.rb
@@ -15,7 +15,8 @@
 
 module Deltacloud::Collections
   class LoadBalancers < Base
-    check_capability :for => lambda { |m| driver.has_capability? m }
+
+    set :capability, lambda { |m| driver.respond_to? m }
 
     new_route_for :load_balancers do
       @realms = driver.realms(credentials)
diff --git a/server/lib/deltacloud/collections/metrics.rb b/server/lib/deltacloud/collections/metrics.rb
index d13ba38..45b0ee5 100644
--- a/server/lib/deltacloud/collections/metrics.rb
+++ b/server/lib/deltacloud/collections/metrics.rb
@@ -15,7 +15,8 @@
 
 module Deltacloud::Collections
   class Metrics < Base
-    check_capability :for => lambda { |m| driver.respond_to? m }
+
+    set :capability, lambda { |m| driver.respond_to? m }
 
     collection :metrics do
       description 'Metrics provide monitoring for the cloud resources'
diff --git a/server/lib/deltacloud/collections/realms.rb b/server/lib/deltacloud/collections/realms.rb
index 609a1dd..619e31a 100644
--- a/server/lib/deltacloud/collections/realms.rb
+++ b/server/lib/deltacloud/collections/realms.rb
@@ -15,7 +15,7 @@
 
 module Deltacloud::Collections
   class Realms < Base
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
 
     collection :realms do
       description "Within a cloud provider a realm represents a boundary containing resources"
diff --git a/server/lib/deltacloud/collections/storage_snapshots.rb b/server/lib/deltacloud/collections/storage_snapshots.rb
index b468614..5d5ac53 100644
--- a/server/lib/deltacloud/collections/storage_snapshots.rb
+++ b/server/lib/deltacloud/collections/storage_snapshots.rb
@@ -15,7 +15,8 @@
 
 module Deltacloud::Collections
   class StorageSnapshots < Base
-    check_capability :for => lambda { |m| driver.respond_to? m }
+
+    set :capability, lambda { |m| driver.respond_to? m }
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
 
     new_route_for(:storage_snapshots)
diff --git a/server/lib/deltacloud/collections/storage_volumes.rb b/server/lib/deltacloud/collections/storage_volumes.rb
index 9cdcd66..147c4c1 100644
--- a/server/lib/deltacloud/collections/storage_volumes.rb
+++ b/server/lib/deltacloud/collections/storage_volumes.rb
@@ -16,7 +16,7 @@
 module Deltacloud::Collections
   class StorageVolumes < Base
 
-    check_capability :for => lambda { |m| driver.respond_to? m }
+    set :capability, lambda { |m| driver.respond_to? m }
     check_features :for => lambda { |c, f| driver.class.has_feature?(c, f) }
 
     new_route_for(:storage_volumes)
diff --git a/server/lib/deltacloud/helpers.rb b/server/lib/deltacloud/helpers.rb
index 77d201e..0c66103 100644
--- a/server/lib/deltacloud/helpers.rb
+++ b/server/lib/deltacloud/helpers.rb
@@ -79,10 +79,6 @@ module Deltacloud::Collections
       end
     end
 
-    def self.check_capability(opts={})
-      Sinatra::Rabbit.set :check_capability, opts[:for]
-    end
-
     def self.check_features(opts={})
       Sinatra::Rabbit.set :check_features, opts[:for]
     end
diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb
index 9f00ca1..10af202 100644
--- a/server/lib/deltacloud/server.rb
+++ b/server/lib/deltacloud/server.rb
@@ -55,6 +55,10 @@ module Deltacloud
       end
     end
 
+    options Deltacloud.config[:deltacloud].root_url + '/?' do
+      headers 'Allow' => Deltacloud.collections.select { |c| driver.respond_to?(c.collection_name) }.map { |c| c.collection_name }.join(',')
+    end
+
     post Deltacloud.config[:deltacloud].root_url + '/?' do
       param_driver, param_provider = params["driver"], params["provider"]
       if param_driver
diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
index 141f399..6bba3e0 100644
--- a/server/lib/sinatra/rack_driver_select.rb
+++ b/server/lib/sinatra/rack_driver_select.rb
@@ -31,10 +31,10 @@ module Rack
       original_settings = { }
       req = Rack::Request.new(env)
       if req.params['api'] and req.params['api']['driver']
-	env['HTTP_X_DELTACLOUD_DRIVER'] = req.params['api']['driver']
+        env['HTTP_X_DELTACLOUD_DRIVER'] = req.params['api']['driver']
       end
       if req.params['api'] and req.params['api']['provider']
-	env['HTTP_X_DELTACLOUD_PROVIDER'] = req.params['api']['provider']
+        env['HTTP_X_DELTACLOUD_PROVIDER'] = req.params['api']['provider']
       end
       HEADER_TO_ENV_MAP.each do |header, name|
         original_settings[name] = Thread.current[name]
-- 
1.7.10.2


Re: Fix for broken driver switching (DTACLOUD-254)

Posted by David Lutterkort <lu...@redhat.com>.
On Tue, 2012-07-10 at 14:39 +0200, mfojtik@redhat.com wrote:
> As a bonus, I added a new API call:
> 
> curl -v -X OPTIONS -H 'X-Deltacloud-Driver: ec2' 'http://localhost:3001/api'
> curl -v -X OPTIONS -H 'X-Deltacloud-Driver: mock' 'http://localhost:3001/api'
> 
> => Should return all 'supported' collections for the current driver in 'Allow'
> header.

Why do we need that when a simple GET to the same URL will return the
same information ?

David