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/06/07 13:19:41 UTC
Multiple frontend support for Deltacloud (rev 3)
Hi,
This patchset include fixes for 'root_url' overide problem with Rabbit based
frontends (CIMI, DC) and also fix all tests to use the new multi-frontend
configuration.
-- Michal
[PATCH core 4/4] Core: Tests fixed to use new Deltacloud multifrontend syntax
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/tests/drivers/ec2/drivers_test.rb | 2 +-
server/tests/drivers/ec2/hardware_profiles_test.rb | 2 +-
server/tests/drivers/ec2/images_test.rb | 2 +-
server/tests/drivers/ec2/instances_test.rb | 2 +-
server/tests/drivers/ec2/keys_test.rb | 2 +-
server/tests/drivers/ec2/realms_test.rb | 2 +-
server/tests/drivers/mock/buckets_test.rb | 2 +-
server/tests/drivers/mock/drivers_test.rb | 2 +-
.../tests/drivers/mock/hardware_profiles_test.rb | 2 +-
server/tests/drivers/mock/images_test.rb | 2 +-
server/tests/drivers/mock/instances_test.rb | 2 +-
server/tests/drivers/mock/keys_test.rb | 2 +-
server/tests/drivers/mock/realms_test.rb | 2 +-
.../tests/drivers/mock/storage_snapshots_test.rb | 2 +-
server/tests/drivers/mock/storage_volumes_test.rb | 2 +-
server/tests/minitest_common.rb | 14 +++++-
server/tests/minitest_common_api_test.rb | 48 ++++++++++----------
tests/mock/support/env.rb | 4 +-
18 files changed, 54 insertions(+), 42 deletions(-)
diff --git a/server/tests/drivers/ec2/drivers_test.rb b/server/tests/drivers/ec2/drivers_test.rb
index 4521ca3..dc702c0 100644
--- a/server/tests/drivers/ec2/drivers_test.rb
+++ b/server/tests/drivers/ec2/drivers_test.rb
@@ -13,7 +13,7 @@ describe 'Deltacloud API drivers' do
end
it 'must advertise have the drivers collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=drivers]').wont_be_empty
end
diff --git a/server/tests/drivers/ec2/hardware_profiles_test.rb b/server/tests/drivers/ec2/hardware_profiles_test.rb
index 1ec1664..23d2876 100644
--- a/server/tests/drivers/ec2/hardware_profiles_test.rb
+++ b/server/tests/drivers/ec2/hardware_profiles_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API Hardware Profiles' do
include Deltacloud::Test
it 'must advertise have the hardware_profiles collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=hardware_profiles]').wont_be_empty
end
diff --git a/server/tests/drivers/ec2/images_test.rb b/server/tests/drivers/ec2/images_test.rb
index 2529a01..18652a2 100644
--- a/server/tests/drivers/ec2/images_test.rb
+++ b/server/tests/drivers/ec2/images_test.rb
@@ -14,7 +14,7 @@ describe 'Deltacloud API Images' do
include Deltacloud::Test
it 'must advertise have the images collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=images]').wont_be_empty
end
diff --git a/server/tests/drivers/ec2/instances_test.rb b/server/tests/drivers/ec2/instances_test.rb
index c28fde6..8f91d5f 100644
--- a/server/tests/drivers/ec2/instances_test.rb
+++ b/server/tests/drivers/ec2/instances_test.rb
@@ -14,7 +14,7 @@ describe 'Deltacloud API instances' do
end
it 'must advertise have the instances collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=instances]').wont_be_empty
end
diff --git a/server/tests/drivers/ec2/keys_test.rb b/server/tests/drivers/ec2/keys_test.rb
index efcdcc5..b499b0c 100644
--- a/server/tests/drivers/ec2/keys_test.rb
+++ b/server/tests/drivers/ec2/keys_test.rb
@@ -15,7 +15,7 @@ describe 'Deltacloud API Keys' do
include Deltacloud::Test
it 'must advertise have the keys collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=keys]').wont_be_empty
end
diff --git a/server/tests/drivers/ec2/realms_test.rb b/server/tests/drivers/ec2/realms_test.rb
index 9df854b..a43e0aa 100644
--- a/server/tests/drivers/ec2/realms_test.rb
+++ b/server/tests/drivers/ec2/realms_test.rb
@@ -14,7 +14,7 @@ describe 'Deltacloud API Realms' do
include Deltacloud::Test
it 'must advertise have the realms collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=realms]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/buckets_test.rb b/server/tests/drivers/mock/buckets_test.rb
index b10c5bd..97ef445 100644
--- a/server/tests/drivers/mock/buckets_test.rb
+++ b/server/tests/drivers/mock/buckets_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API buckets' do
include Deltacloud::Test
it 'must advertise have the buckets collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=buckets]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/drivers_test.rb b/server/tests/drivers/mock/drivers_test.rb
index 537c341..e110446 100644
--- a/server/tests/drivers/mock/drivers_test.rb
+++ b/server/tests/drivers/mock/drivers_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API drivers' do
include Deltacloud::Test
it 'must advertise have the drivers collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=drivers]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/hardware_profiles_test.rb b/server/tests/drivers/mock/hardware_profiles_test.rb
index 91c7c34..b21f0af 100644
--- a/server/tests/drivers/mock/hardware_profiles_test.rb
+++ b/server/tests/drivers/mock/hardware_profiles_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API Hardware Profiles' do
include Deltacloud::Test
it 'must advertise have the hardware_profiles collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=hardware_profiles]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/images_test.rb b/server/tests/drivers/mock/images_test.rb
index df866a0..50e653c 100644
--- a/server/tests/drivers/mock/images_test.rb
+++ b/server/tests/drivers/mock/images_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API Images' do
include Deltacloud::Test
it 'must advertise have the images collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=images]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/instances_test.rb b/server/tests/drivers/mock/instances_test.rb
index f7c8550..d30fb3f 100644
--- a/server/tests/drivers/mock/instances_test.rb
+++ b/server/tests/drivers/mock/instances_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API instances' do
include Deltacloud::Test
it 'must advertise have the instances collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=instances]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/keys_test.rb b/server/tests/drivers/mock/keys_test.rb
index ef358a5..ed7354f 100644
--- a/server/tests/drivers/mock/keys_test.rb
+++ b/server/tests/drivers/mock/keys_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API Keys' do
include Deltacloud::Test
it 'must advertise have the keys collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=keys]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/realms_test.rb b/server/tests/drivers/mock/realms_test.rb
index fe6094e..0c254dd 100644
--- a/server/tests/drivers/mock/realms_test.rb
+++ b/server/tests/drivers/mock/realms_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API Realms' do
include Deltacloud::Test
it 'must advertise have the realms collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=realms]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/storage_snapshots_test.rb b/server/tests/drivers/mock/storage_snapshots_test.rb
index 8676d14..957e500 100644
--- a/server/tests/drivers/mock/storage_snapshots_test.rb
+++ b/server/tests/drivers/mock/storage_snapshots_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API storage_snapshots' do
include Deltacloud::Test
it 'must advertise have the storage_snapshots collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=storage_snapshots]').wont_be_empty
end
diff --git a/server/tests/drivers/mock/storage_volumes_test.rb b/server/tests/drivers/mock/storage_volumes_test.rb
index 62c9159..98682ad 100644
--- a/server/tests/drivers/mock/storage_volumes_test.rb
+++ b/server/tests/drivers/mock/storage_volumes_test.rb
@@ -5,7 +5,7 @@ describe 'Deltacloud API storage_volumes' do
include Deltacloud::Test
it 'must advertise have the storage_volumes collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link[@rel=storage_volumes]').wont_be_empty
end
diff --git a/server/tests/minitest_common.rb b/server/tests/minitest_common.rb
index 0fbfe9b..7fc0824 100644
--- a/server/tests/minitest_common.rb
+++ b/server/tests/minitest_common.rb
@@ -4,7 +4,9 @@ Deltacloud::configure do |server|
server.root_url '/api'
server.version '0.5.0'
server.klass 'Deltacloud::API'
-end.require_frontend!
+end
+
+Deltacloud.require_frontend!(:deltacloud)
require 'minitest/autorun'
require 'rack/test'
@@ -28,12 +30,20 @@ module Deltacloud
Nokogiri::XML(last_response.body)
end
+ def root_url
+ Deltacloud[:deltacloud].root_url
+ end
+
+ def api_version
+ Deltacloud[:deltacloud].version
+ end
+
def authenticate
authorize ENV['TESTS_API_USERNAME'], ENV['TESTS_API_PASSWORD']
end
def collection_url(collection)
- [Deltacloud[:root_url], collection.to_s].join('/')
+ [root_url, collection.to_s].join('/')
end
def app
diff --git a/server/tests/minitest_common_api_test.rb b/server/tests/minitest_common_api_test.rb
index 21d18f7..fb2591b 100644
--- a/server/tests/minitest_common_api_test.rb
+++ b/server/tests/minitest_common_api_test.rb
@@ -2,37 +2,37 @@
#used across all drivers. See /drivers/*/api_test.rb
it 'return HTTP_OK when accessing API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
last_response.status.must_equal 200
end
it 'advertise the current driver in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
xml_response.root[:driver].must_equal ENV['API_DRIVER']
end
it 'advertise the current API version in API entrypoint' do
- get Deltacloud[:root_url]
- xml_response.root[:version].must_equal Deltacloud[:version]
+ get root_url
+ xml_response.root[:version].must_equal api_version
end
it 'advertise the current API version in HTTP headers' do
- get Deltacloud[:root_url]
- last_response.headers['Server'].must_equal "Apache-Deltacloud/#{Deltacloud[:version]}"
+ get root_url
+ last_response.headers['Server'].must_equal "Apache-Deltacloud/#{api_version}"
end
it 'must include the ETag in HTTP headers' do
- get Deltacloud[:root_url]
+ get root_url
last_response.headers['ETag'].wont_be_nil
end
it 'advertise collections in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link').wont_be_empty
end
it 'include the :href and :rel attribute for each collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link').each do |collection|
collection[:href].wont_be_nil
collection[:rel].wont_be_nil
@@ -40,19 +40,19 @@
end
it 'uses the absolute URI in the :href attribute for each collection in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link').each do |collection|
collection[:href].must_match /^http/
end
end
it 'advertise features for some collections in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link/feature').wont_be_empty
end
it 'advertise the name of the feature for some collections in API entrypoint' do
- get Deltacloud[:root_url]
+ get root_url
(xml_response/'api/link/feature').each do |f|
f[:name].wont_be_nil
end
@@ -60,55 +60,55 @@
it 'must change the media type from XML to JSON using Accept headers' do
header 'Accept', 'application/json'
- get Deltacloud[:root_url]
+ get root_url
last_response.headers['Content-Type'].must_equal 'application/json'
end
it 'must change the media type to JSON using the "?format" parameter in URL' do
- get Deltacloud[:root_url], { :format => 'json' }
+ get root_url, { :format => 'json' }
last_response.headers['Content-Type'].must_equal 'application/json'
end
it 'must change the driver when using X-Deltacloud-Driver HTTP header' do
header 'X-Deltacloud-Driver', 'ec2'
- get Deltacloud[:root_url]
+ get root_url
xml_response.root[:driver].must_equal 'ec2'
header 'X-Deltacloud-Driver', 'mock'
- get Deltacloud[:root_url]
+ get root_url
xml_response.root[:driver].must_equal 'mock'
end
it 'must change the features when driver is swapped using HTTP headers' do
header 'X-Deltacloud-Driver', 'ec2'
- get Deltacloud[:root_url]
+ get root_url
# The 'user_name' feature is not supported currently for the EC2 driver
(xml_response/'api/link/feature').map { |f| f[:name] }.wont_include 'user_name'
header 'X-Deltacloud-Driver', 'mock'
- get Deltacloud[:root_url]
+ get root_url
# But it's supported in Mock driver
(xml_response/'api/link/feature').map { |f| f[:name] }.must_include 'user_name'
end
it 'must re-validate the driver credentials when using "?force_auth" parameter in URL' do
- get Deltacloud[:root_url], { :force_auth => '1' }
+ get root_url, { :force_auth => '1' }
last_response.status.must_equal 401
authenticate
- get Deltacloud[:root_url], { :force_auth => '1' }
+ get root_url, { :force_auth => '1' }
last_response.status.must_equal 200
end
it 'must change the API PROVIDER using the /api;provider matrix parameter in URI' do
- get Deltacloud[:root_url] + ';provider=test1'
+ get root_url + ';provider=test1'
xml_response.root[:provider].wont_be_nil
xml_response.root[:provider].must_equal 'test1'
- get Deltacloud[:root_url] + ';provider=test2'
+ get root_url + ';provider=test2'
xml_response.root[:provider].must_equal 'test2'
end
it 'must change the API DRIVER using the /api;driver matrix parameter in URI' do
- get Deltacloud[:root_url] + ';driver=ec2'
+ get root_url + ';driver=ec2'
xml_response.root[:driver].must_equal 'ec2'
- get Deltacloud[:root_url] + ';driver=mock'
+ get root_url + ';driver=mock'
xml_response.root[:driver].must_equal 'mock'
end
diff --git a/tests/mock/support/env.rb b/tests/mock/support/env.rb
index 8b2581f..9365498 100644
--- a/tests/mock/support/env.rb
+++ b/tests/mock/support/env.rb
@@ -7,7 +7,9 @@ Deltacloud::configure do |server|
server.root_url '/api'
server.version '0.5.0'
server.klass 'Deltacloud::API'
-end.require_frontend!
+end
+
+Deltacloud.require_frontend!(:deltacloud)
CONFIG = {
:username => 'mockuser',
--
1.7.10.2
[PATCH core 3/4] Core: Prevent 'root_url' overriding by different frontends when they use Rabbit
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/lib/cimi/collections/cloud_entry_point.rb | 4 +---
server/lib/cimi/helpers.rb | 10 +++++++---
server/lib/deltacloud/helpers.rb | 4 ++++
server/lib/deltacloud/helpers/deltacloud_helper.rb | 8 --------
4 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/server/lib/cimi/collections/cloud_entry_point.rb b/server/lib/cimi/collections/cloud_entry_point.rb
index f5f2233..5aa2630 100644
--- a/server/lib/cimi/collections/cloud_entry_point.rb
+++ b/server/lib/cimi/collections/cloud_entry_point.rb
@@ -16,9 +16,7 @@
module CIMI::Collections
class CloudEntryPoint < Base
- check_capability :for => lambda { |m| driver.respond_to? m }
-
- collection :cloudEntryPoint do
+ collection :cloudEntryPoint do
description 'Cloud entry point'
operation :index do
description "list all resources of the cloud"
diff --git a/server/lib/cimi/helpers.rb b/server/lib/cimi/helpers.rb
index 1b91423..b645fbb 100644
--- a/server/lib/cimi/helpers.rb
+++ b/server/lib/cimi/helpers.rb
@@ -37,13 +37,13 @@ require_relative '../deltacloud/helpers/auth_helper'
require_relative '../deltacloud/helpers/url_helper'
require_relative '../deltacloud/helpers/deltacloud_helper'
require_relative '../deltacloud/helpers/rabbit_helper'
-require_relative '../deltacloud/helpers/rabbit_helper'
require_relative './helpers/cimi_helper'
require_relative './models'
module CIMI::Collections
class Base < Sinatra::Base
+ include Sinatra::Rabbit
extend Deltacloud::Helpers::Drivers
include Sinatra::Rabbit::Features
include CIMI::Model
@@ -62,12 +62,16 @@ module CIMI::Collections
enable :show_errors
disable :show_exceptions
- set :root_url, Deltacloud[:cimi].root_url
- set :version, Deltacloud[:cimi].version
+ set :config, Deltacloud[:cimi]
+ set :root_url, config.root_url
+ set :root_path, config.root_url
+ set :version, config.version
set :root, File.join(File.dirname(__FILE__), '..', '..')
set :views, root + '/views/cimi'
set :public_folder, root + '/public'
+ Sinatra::Rabbit.set :root_path, "#{config.root_url}/"
+
error do
report_error
end
diff --git a/server/lib/deltacloud/helpers.rb b/server/lib/deltacloud/helpers.rb
index 8d5774c..77d201e 100644
--- a/server/lib/deltacloud/helpers.rb
+++ b/server/lib/deltacloud/helpers.rb
@@ -23,6 +23,7 @@ require_relative 'helpers/blob_stream_helper'
module Deltacloud::Collections
class Base < Sinatra::Base
+ include Sinatra::Rabbit
extend Deltacloud::Helpers::Drivers
include Sinatra::Rabbit::Features
@@ -42,11 +43,14 @@ module Deltacloud::Collections
set :config, Deltacloud[:deltacloud]
set :root_url, config.root_url
+ set :root_path, config.root_url
set :version, config.version
set :root, File.join(File.dirname(__FILE__), '..', '..')
set :views, root + '/views'
set :public_folder, root + '/public'
+ Sinatra::Rabbit.set :root_path, "#{config.root_url}/"
+
error do
report_error
end
diff --git a/server/lib/deltacloud/helpers/deltacloud_helper.rb b/server/lib/deltacloud/helpers/deltacloud_helper.rb
index 843e45f..6d8cb9b 100644
--- a/server/lib/deltacloud/helpers/deltacloud_helper.rb
+++ b/server/lib/deltacloud/helpers/deltacloud_helper.rb
@@ -18,14 +18,6 @@ module Deltacloud::Helpers
require 'benchmark'
- def self.included(klass)
- klass.class_eval do
- set :config, Deltacloud[:deltacloud]
- include Sinatra::Rabbit
- Sinatra::Rabbit.set :root_path, "#{config.root_url}/"
- end
- 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)
--
1.7.10.2
[PATCH core 2/4] Core: Removed some forgotten puts from drivers
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/lib/cimi/models/entity_metadata.rb | 1 -
server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 1 -
server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb | 1 -
3 files changed, 3 deletions(-)
diff --git a/server/lib/cimi/models/entity_metadata.rb b/server/lib/cimi/models/entity_metadata.rb
index c14f3c2..1203001 100644
--- a/server/lib/cimi/models/entity_metadata.rb
+++ b/server/lib/cimi/models/entity_metadata.rb
@@ -53,7 +53,6 @@ class CIMI::Model::EntityMetadata < CIMI::Model::Base
def self.metadata_from_deltacloud_features(cimi_entity, dcloud_entity, context)
deltacloud_features = context.driver.class.features[dcloud_entity]
- puts deltacloud_features.inspect
metadata_attributes = deltacloud_features.map{|f| attributes_from_feature(f)}
from_feature(cimi_entity, context, metadata_attributes.flatten!)
end
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index cca995d..70c9189 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -918,7 +918,6 @@ module Deltacloud
end
def convert_load_balancer(credentials, loadbalancer)
- puts loadbalancer.inspect
realms = []
balancer_realms = loadbalancer[:availability_zones].each do |zone|
realms << realm(credentials, zone)
diff --git a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
index 391234b..80d2fa1 100644
--- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
+++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
@@ -37,7 +37,6 @@ module Deltacloud::Drivers::RimuHosting
end
safely do
r = @service.send_request(method, @uri.path + resource, data, headers)
- puts r.body
res = JSON.parse(r.body)
res = res[res.keys[0]]
--
1.7.10.2
Re: Multiple frontend support for Deltacloud (rev 3)
Posted by "marios@redhat.com" <ma...@redhat.com>.
ACK - this version works fine - tried /api/images (dcloud) and
/cimi/machine_images (cimi)
[marios@name server]$ ./bin/deltacloudd -i mock -f deltacloud,cimi
Starting Deltacloud API :: mock :: http://localhost:3001/api
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Debugging ON
>> Maximum connections set to 1024
>> Listening on localhost:3001, CTRL+C to stop
127.0.0.1 - - [07/Jun/2012 14:34:48] "GET
/cimi/machine_images?format=xml HTTP/1.1" 200 488 0.0269
127.0.0.1 - - [07/Jun/2012 14:34:54] "GET /api HTTP/1.1" 200 4529 0.1341
127.0.0.1 - - [07/Jun/2012 14:35:02] "GET /api/images HTTP/1.1" 200 3154
0.0417
On 07/06/12 14:19, mfojtik@redhat.com wrote:
> Hi,
>
> This patchset include fixes for 'root_url' overide problem with Rabbit based
> frontends (CIMI, DC) and also fix all tests to use the new multi-frontend
> configuration.
>
> -- Michal
>
>
[PATCH core 1/4] Core: Make possible to run multiple frontends using single Deltacloud instance
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
server/bin/deltacloudd | 2 +-
server/config.ru | 59 +++++++++++++-------
server/lib/cimi/helpers.rb | 6 +-
server/lib/cimi/server.rb | 4 +-
server/lib/deltacloud/drivers/base_driver.rb | 6 +-
server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 2 +-
server/lib/deltacloud/helpers.rb | 5 +-
server/lib/deltacloud/helpers/deltacloud_helper.rb | 6 +-
server/lib/deltacloud/helpers/url_helper.rb | 4 +-
server/lib/deltacloud/models/hardware_profile.rb | 2 +-
server/lib/deltacloud/server.rb | 14 +++--
server/lib/deltacloud_rack.rb | 23 ++++----
server/lib/ec2/server.rb | 4 +-
server/lib/sinatra/rack_accept.rb | 2 +-
server/lib/sinatra/rack_driver_select.rb | 2 +-
15 files changed, 82 insertions(+), 59 deletions(-)
diff --git a/server/bin/deltacloudd b/server/bin/deltacloudd
index 3dbe967..08be61c 100755
--- a/server/bin/deltacloudd
+++ b/server/bin/deltacloudd
@@ -61,7 +61,7 @@ BANNER
opts.on( '-P', '--provider PROVIDER', 'Use PROVIDER (default is set in the driver)') do |provider|
ENV['API_PROVIDER'] = provider
end
- opts.on('-f', '--frontend FRONTEND', 'Use the different frontend, not the Deltacloud (cimi or ec2)') do |frontend|
+ opts.on('-f', '--frontends FRONTENDS', 'Enable different frontends (cimi, ec2, deltacloud)') do |frontend|
ENV['API_FRONTEND'] = frontend
end
opts.on( '-c', '--config [FILE]', 'Read provider and other config from FILE (default: ~/.deltacloud/config)') do |config|
diff --git a/server/config.ru b/server/config.ru
index 582de45..ba3583f 100644
--- a/server/config.ru
+++ b/server/config.ru
@@ -18,6 +18,7 @@
# The default driver is 'mock'
ENV['API_DRIVER'] ||= 'mock'
+ENV['API_FRONTEND'] ||= 'deltacloud'
load File.join(File.dirname(__FILE__), 'lib', 'deltacloud_rack.rb')
@@ -27,38 +28,56 @@ Deltacloud::configure do |server|
server.klass 'Deltacloud::API'
end
-if ENV['API_FRONTEND'] == 'cimi'
- Deltacloud::configure do |server|
- server.root_url '/cimi'
- server.version '1.0.0'
- server.klass 'CIMI::API'
- end
+Deltacloud::configure(:cimi) do |server|
+ server.root_url '/cimi'
+ server.version '1.0.0'
+ server.klass 'CIMI::API'
end
-if ENV['API_FRONTEND'] == 'ec2'
- Deltacloud::configure do |server|
- server.root_url '/'
- server.version '2012-04-01'
- server.klass 'Deltacloud::EC2::API'
- end
+Deltacloud::configure(:ec2) do |server|
+ server.root_url '/'
+ server.version '2012-04-01'
+ server.klass 'Deltacloud::EC2::API'
end
-Deltacloud.require_frontend!
+routes = {}
+
+# If user wants to launch multiple frontends withing a single instance of DC API
+# then require them and prepare the routes for Rack
+#
+# NOTE: The '/' will not be generated, since multiple frontends could have
+# different root_url's
+#
+if ENV['API_FRONTEND'].split(',').size > 1
+
+ ENV['API_FRONTEND'].split(',').each do |frontend|
+ Deltacloud.require_frontend!(frontend)
+ routes.merge!({
+ Deltacloud[frontend].root_url => Deltacloud[frontend].klass
+ })
+ end
-class IndexEntrypoint < Sinatra::Base
- get "/" do
- redirect Deltacloud[:root_url], 301
+else
+ Deltacloud.require_frontend!(ENV['API_FRONTEND'])
+ class IndexEntrypoint < Sinatra::Base
+ get "/" do
+ redirect Deltacloud[ENV['API_FRONTEND']].root_url, 301
+ end
end
+ routes['/'] = IndexEntrypoint.new
+ routes[Deltacloud[ENV['API_FRONTEND']].root_url] = Deltacloud[ENV['API_FRONTEND']].klass
end
+
run Rack::Builder.new {
use Rack::MatrixParams
use Rack::DriverSelect
- run Rack::URLMap.new(
- "/" => IndexEntrypoint.new,
- Deltacloud[:root_url] => Deltacloud[:klass],
+ routes.merge!({
"/stylesheets" => Rack::Directory.new( "public/stylesheets" ),
"/javascripts" => Rack::Directory.new( "public/javascripts" )
- )
+ })
+
+ run Rack::URLMap.new(routes)
+
} if respond_to? :run
diff --git a/server/lib/cimi/helpers.rb b/server/lib/cimi/helpers.rb
index 5fe8cf8..1b91423 100644
--- a/server/lib/cimi/helpers.rb
+++ b/server/lib/cimi/helpers.rb
@@ -62,8 +62,8 @@ module CIMI::Collections
enable :show_errors
disable :show_exceptions
- set :root_url, Deltacloud[:root_url]
- set :version, Deltacloud[:version]
+ set :root_url, Deltacloud[:cimi].root_url
+ set :version, Deltacloud[:cimi].version
set :root, File.join(File.dirname(__FILE__), '..', '..')
set :views, root + '/views/cimi'
set :public_folder, root + '/public'
@@ -82,7 +82,7 @@ module CIMI::Collections
end
after do
- headers 'X-CIMI-Specification-Version' => Deltacloud[:version]
+ headers 'X-CIMI-Specification-Version' => Deltacloud[:cimi].version
end
def self.new_route_for(route, &block)
diff --git a/server/lib/cimi/server.rb b/server/lib/cimi/server.rb
index 58c1688..4e612f4 100644
--- a/server/lib/cimi/server.rb
+++ b/server/lib/cimi/server.rb
@@ -45,8 +45,8 @@ module CIMI
include CIMI::Collections
include CIMI::Model
- get Deltacloud[:root_url] do
- redirect Deltacloud[:root_url] + '/cloudEntryPoint', 301
+ get Deltacloud[:cimi].root_url do
+ redirect Deltacloud[:cimi].root_url + '/cloudEntryPoint', 301
end
end
diff --git a/server/lib/deltacloud/drivers/base_driver.rb b/server/lib/deltacloud/drivers/base_driver.rb
index a360807..555a244 100644
--- a/server/lib/deltacloud/drivers/base_driver.rb
+++ b/server/lib/deltacloud/drivers/base_driver.rb
@@ -23,7 +23,7 @@ module Deltacloud
STATE_MACHINE_OPTS = {
:all_states => [:start, :pending, :running, :stopping, :stopped, :finish],
:all_actions => [:create, :reboot, :stop, :start, :destroy]
- }
+ } unless defined?(STATE_MACHINE_OPTS)
def self.driver_name
name.split('::').last.gsub('Driver', '').downcase
@@ -243,8 +243,8 @@ module Deltacloud
firewalls(credentials, opts).first if has_capability?(:firewalls)
end
- MEMBER_SHOW_METHODS =
- [ :realm, :image, :instance, :storage_volume, :bucket, :blob, :key, :firewall ]
+ MEMBER_SHOW_METHODS = [ :realm, :image, :instance, :storage_volume, :bucket, :blob,
+ :key, :firewall ] unless defined?(MEMBER_SHOW_METHODS)
def filter_on(collection, attribute, opts)
return collection if opts.nil?
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 8a61b9c..cca995d 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -752,7 +752,7 @@ module Deltacloud
def providers(credentials, opts={})
ec2 = new_client(credentials)
providers = ec2.describe_regions.map{|r| Provider.new( {:id=>r, :name=>r,
- :url=>"#{ENV['API_HOST']}:#{ENV['API_PORT']}#{Deltacloud[:root_url]}\;provider=#{r}" }) }
+ :url=>"#{ENV['API_HOST']}:#{ENV['API_PORT']}#{Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url}\;provider=#{r}" }) }
end
def configured_providers
diff --git a/server/lib/deltacloud/helpers.rb b/server/lib/deltacloud/helpers.rb
index f2a9ebb..8d5774c 100644
--- a/server/lib/deltacloud/helpers.rb
+++ b/server/lib/deltacloud/helpers.rb
@@ -40,8 +40,9 @@ module Deltacloud::Collections
enable :method_override
disable :show_exceptions
- set :root_url, Deltacloud[:root_url]
- set :version, Deltacloud[:version]
+ set :config, Deltacloud[:deltacloud]
+ set :root_url, config.root_url
+ set :version, config.version
set :root, File.join(File.dirname(__FILE__), '..', '..')
set :views, root + '/views'
set :public_folder, root + '/public'
diff --git a/server/lib/deltacloud/helpers/deltacloud_helper.rb b/server/lib/deltacloud/helpers/deltacloud_helper.rb
index 1d0df0e..843e45f 100644
--- a/server/lib/deltacloud/helpers/deltacloud_helper.rb
+++ b/server/lib/deltacloud/helpers/deltacloud_helper.rb
@@ -20,9 +20,9 @@ module Deltacloud::Helpers
def self.included(klass)
klass.class_eval do
- set :root_url, Deltacloud[:root_url]
+ set :config, Deltacloud[:deltacloud]
include Sinatra::Rabbit
- Sinatra::Rabbit.set :root_path, root_url+'/'
+ Sinatra::Rabbit.set :root_path, "#{config.root_url}/"
end
end
@@ -236,7 +236,7 @@ module Deltacloud::Helpers
end
end
- NEW_BLOB_FORM_ID = 'new_blob_form_d15cfd90'
+ NEW_BLOB_FORM_ID = 'new_blob_form_d15cfd90' unless defined?(NEW_BLOB_FORM_ID)
def new_blob_form_url(bucket)
bucket_url(@bucket.name) + "/" + NEW_BLOB_FORM_ID
diff --git a/server/lib/deltacloud/helpers/url_helper.rb b/server/lib/deltacloud/helpers/url_helper.rb
index fd4d9bc..eead293 100644
--- a/server/lib/deltacloud/helpers/url_helper.rb
+++ b/server/lib/deltacloud/helpers/url_helper.rb
@@ -79,7 +79,7 @@ module Sinatra
def url_for url_fragment, mode=:path_only
case mode
when :path_only
- base = request.script_name.empty? ? Deltacloud[:root_url] : request.script_name
+ base = request.script_name.empty? ? Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url : request.script_name
when :full
scheme = request.scheme
port = request.port
@@ -96,7 +96,7 @@ module Sinatra
else
port = ":#{port}"
end
- base = "#{scheme}://#{request_host}#{port}#{request.script_name.empty? ? Deltacloud[:root_url] : request.script_name}"
+ base = "#{scheme}://#{request_host}#{port}#{request.script_name.empty? ? Deltacloud[ENV['API_FRONTEND'] || :deltacloud].root_url : request.script_name}"
else
raise TypeError, "Unknown url_for mode #{mode}"
end
diff --git a/server/lib/deltacloud/models/hardware_profile.rb b/server/lib/deltacloud/models/hardware_profile.rb
index 45e77a1..0b36c4b 100644
--- a/server/lib/deltacloud/models/hardware_profile.rb
+++ b/server/lib/deltacloud/models/hardware_profile.rb
@@ -22,7 +22,7 @@ module Deltacloud
:storage => "GB",
:architecture => "label",
:cpu => "count"
- }
+ } unless defined?(UNITS)
def self.unit(name)
UNITS[name]
diff --git a/server/lib/deltacloud/server.rb b/server/lib/deltacloud/server.rb
index e26f427..cdb7150 100644
--- a/server/lib/deltacloud/server.rb
+++ b/server/lib/deltacloud/server.rb
@@ -42,7 +42,9 @@ module Deltacloud
include Deltacloud::Helpers
include Deltacloud::Collections
- get Deltacloud[:root_url] + '/?' do
+ set :config, Deltacloud[:deltacloud]
+
+ get config.root_url + '/?' do
if params[:force_auth]
return [401, 'Authentication failed'] unless driver.valid_credentials?(credentials)
end
@@ -53,20 +55,20 @@ module Deltacloud
end
end
- post Deltacloud[:root_url] + '/?' do
+ post config.root_url + '/?' do
param_driver, param_provider = params["driver"], params["provider"]
if param_driver
- redirect "#{Deltacloud[:root_url]}\;driver=#{param_driver}", 301
+ redirect "#{config.root_url}\;driver=#{param_driver}", 301
elsif param_provider && param_provider != "default"
#FIXME NEEDS A BETTER WAY OF GRABBING CURRENT DRIVER FROM MATRIX PARAMS...
current_matrix_driver = env["HTTP_REFERER"].match(/\;(driver)=(\w*).*$/i)
if current_matrix_driver
- redirect "#{Deltacloud[:root_url]}\;driver=#{$2}\;provider=#{param_provider}", 301
+ redirect "#{config.root_url}\;driver=#{$2}\;provider=#{param_provider}", 301
else
- redirect "#{Deltacloud[:root_url]}\;provider=#{param_provider}", 301
+ redirect "#{config.root_url}\;provider=#{param_provider}", 301
end
else
- redirect "#{Deltacloud[:root_url]}", 301
+ redirect "#{config.root_url}", 301
end
end
diff --git a/server/lib/deltacloud_rack.rb b/server/lib/deltacloud_rack.rb
index e59b11a..2c55b29 100644
--- a/server/lib/deltacloud_rack.rb
+++ b/server/lib/deltacloud_rack.rb
@@ -25,23 +25,24 @@ require_relative './deltacloud/core_ext'
module Deltacloud
- def self.config(conf=nil)
- @config ||= conf
+ def self.config
+ @config ||= {}
end
- def self.configure(&block)
- @config = Server.new(&block)
+ def self.configure(frontend=:deltacloud, &block)
+ frontend = frontend.to_sym
+ config[frontend] = Server.new(&block)
self
end
- def self.[](item)
- config.send(item)
+ def self.[](frontend=:deltacloud)
+ config[frontend.to_sym]
end
- def self.require_frontend!
- ENV['API_FRONTEND'] ||= 'deltacloud'
- require File.join(File.dirname(__FILE__), ENV['API_FRONTEND'], 'server.rb')
- config.klass eval('::'+self[:klass])
+ def self.require_frontend!(frontend=:deltacloud)
+ frontend = frontend.to_sym
+ require File.join(File.dirname(__FILE__), frontend.to_s, 'server.rb')
+ Deltacloud[frontend].klass eval('::'+Deltacloud[frontend].klass)
end
class Server
@@ -59,7 +60,7 @@ module Deltacloud
def root_url(url=nil)
return @root_url if url.nil?
- raise '[Core] The server URL must start with /' unless url =~ /^\//
+ raise "[Core] The server URL must start with / (#{url})" unless url =~ /^\//
@root_url = url
end
diff --git a/server/lib/ec2/server.rb b/server/lib/ec2/server.rb
index 9b045e4..52f3993 100644
--- a/server/lib/ec2/server.rb
+++ b/server/lib/ec2/server.rb
@@ -41,8 +41,8 @@ module Deltacloud::EC2
enable :method_override
disable :show_exceptions
- set :version, Deltacloud[:version]
- set :root_url, Deltacloud[:root_url]
+ set :version, Deltacloud[:ec2].version
+ set :root_url, Deltacloud[:ec2].root_url
set :root, File.join(File.dirname(__FILE__), '..', '..')
set :views, File.join(File.dirname(__FILE__), 'views')
diff --git a/server/lib/sinatra/rack_accept.rb b/server/lib/sinatra/rack_accept.rb
index 4286e93..cef287f 100644
--- a/server/lib/sinatra/rack_accept.rb
+++ b/server/lib/sinatra/rack_accept.rb
@@ -113,7 +113,7 @@ module Rack
:html => { :return => 'text/html', :match => ['application/xhtml+xml', 'text/html', '*/*'] },
:png => { :return => 'image/png', :match => ['image/png'] },
:gv => { :return => 'application/ghostscript', :match => ['application/ghostscript'] }
- }
+ } unless defined?(ACCEPTED_MEDIA_TYPES)
def call(env)
accept, index = env['rack-accept.request'], {}
diff --git a/server/lib/sinatra/rack_driver_select.rb b/server/lib/sinatra/rack_driver_select.rb
index 829ce8c..141f399 100644
--- a/server/lib/sinatra/rack_driver_select.rb
+++ b/server/lib/sinatra/rack_driver_select.rb
@@ -25,7 +25,7 @@ module Rack
HEADER_TO_ENV_MAP = {
'HTTP_X_DELTACLOUD_DRIVER' => :driver,
'HTTP_X_DELTACLOUD_PROVIDER' => :provider
- }
+ } unless defined?(HEADER_TO_ENV_MAP)
def call(env)
original_settings = { }
--
1.7.10.2