ACK - solves issue reported in https://issues.apache.org/jira/browse/DTACLOUD-254
On 10/07/12 15:39, mfoj...@redhat.com wrote: > From: Michal Fojtik <mfoj...@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 <mfoj...@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] >