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 2010/12/09 17:00:36 UTC
Allow client to change driver/provider using HTTP headers (rev 2)
Sorry I forgot to include POST methods ;-)
-- Michal
Re: [PATCH core] Allow client to change driver/provider using HTTP
headers
Posted by Michal Fojtik <mf...@redhat.com>.
On 09/12/10 11:22 -0500, Toby Crawley wrote:
>Nice work. ACK, with comments below:
Thanks, I agree with all inline comments below.
Pushed to master.
-- Michal
>
>On 12/09/2010 11:00 AM, mfojtik@redhat.com wrote:
>>From: Michal Fojtik<mf...@redhat.com>
>>
>>---
>> client/lib/deltacloud.rb | 30 ++++++++++++++++++++++++------
>> server/lib/sinatra/rack_driver_select.rb | 5 +----
>> 2 files changed, 25 insertions(+), 10 deletions(-)
>>
>>diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
>>index c632594..effd9bd 100644
>>--- a/client/lib/deltacloud.rb
>>+++ b/client/lib/deltacloud.rb
>>@@ -34,8 +34,9 @@ module DeltaCloud
>> # @param [String, password] API password
>> # @param [String, user_name] API URL (eg. http://localhost:3001/api)
>> # @return [DeltaCloud::API]
>>- def self.new(user_name, password, api_url,&block)
>>- API.new(user_name, password, api_url,&block)
>>+ def self.new(user_name, password, api_url, opts={},&block)
>>+ opts ||= {}
>>+ API.new(user_name, password, api_url, opts,&block)
>> end
>>
>> # Check given credentials if their are valid against
>>@@ -62,11 +63,13 @@ module DeltaCloud
>> end
>>
>> class API
>>- attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
>>+ attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
>>+ attr_reader :api_driver, :api_provider
>>
>> def initialize(user_name, password, api_url, opts={},&block)
>> opts[:version] = true
>>- @username, @password = user_name, password
>>+ @api_driver, @api_provider = opts[:driver], opts[:provider]
>>+ @username, @password = opts[:username] || user_name, opts[:password] || password
>> @api_uri = URI.parse(api_url)
>> @features, @entry_points = {}, {}
>> @verbose = opts[:verbose] || false
>>@@ -241,6 +244,21 @@ module DeltaCloud
>> raise NoMethodError
>> end
>>
>>+ def use_driver(driver, opts={})
>>+ @api_driver = driver
>>+ @username = opts[:username]
>>+ @password = opts[:password]
>>+ @api_provider = opts[:provider] if opts[:provider]
>>+ return self
>>+ end
>>+
>
>I think it would be nice to be able to leave defaults, and just
>override some of the options. That allows for a core that you know
>just talks to ec2, and you just want to override the provider without
>having to pass the driver and username/pw each call. Maybe instead of
>the above use_driver, have instead:
>
>def use_driver(opts={})
> @api_driver = opts[:driver] if opts[:driver]
> @username = opts[:username] if opts[:username]
> @password = opts[:password] if opts[:password]
> @api_provider = opts[:provider] if opts[:provider]
> self
>end
>
>This allows for:
>
>client = DeltaCloud.new('<aki>', '<sak>', '<core url>', :driver => :ec2)
>
>client.use_driver(:provider => 'us-west')
>
>#do stuff
>
>client.use_driver(:provider => 'us-east')
>
>
>>+ def extended_headers
>>+ headers = {}
>>+ headers["X-Deltacloud-Driver"] = "#{@api_driver}" if @api_driver
>>+ headers["X-Deltacloud-Provider"] = "#{@api_provider}" if @api_provider
>
>I would just use to_s here. To me, it reads better:
> headers["X-Deltacloud-Driver"] = @api_driver.to_s if @api_driver
>
>>+ headers
>>+ end
>>+
>> # Basic request method
>> #
>> def request(*args,&block)
>>@@ -255,7 +273,7 @@ module DeltaCloud
>> end
>>
>> if conf[:method].eql?(:post)
>>- RestClient.send(:post, conf[:path], conf[:form_data], default_headers) do |response, request, block|
>>+ RestClient.send(:post, conf[:path], conf[:form_data], default_headers.merge(extended_headers)) do |response, request, block|
>> handle_backend_error(response) if response.code.eql?(500)
>> if response.respond_to?('body')
>> yield response.body if block_given?
>>@@ -264,7 +282,7 @@ module DeltaCloud
>> end
>> end
>> else
>>- RestClient.send(conf[:method], conf[:path], default_headers) do |response, request, block|
>>+ RestClient.send(conf[:method], conf[:path], default_headers.merge(extended_headers)) do |response, request, block|
>> handle_backend_error(response) if response.code.eql?(500)
>> if conf[:method].eql?(:get) and [301, 302, 307].include? response.code
>> response.follow_redirection(request) do |response, request, block|
>>diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
>>index aa213d4..f00a2c8 100644
>>--- a/server/lib/sinatra/rack_driver_select.rb
>>+++ b/server/lib/sinatra/rack_driver_select.rb
>>@@ -15,10 +15,7 @@ class RackDriverSelect
>> end
>>
>> def extract_driver(env)
>>- if env['HTTP_HEADERS']
>>- driver_name = env['HTTP_HEADERS'].match(/X\-Deltacloud\-Driver:(\w+)/i).to_a
>>- driver_name[1] ? driver_name[1].downcase : nil
>>- end
>>+ driver_name = env['HTTP_X_DELTACLOUD_DRIVER'].downcase if env['HTTP_X_DELTACLOUD_DRIVER']
>> end
>>
>> end
>
--
--------------------------------------------------------
Michal Fojtik, mfojtik@redhat.com
Deltacloud API: http://deltacloud.org
--------------------------------------------------------
Re: [PATCH core] Allow client to change driver/provider using HTTP
headers
Posted by Toby Crawley <tc...@redhat.com>.
Nice work. ACK, with comments below:
On 12/09/2010 11:00 AM, mfojtik@redhat.com wrote:
> From: Michal Fojtik<mf...@redhat.com>
>
> ---
> client/lib/deltacloud.rb | 30 ++++++++++++++++++++++++------
> server/lib/sinatra/rack_driver_select.rb | 5 +----
> 2 files changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
> index c632594..effd9bd 100644
> --- a/client/lib/deltacloud.rb
> +++ b/client/lib/deltacloud.rb
> @@ -34,8 +34,9 @@ module DeltaCloud
> # @param [String, password] API password
> # @param [String, user_name] API URL (eg. http://localhost:3001/api)
> # @return [DeltaCloud::API]
> - def self.new(user_name, password, api_url,&block)
> - API.new(user_name, password, api_url,&block)
> + def self.new(user_name, password, api_url, opts={},&block)
> + opts ||= {}
> + API.new(user_name, password, api_url, opts,&block)
> end
>
> # Check given credentials if their are valid against
> @@ -62,11 +63,13 @@ module DeltaCloud
> end
>
> class API
> - attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
> + attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
> + attr_reader :api_driver, :api_provider
>
> def initialize(user_name, password, api_url, opts={},&block)
> opts[:version] = true
> - @username, @password = user_name, password
> + @api_driver, @api_provider = opts[:driver], opts[:provider]
> + @username, @password = opts[:username] || user_name, opts[:password] || password
> @api_uri = URI.parse(api_url)
> @features, @entry_points = {}, {}
> @verbose = opts[:verbose] || false
> @@ -241,6 +244,21 @@ module DeltaCloud
> raise NoMethodError
> end
>
> + def use_driver(driver, opts={})
> + @api_driver = driver
> + @username = opts[:username]
> + @password = opts[:password]
> + @api_provider = opts[:provider] if opts[:provider]
> + return self
> + end
> +
I think it would be nice to be able to leave defaults, and just override some of the options. That allows for a core that you know just
talks to ec2, and you just want to override the provider without having to pass the driver and username/pw each call. Maybe instead of the
above use_driver, have instead:
def use_driver(opts={})
@api_driver = opts[:driver] if opts[:driver]
@username = opts[:username] if opts[:username]
@password = opts[:password] if opts[:password]
@api_provider = opts[:provider] if opts[:provider]
self
end
This allows for:
client = DeltaCloud.new('<aki>', '<sak>', '<core url>', :driver => :ec2)
client.use_driver(:provider => 'us-west')
#do stuff
client.use_driver(:provider => 'us-east')
> + def extended_headers
> + headers = {}
> + headers["X-Deltacloud-Driver"] = "#{@api_driver}" if @api_driver
> + headers["X-Deltacloud-Provider"] = "#{@api_provider}" if @api_provider
I would just use to_s here. To me, it reads better:
headers["X-Deltacloud-Driver"] = @api_driver.to_s if @api_driver
> + headers
> + end
> +
> # Basic request method
> #
> def request(*args,&block)
> @@ -255,7 +273,7 @@ module DeltaCloud
> end
>
> if conf[:method].eql?(:post)
> - RestClient.send(:post, conf[:path], conf[:form_data], default_headers) do |response, request, block|
> + RestClient.send(:post, conf[:path], conf[:form_data], default_headers.merge(extended_headers)) do |response, request, block|
> handle_backend_error(response) if response.code.eql?(500)
> if response.respond_to?('body')
> yield response.body if block_given?
> @@ -264,7 +282,7 @@ module DeltaCloud
> end
> end
> else
> - RestClient.send(conf[:method], conf[:path], default_headers) do |response, request, block|
> + RestClient.send(conf[:method], conf[:path], default_headers.merge(extended_headers)) do |response, request, block|
> handle_backend_error(response) if response.code.eql?(500)
> if conf[:method].eql?(:get) and [301, 302, 307].include? response.code
> response.follow_redirection(request) do |response, request, block|
> diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
> index aa213d4..f00a2c8 100644
> --- a/server/lib/sinatra/rack_driver_select.rb
> +++ b/server/lib/sinatra/rack_driver_select.rb
> @@ -15,10 +15,7 @@ class RackDriverSelect
> end
>
> def extract_driver(env)
> - if env['HTTP_HEADERS']
> - driver_name = env['HTTP_HEADERS'].match(/X\-Deltacloud\-Driver:(\w+)/i).to_a
> - driver_name[1] ? driver_name[1].downcase : nil
> - end
> + driver_name = env['HTTP_X_DELTACLOUD_DRIVER'].downcase if env['HTTP_X_DELTACLOUD_DRIVER']
> end
>
> end
[PATCH core] Allow client to change driver/provider using HTTP headers
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
---
client/lib/deltacloud.rb | 30 ++++++++++++++++++++++++------
server/lib/sinatra/rack_driver_select.rb | 5 +----
2 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index c632594..effd9bd 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -34,8 +34,9 @@ module DeltaCloud
# @param [String, password] API password
# @param [String, user_name] API URL (eg. http://localhost:3001/api)
# @return [DeltaCloud::API]
- def self.new(user_name, password, api_url, &block)
- API.new(user_name, password, api_url, &block)
+ def self.new(user_name, password, api_url, opts={}, &block)
+ opts ||= {}
+ API.new(user_name, password, api_url, opts, &block)
end
# Check given credentials if their are valid against
@@ -62,11 +63,13 @@ module DeltaCloud
end
class API
- attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
+ attr_reader :api_uri, :driver_name, :api_version, :features, :entry_points
+ attr_reader :api_driver, :api_provider
def initialize(user_name, password, api_url, opts={}, &block)
opts[:version] = true
- @username, @password = user_name, password
+ @api_driver, @api_provider = opts[:driver], opts[:provider]
+ @username, @password = opts[:username] || user_name, opts[:password] || password
@api_uri = URI.parse(api_url)
@features, @entry_points = {}, {}
@verbose = opts[:verbose] || false
@@ -241,6 +244,21 @@ module DeltaCloud
raise NoMethodError
end
+ def use_driver(driver, opts={})
+ @api_driver = driver
+ @username = opts[:username]
+ @password = opts[:password]
+ @api_provider = opts[:provider] if opts[:provider]
+ return self
+ end
+
+ def extended_headers
+ headers = {}
+ headers["X-Deltacloud-Driver"] = "#{@api_driver}" if @api_driver
+ headers["X-Deltacloud-Provider"] = "#{@api_provider}" if @api_provider
+ headers
+ end
+
# Basic request method
#
def request(*args, &block)
@@ -255,7 +273,7 @@ module DeltaCloud
end
if conf[:method].eql?(:post)
- RestClient.send(:post, conf[:path], conf[:form_data], default_headers) do |response, request, block|
+ RestClient.send(:post, conf[:path], conf[:form_data], default_headers.merge(extended_headers)) do |response, request, block|
handle_backend_error(response) if response.code.eql?(500)
if response.respond_to?('body')
yield response.body if block_given?
@@ -264,7 +282,7 @@ module DeltaCloud
end
end
else
- RestClient.send(conf[:method], conf[:path], default_headers) do |response, request, block|
+ RestClient.send(conf[:method], conf[:path], default_headers.merge(extended_headers)) do |response, request, block|
handle_backend_error(response) if response.code.eql?(500)
if conf[:method].eql?(:get) and [301, 302, 307].include? response.code
response.follow_redirection(request) do |response, request, block|
diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
index aa213d4..f00a2c8 100644
--- a/server/lib/sinatra/rack_driver_select.rb
+++ b/server/lib/sinatra/rack_driver_select.rb
@@ -15,10 +15,7 @@ class RackDriverSelect
end
def extract_driver(env)
- if env['HTTP_HEADERS']
- driver_name = env['HTTP_HEADERS'].match(/X\-Deltacloud\-Driver:(\w+)/i).to_a
- driver_name[1] ? driver_name[1].downcase : nil
- end
+ driver_name = env['HTTP_X_DELTACLOUD_DRIVER'].downcase if env['HTTP_X_DELTACLOUD_DRIVER']
end
end
--
1.7.3.2