On Wed, 2012-09-12 at 15:32 +0300, [email protected] wrote:
> From: marios <[email protected]>
> 
> related to https://issues.apache.org/jira/browse/DTACLOUD-316
> https://github.com/ruby-openstack/ruby-openstack/pull/13
> 
> Signed-off-by: marios <[email protected]>
> ---
>  .../deltacloud/drivers/openstack/openstack_driver.rb  | 19 
> +++++++++++++------
>  server/lib/deltacloud/server.rb                       |  6 +++++-
>  2 files changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb 
> b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> index 5b29840..ca824bd 100644
> --- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> +++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
> @@ -40,6 +40,19 @@ 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)
> +          end
> +        end

This is not a good idea - it means that something as innocuous looking
as driver.respond_to?(:buckets) has major sideeffects and fail for all
kinds of reasons.

The right fix is to change the supported_collections method in
deltacloud_helper.rb - this whol capability checking seems way too
convoluted to me, anyway. Why can't we have a
supported_collections(credentials) method in the base driver which, for
all I care, use introspection to figure out which collections are
available, and override that in the OpenStack driver ?

>          def hardware_profiles(credentials, opts = {})
>            os = new_client(credentials)
>            results = []
> @@ -351,12 +364,6 @@ private
>            end
>          end
>  
> -        def cloudfiles_client(credentials)
> -          safely do
> -            CloudFiles::Connection.new(:username => credentials.user, 
> :api_key => credentials.password)
> -          end
> -        end
> -
>  #NOTE: for the convert_from_foo methods below... openstack-compute
>  #gives Hash for 'flavors' but OpenStack::Compute::Flavor for 'flavor'
>  #hence the use of 'send' to deal with both cases and save duplication
> diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb
> index c7c6c41..4b9485e 100644
> --- a/server/lib/deltacloud/server.rb
> +++ b/server/lib/deltacloud/server.rb
> @@ -44,8 +44,12 @@ module Deltacloud
>      set :config, Deltacloud[:deltacloud]
>  
>      get '/' do
> -      if params[:force_auth]
> +      if driver.name == "openstack" or params[:force_auth]

Why is this check necessary ? The LazyCredentials helper already throws
a 401 if you try to use credentials and they are not provided.

>          return [401, 'Authentication failed'] unless 
> driver.valid_credentials?(credentials)
> +        if driver.name == "openstack"
> +          Deltacloud.config["openstack_creds"] = credentials

You can't do that - that's a global object shared across all threads.

> +          #or here also works: Thread.current["openstack_creds"] = 
> credentials

This would be better. Though even better would be a direct
supported_collections(credentials) method on the drivers.

David


Reply via email to