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 2011/04/04 16:02:05 UTC
[PATCH core 2/3] Renamed views to use HTTP status codes. Adapted server, rabbit and validations
From: Michal Fojtik <mf...@redhat.com>
---
server/lib/deltacloud/base_driver/base_driver.rb | 53 ++-----------------
.../lib/deltacloud/helpers/application_helper.rb | 12 ++--
server/lib/deltacloud/validation.rb | 2 +-
server/lib/sinatra/rabbit.rb | 21 ++++++--
server/server.rb | 30 +++---------
server/views/errors/400.html.haml | 11 ++++
server/views/errors/400.xml.haml | 4 ++
server/views/errors/401.html.haml | 8 +++
server/views/errors/401.xml.haml | 3 +
server/views/errors/403.html.haml | 6 ++
server/views/errors/403.xml.haml | 2 +
server/views/errors/404.html.haml | 6 ++
server/views/errors/404.xml.haml | 2 +
server/views/errors/500.xml.haml | 8 +++
server/views/errors/502.html.haml | 14 +++++
server/views/errors/502.xml.haml | 8 +++
server/views/errors/auth_exception.html.haml | 8 ---
server/views/errors/auth_exception.xml.haml | 3 -
server/views/errors/backend_error.html.haml | 22 --------
server/views/errors/backend_error.xml.haml | 8 ---
server/views/errors/not_allowed.html.haml | 6 --
server/views/errors/not_allowed.xml.haml | 2 -
server/views/errors/not_found.html.haml | 6 --
server/views/errors/not_found.xml.haml | 2 -
server/views/errors/validation_failure.html.haml | 11 ----
server/views/errors/validation_failure.xml.haml | 8 ---
26 files changed, 107 insertions(+), 159 deletions(-)
create mode 100644 server/views/errors/400.html.haml
create mode 100644 server/views/errors/400.xml.haml
create mode 100644 server/views/errors/401.html.haml
create mode 100644 server/views/errors/401.xml.haml
create mode 100644 server/views/errors/403.html.haml
create mode 100644 server/views/errors/403.xml.haml
create mode 100644 server/views/errors/404.html.haml
create mode 100644 server/views/errors/404.xml.haml
create mode 100644 server/views/errors/500.xml.haml
create mode 100644 server/views/errors/502.html.haml
create mode 100644 server/views/errors/502.xml.haml
delete mode 100644 server/views/errors/auth_exception.html.haml
delete mode 100644 server/views/errors/auth_exception.xml.haml
delete mode 100644 server/views/errors/backend_error.html.haml
delete mode 100644 server/views/errors/backend_error.xml.haml
delete mode 100644 server/views/errors/not_allowed.html.haml
delete mode 100644 server/views/errors/not_allowed.xml.haml
delete mode 100644 server/views/errors/not_found.html.haml
delete mode 100644 server/views/errors/not_found.xml.haml
delete mode 100644 server/views/errors/validation_failure.html.haml
delete mode 100644 server/views/errors/validation_failure.xml.haml
diff --git a/server/lib/deltacloud/base_driver/base_driver.rb b/server/lib/deltacloud/base_driver/base_driver.rb
index 38383d8..2514659 100644
--- a/server/lib/deltacloud/base_driver/base_driver.rb
+++ b/server/lib/deltacloud/base_driver/base_driver.rb
@@ -16,32 +16,17 @@
# License for the specific language governing permissions and limitations
# under the License.
+require 'lib/deltacloud/base_driver/exceptions'
+
module Deltacloud
- class AuthException < Exception
- end
+ class BaseDriver
- class BackendError < StandardError
- attr_reader :code, :cause, :details
- def initialize(code, cause, message, details)
- super(message)
- @code = code
- @cause = cause
- @details = details
- end
- end
+ include ExceptionHandler
- class BackendFeatureUnsupported < StandardError
- attr_reader :code, :cause, :details
- def initialize(code, cause, message, details)
- super(message)
- @code = code
- @cause = cause
- @details = details
+ def self.exceptions(&block)
+ ExceptionHandler::exceptions(&block)
end
- end
-
- class BaseDriver
def self.define_hardware_profile(name,&block)
@hardware_profiles ||= []
@@ -235,32 +220,6 @@ module Deltacloud
{ :error => [], :auth => [], :glob => [] }
end
- def safely(&block)
- begin
- block.call
- rescue => e
- catched_exceptions_list[:auth].each do |ex|
- if e.class == ex or e.class.name =~ ex or e.message =~ ex
- raise Deltacloud::AuthException.new
- end
- end
- catched_exceptions_list[:error].each do |ex|
- if e.class == ex or e.class.name =~ ex or e.message =~ ex
- raise Deltacloud::BackendError.new(502, e.class.to_s, e.message, e.backtrace) if e.class.name =~ ex
- end
- end
- catched_exceptions_list[:glob].each do |ex|
- if e.class == ex or e.class.name =~ ex or e.message =~ ex
- raise Deltacloud::BackendError.new(500, e.class.to_s, e.message, e.backtrace)
- end
- end
- $stderr.puts "# UNCAUGHT EXCEPTION # -> '#{e.class}' - '#{e.message}'"
- $stderr.puts "# #{e.backtrace.join("\n")}"
- $stderr.puts "##############"
- raise Deltacloud::BackendError.new(500, e.class.to_s, e.message, e.backtrace)
- end
- end
-
end
end
diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index 345aaff..0113126 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -102,16 +102,16 @@ module ApplicationHelper
format.json { convert_to_json(model, @element) }
end
else
- report_error(404, 'not_found')
+ report_error(404)
end
end
- def report_error(status, template)
+ def report_error(code=nil)
@error = request.env['sinatra.error']
- response.status = status
+ response.status = code || @error.code
respond_to do |format|
- format.xml { haml :"errors/#{template}", :layout => false }
- format.html { haml :"errors/#{template}", :layout => :error }
+ format.xml { haml :"errors/#{code || @error.code}", :layout => false }
+ format.html { haml :"errors/#{code || @error.code}", :layout => :error }
end
end
@@ -121,7 +121,7 @@ module ApplicationHelper
# If original instance doesn't include called action
# return with 405 error (Method is not Allowed)
unless driver.instance_actions_for(original_instance.state).include?(name.to_sym)
- return report_error(405, 'not_allowed')
+ return report_error(405)
end
@instance = driver.send(:"#{name}_instance", credentials, params["id"])
diff --git a/server/lib/deltacloud/validation.rb b/server/lib/deltacloud/validation.rb
index cfac4ce..93444b7 100644
--- a/server/lib/deltacloud/validation.rb
+++ b/server/lib/deltacloud/validation.rb
@@ -26,7 +26,7 @@ module Deltacloud::Validation
end
def name
- param.name
+ param.name if @param
end
end
diff --git a/server/lib/sinatra/rabbit.rb b/server/lib/sinatra/rabbit.rb
index 8be2b8b..730f4d7 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -25,10 +25,20 @@ module Sinatra
module Rabbit
- class DuplicateParamException < Exception; end
- class DuplicateOperationException < Exception; end
- class DuplicateCollectionException < Exception; end
- class UnsupportedCollectionException < Exception; end
+ class DuplicateParamException < Deltacloud::ExceptionHandler::DeltacloudException; end
+ class DuplicateOperationException < Deltacloud::ExceptionHandler::DeltacloudException; end
+ class DuplicateCollectionException < Deltacloud::ExceptionHandler::DeltacloudException; end
+ class UnsupportedCollectionException < Deltacloud::ExceptionHandler::DeltacloudException
+ def initialize
+ @details = "This collection is not supported for this provider."
+ @message = @details
+ # The server understood the request, but is refusing to fulfill it. Authorization will not help and the request
+ # SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request
+ # has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish
+ # to make this information available to the client, the status code 404 (Not Found) can be used instead.
+ @code = 403 #
+ end
+ end
class Operation
attr_reader :name, :method, :collection
@@ -275,8 +285,7 @@ module Sinatra
def check_supported(driver)
unless global? || driver.has_collection?(@name)
- raise UnsupportedCollectionException,
- "Collection #{@name} not supported by this driver"
+ raise UnsupportedCollectionException
end
end
end
diff --git a/server/server.rb b/server/server.rb
index 586a9af..ebaf3f1 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -59,24 +59,8 @@ end
# whatever you want (eg. if you running API behind NAT)
HOSTNAME=ENV['API_HOST'] ? ENV['API_HOST'] : nil
-error Deltacloud::Validation::Failure do
- report_error(400, "validation_failure")
-end
-
-error Deltacloud::BackendCapability::Failure do
- report_error(405, "backend_capability_failure")
-end
-
-error Deltacloud::AuthException do
- report_error(401, "auth_exception")
-end
-
-error Deltacloud::BackendError do
- report_error(500, "backend_error")
-end
-
-error Sinatra::Rabbit::UnsupportedCollectionException do
- report_error(404, "not_found")
+error do
+ report_error
end
Sinatra::Application.register Sinatra::RespondTo
@@ -495,7 +479,7 @@ END
format.json { convert_to_json(:hardware_profile, @profile) }
end
else
- report_error(404, 'not_found')
+ report_error(404)
end
end
end
@@ -743,7 +727,7 @@ head '/api/buckets/:bucket/:blob' do
headers["X-Deltacloud-Blobmeta-#{k}"] = v
end
else
- report_error(404, 'not_found')
+ report_error(404)
end
end
@@ -757,7 +741,7 @@ post '/api/buckets/:bucket/:blob' do
headers["X-Deltacloud-Blobmeta-#{k}"] = v
end
else
- report_error(404, 'not_found') #FIXME is this the right error code?
+ report_error(404) #FIXME is this the right error code?
end
end
@@ -771,7 +755,7 @@ get '/api/buckets/:bucket/:blob' do
format.json { convert_to_json(blobs, @blob) }
end
else
- report_error(404, 'not_found')
+ report_error(404)
end
end
@@ -784,7 +768,7 @@ get '/api/buckets/:bucket/:blob/content' do
params['content_disposition'] = "attachment; filename=#{@blob.id}"
BlobStream.call(env, credentials, params)
else
- report_error(404, 'not_found')
+ report_error(404)
end
end
diff --git a/server/views/errors/400.html.haml b/server/views/errors/400.html.haml
new file mode 100644
index 0000000..1d3ee48
--- /dev/null
+++ b/server/views/errors/400.html.haml
@@ -0,0 +1,11 @@
+%h1 Validation Failure
+
+%p= @error.message
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
+ %di
+ %dt Parameter
+ %dd= @error.name
diff --git a/server/views/errors/400.xml.haml b/server/views/errors/400.xml.haml
new file mode 100644
index 0000000..4f2723f
--- /dev/null
+++ b/server/views/errors/400.xml.haml
@@ -0,0 +1,4 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %parameter #{@error.name}
+ %message< #{cdata @error.message}
+
diff --git a/server/views/errors/401.html.haml b/server/views/errors/401.html.haml
new file mode 100644
index 0000000..1226587
--- /dev/null
+++ b/server/views/errors/401.html.haml
@@ -0,0 +1,8 @@
+%h1 Authentication Failure
+
+%p= @error.message
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
diff --git a/server/views/errors/401.xml.haml b/server/views/errors/401.xml.haml
new file mode 100644
index 0000000..bfa9111
--- /dev/null
+++ b/server/views/errors/401.xml.haml
@@ -0,0 +1,3 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %message< #{cdata @error.message}
+
diff --git a/server/views/errors/403.html.haml b/server/views/errors/403.html.haml
new file mode 100644
index 0000000..59e9fe9
--- /dev/null
+++ b/server/views/errors/403.html.haml
@@ -0,0 +1,6 @@
+%h1 Method Not Allowed
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
diff --git a/server/views/errors/403.xml.haml b/server/views/errors/403.xml.haml
new file mode 100644
index 0000000..3bad335
--- /dev/null
+++ b/server/views/errors/403.xml.haml
@@ -0,0 +1,2 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %message Method not allowed for this resource
diff --git a/server/views/errors/404.html.haml b/server/views/errors/404.html.haml
new file mode 100644
index 0000000..dfbb116
--- /dev/null
+++ b/server/views/errors/404.html.haml
@@ -0,0 +1,6 @@
+%h1 Not Found
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
diff --git a/server/views/errors/404.xml.haml b/server/views/errors/404.xml.haml
new file mode 100644
index 0000000..38840f3
--- /dev/null
+++ b/server/views/errors/404.xml.haml
@@ -0,0 +1,2 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %message Not Found
diff --git a/server/views/errors/500.xml.haml b/server/views/errors/500.xml.haml
new file mode 100644
index 0000000..87c8e19
--- /dev/null
+++ b/server/views/errors/500.xml.haml
@@ -0,0 +1,8 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %kind backend_error
+ %backend{ :driver => driver_symbol }
+ %code= @error.code
+ %cause= @error.cause
+ - if @error.details
+ %details< #{cdata @error.details.join("\n")}
+ %message< #{cdata @error.message}
diff --git a/server/views/errors/502.html.haml b/server/views/errors/502.html.haml
new file mode 100644
index 0000000..b6b3e1b
--- /dev/null
+++ b/server/views/errors/502.html.haml
@@ -0,0 +1,14 @@
+%h1 Backend Error
+
+%p= @error.message
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
+ %di
+ %dt Parameters
+ %dd= params.inspect
+ %di
+ %dt Code
+ %dd= @error.code
diff --git a/server/views/errors/502.xml.haml b/server/views/errors/502.xml.haml
new file mode 100644
index 0000000..87c8e19
--- /dev/null
+++ b/server/views/errors/502.xml.haml
@@ -0,0 +1,8 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %kind backend_error
+ %backend{ :driver => driver_symbol }
+ %code= @error.code
+ %cause= @error.cause
+ - if @error.details
+ %details< #{cdata @error.details.join("\n")}
+ %message< #{cdata @error.message}
diff --git a/server/views/errors/auth_exception.html.haml b/server/views/errors/auth_exception.html.haml
deleted file mode 100644
index 1226587..0000000
--- a/server/views/errors/auth_exception.html.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-%h1 Authentication Failure
-
-%p= @error.message
-
-%dl
- %di
- %dt Request URL
- %dd= request.env['REQUEST_URI']
diff --git a/server/views/errors/auth_exception.xml.haml b/server/views/errors/auth_exception.xml.haml
deleted file mode 100644
index bfa9111..0000000
--- a/server/views/errors/auth_exception.xml.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
- %message< #{cdata @error.message}
-
diff --git a/server/views/errors/backend_error.html.haml b/server/views/errors/backend_error.html.haml
deleted file mode 100644
index fb73386..0000000
--- a/server/views/errors/backend_error.html.haml
+++ /dev/null
@@ -1,22 +0,0 @@
-%h1 Backend Error
-
-%p= @error.message
-
-%dl
- %di
- %dt Request URL
- %dd= request.env['REQUEST_URI']
- %di
- %dt Parameters
- %dd= params.inspect
- %di
- %dt Code
- %dd= @error.code
- %di
- %dt Cause
- %dd= @error.cause
- %di
- %dt Details
- %dd
- %pre
- =@error.details.join("\n")
diff --git a/server/views/errors/backend_error.xml.haml b/server/views/errors/backend_error.xml.haml
deleted file mode 100644
index 87c8e19..0000000
--- a/server/views/errors/backend_error.xml.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
- %kind backend_error
- %backend{ :driver => driver_symbol }
- %code= @error.code
- %cause= @error.cause
- - if @error.details
- %details< #{cdata @error.details.join("\n")}
- %message< #{cdata @error.message}
diff --git a/server/views/errors/not_allowed.html.haml b/server/views/errors/not_allowed.html.haml
deleted file mode 100644
index 59e9fe9..0000000
--- a/server/views/errors/not_allowed.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%h1 Method Not Allowed
-
-%dl
- %di
- %dt Request URL
- %dd= request.env['REQUEST_URI']
diff --git a/server/views/errors/not_allowed.xml.haml b/server/views/errors/not_allowed.xml.haml
deleted file mode 100644
index 3bad335..0000000
--- a/server/views/errors/not_allowed.xml.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
- %message Method not allowed for this resource
diff --git a/server/views/errors/not_found.html.haml b/server/views/errors/not_found.html.haml
deleted file mode 100644
index dfbb116..0000000
--- a/server/views/errors/not_found.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%h1 Not Found
-
-%dl
- %di
- %dt Request URL
- %dd= request.env['REQUEST_URI']
diff --git a/server/views/errors/not_found.xml.haml b/server/views/errors/not_found.xml.haml
deleted file mode 100644
index 38840f3..0000000
--- a/server/views/errors/not_found.xml.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
- %message Not Found
diff --git a/server/views/errors/validation_failure.html.haml b/server/views/errors/validation_failure.html.haml
deleted file mode 100644
index 1d3ee48..0000000
--- a/server/views/errors/validation_failure.html.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-%h1 Validation Failure
-
-%p= @error.message
-
-%dl
- %di
- %dt Request URL
- %dd= request.env['REQUEST_URI']
- %di
- %dt Parameter
- %dd= @error.name
diff --git a/server/views/errors/validation_failure.xml.haml b/server/views/errors/validation_failure.xml.haml
deleted file mode 100644
index f18d6a2..0000000
--- a/server/views/errors/validation_failure.xml.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
- %parameter #{@error.name}
- %message< #{cdata @error.message}
- - unless @error.param.options.empty?
- %valid_options
- - @error.param.options.each do |v|
- %value< #{cdata v}
-
--
1.7.4.1