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/27 13:07:56 UTC
Improved error/exception reporting (rev 2)
Hi,
this patchset combine my previous error handling DSL patch and fix all tests/issues
so far. (all our test suites are green).
Also I recently realized, that we don't have mechanism to 'reset' mock data in mock dir.
So I updated Rakefile and nwo there are couple tasks for dealing with mock data (setup, clean, reset)
All error pages were updated to be more verbose for users (well HTML pages are helpfull just for developers,
which is another reason I increased verbosity). So no you can see backtrace, HTTP status code explanation,
request and response headers and of course status code.
Since we already discussed fir revision and so far it was 'acked' verbaly ;-) I just resending rebased patch
with this additions. For those who look on my previous patch, first patch in this set is not interesting.
-- Michal
[PATCH core 2/4] Added task for Mock driver fixtures setup/reset inside server directory
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
---
server/Rakefile | 39 +++++++++++++++++++++++++++++++++++++++
1 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/server/Rakefile b/server/Rakefile
index e6b59b8..33bfe65 100644
--- a/server/Rakefile
+++ b/server/Rakefile
@@ -89,3 +89,42 @@ spec = Gem::Specification.load('deltacloud-core.gemspec')
Rake::GemPackageTask.new(spec) do |pkg|
pkg.need_tar = true
end
+
+namespace :mock do
+ namespace :fixtures do
+ desc "Setup Mock driver fixtures"
+ task 'setup' do
+ if ENV["DELTACLOUD_MOCK_STORAGE"]
+ storage_root = ENV["DELTACLOUD_MOCK_STORAGE"]
+ elsif ENV["USER"]
+ storage_root = File::join("/var/tmp", "deltacloud-mock-#{ENV["USER"]}")
+ else
+ raise "Please set either the DELTACLOUD_MOCK_STORAGE or USER environment variable"
+ end
+ data = Dir::glob(File::join(File::dirname(__FILE__), "lib", "deltacloud", "drivers", "mock", "data", "*"))
+ FileUtils::mkdir_p(storage_root, :verbose => true)
+ FileUtils::cp_r(data, storage_root, :verbose => true)
+ end
+
+ desc "Remove Mock driver fixtures"
+ task 'clean' do
+ if ENV["DELTACLOUD_MOCK_STORAGE"]
+ storage_root = ENV["DELTACLOUD_MOCK_STORAGE"]
+ elsif ENV["USER"]
+ storage_root = File::join("/var/tmp", "deltacloud-mock-#{ENV["USER"]}")
+ else
+ raise "Please set either the DELTACLOUD_MOCK_STORAGE or USER environment variable"
+ end
+ FileUtils::rm_rf(storage_root, :verbose => true)
+ end
+
+ desc "Reset Mock driver fixtures"
+ task 'reset' do
+ Rake::Task["fixtures:clean"].reenable
+ Rake::Task["fixtures:clean"].invoke
+ Rake::Task["fixtures:setup"].reenable
+ Rake::Task["fixtures:setup"].invoke
+ end
+
+ end
+end
--
1.7.4.1
[PATCH core 4/4] RHEV-M driver updated to support new error handling
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
---
server/lib/deltacloud/base_driver/exceptions.rb | 3 ++
.../lib/deltacloud/drivers/rhevm/rhevm_driver.rb | 23 ++++++++++++-------
server/tests/drivers/mock/api_test.rb | 4 +-
3 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/server/lib/deltacloud/base_driver/exceptions.rb b/server/lib/deltacloud/base_driver/exceptions.rb
index e7b6ac8..38f18d2 100644
--- a/server/lib/deltacloud/base_driver/exceptions.rb
+++ b/server/lib/deltacloud/base_driver/exceptions.rb
@@ -28,6 +28,9 @@ module Deltacloud
end
class BackendError < DeltacloudException
+
+ attr_accessor :cause
+
def initialize(e, details)
super(500, e.class.name, e.message, e.backtrace, details)
end
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index fbaaf64..7aa6a2a 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -277,15 +277,20 @@ class RHEVMDriver < Deltacloud::BaseDriver
)
end
- # Disabling this error catching will lead to more verbose messages
- # on console (eg. response from RHEV-M API (so far I didn't figure our
- # how to pass those message to our exception handling tool)
- def catched_exceptions_list
- {
- :auth => [RestClient::Unauthorized],
- :error => [RestClient::InternalServerError],
- :glob => [ /(RestClient|RHEVM)::(\w+)/ ]
- }
+ exceptions do
+
+ on /RestClient::Unauthorized/ do
+ status 401
+ end
+
+ on /RestClient::InternalServerError/ do
+ status 502
+ end
+
+ on /(RestClient|RHEVM)/ do
+ status 500
+ end
+
end
end
diff --git a/server/tests/drivers/mock/api_test.rb b/server/tests/drivers/mock/api_test.rb
index 0d86ef5..5767103 100644
--- a/server/tests/drivers/mock/api_test.rb
+++ b/server/tests/drivers/mock/api_test.rb
@@ -69,7 +69,7 @@ module DeltacloudUnitTest
with_provider("storage") do
get_auth_url '/api/instances'
- last_response.status.should == 404
+ last_response.status.should == 403
end
end
@@ -79,7 +79,7 @@ module DeltacloudUnitTest
with_provider("storage") do
get_url '/api/docs/instances'
- last_response.status.should == 404
+ last_response.status.should == 403
end
end
--
1.7.4.1
[PATCH core 3/4] Added more detailed descriptions to error codes and more debugging output, like HTTP headers
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
Fixed special cases when no exception was throwed, just status code.
Improved wraping for backtrace in error pages.
---
.../lib/deltacloud/helpers/application_helper.rb | 16 ++++++--
server/public/stylesheets/compiled/application.css | 8 ++++
server/views/errors/400.html.haml | 9 ++++-
server/views/errors/401.html.haml | 3 ++
server/views/errors/403.html.haml | 12 ++++++-
server/views/errors/404.html.haml | 9 ++++-
server/views/errors/404.xml.haml | 2 +-
server/views/errors/405.html.haml | 21 +++++++++++
server/views/errors/405.xml.haml | 5 +++
server/views/errors/500.html.haml | 37 ++++++++++++++++++++
server/views/errors/500.xml.haml | 6 ++--
server/views/errors/502.html.haml | 6 +++-
12 files changed, 122 insertions(+), 12 deletions(-)
create mode 100644 server/views/errors/405.html.haml
create mode 100644 server/views/errors/405.xml.haml
create mode 100644 server/views/errors/500.html.haml
diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index ad1e7cb..d496368 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -105,11 +105,19 @@ module ApplicationHelper
end
def report_error(code=nil)
- @error = request.env['sinatra.error']
- response.status = code || @error.code
+ @error, @code = request.env['sinatra.error'], code
+ @code = 500 if not @code and not @error.class.method_defined? :code
+ if @error
+ unless @error.class.method_defined? :cause
+ @cause = nil
+ else
+ @cause = @error.cause
+ end
+ end
+ response.status = @code || @error.code
respond_to do |format|
- format.xml { haml :"errors/#{code || @error.code}", :layout => false }
- format.html { haml :"errors/#{code || @error.code}", :layout => :error }
+ format.xml { haml :"errors/#{@code || @error.code}", :layout => false }
+ format.html { haml :"errors/#{@code || @error.code}", :layout => :error }
end
end
diff --git a/server/public/stylesheets/compiled/application.css b/server/public/stylesheets/compiled/application.css
index e354d41..78d3018 100644
--- a/server/public/stylesheets/compiled/application.css
+++ b/server/public/stylesheets/compiled/application.css
@@ -667,3 +667,11 @@ h3.description {
font-size : 70%;
color : #ccc;
}
+
+pre {
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
diff --git a/server/views/errors/400.html.haml b/server/views/errors/400.html.haml
index 1d3ee48..0743859 100644
--- a/server/views/errors/400.html.haml
+++ b/server/views/errors/400.html.haml
@@ -1,4 +1,4 @@
-%h1 Validation Failure
+%h1 Bad Request
%p= @error.message
@@ -9,3 +9,10 @@
%di
%dt Parameter
%dd= @error.name
+ %di
+ %dt Status code
+ %dd= response.status
+ %di
+ %dt Explanation
+ %dd
+ The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
diff --git a/server/views/errors/401.html.haml b/server/views/errors/401.html.haml
index 1226587..ae1aab2 100644
--- a/server/views/errors/401.html.haml
+++ b/server/views/errors/401.html.haml
@@ -6,3 +6,6 @@
%di
%dt Request URL
%dd= request.env['REQUEST_URI']
+ %di
+ %dt Status code
+ %dd= response.status
diff --git a/server/views/errors/403.html.haml b/server/views/errors/403.html.haml
index 59e9fe9..23229db 100644
--- a/server/views/errors/403.html.haml
+++ b/server/views/errors/403.html.haml
@@ -1,6 +1,16 @@
-%h1 Method Not Allowed
+%h1 Forbidden
%dl
%di
%dt Request URL
%dd= request.env['REQUEST_URI']
+ %di
+ %dt Cause
+ %dd= @cause
+ %di
+ %dt Status code
+ %dd= response.status
+ %di
+ %dt Explanation
+ %dd
+ 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.
diff --git a/server/views/errors/404.html.haml b/server/views/errors/404.html.haml
index dfbb116..6dc6efc 100644
--- a/server/views/errors/404.html.haml
+++ b/server/views/errors/404.html.haml
@@ -1,6 +1,13 @@
-%h1 Not Found
+%h1 Resource not found
%dl
%di
%dt Request URL
%dd= request.env['REQUEST_URI']
+ %di
+ %dt Status code
+ %dd= response.status
+ %di
+ %dt Explanation
+ %dd
+ The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent.
diff --git a/server/views/errors/404.xml.haml b/server/views/errors/404.xml.haml
index 38840f3..47aede6 100644
--- a/server/views/errors/404.xml.haml
+++ b/server/views/errors/404.xml.haml
@@ -1,2 +1,2 @@
%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
- %message Not Found
+ %message Resource not found
diff --git a/server/views/errors/405.html.haml b/server/views/errors/405.html.haml
new file mode 100644
index 0000000..4227818
--- /dev/null
+++ b/server/views/errors/405.html.haml
@@ -0,0 +1,21 @@
+%h1 Method Not Allowed
+
+%p
+ A 405 status code is returned when the client has tried to use a request method that the server does not allow. Request methods that are allowed should be sent with the response (common request methods are POST and GET).
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
+ %di
+ %dt Request headers
+ %dd
+ %pre
+ =request.env.inspect
+ %di
+ %dt Status code
+ %dd= response.status
+ %di
+ %dt Explanation
+ %dd
+ The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource.
diff --git a/server/views/errors/405.xml.haml b/server/views/errors/405.xml.haml
new file mode 100644
index 0000000..e0198f5
--- /dev/null
+++ b/server/views/errors/405.xml.haml
@@ -0,0 +1,5 @@
+%error{:url => "#{request.env['REQUEST_URI']}", :status => "#{response.status}"}
+ %message
+ Requested method not allowed
+ %method
+ =request.env['REQUEST_METHOD']
diff --git a/server/views/errors/500.html.haml b/server/views/errors/500.html.haml
new file mode 100644
index 0000000..ec34ce2
--- /dev/null
+++ b/server/views/errors/500.html.haml
@@ -0,0 +1,37 @@
+%h1 Internal Server Error
+
+%p= "#{@error.class}: #{@error.message}"
+- if @error.class.method_defined? :details
+ %p= @error.details
+
+%dl
+ %di
+ %dt Request URL
+ %dd= request.env['REQUEST_URI']
+ %di
+ %dt Request headers
+ %dd
+ %pre
+ =request.env.inspect
+ %di
+ %dt Parameters
+ %dd
+ %pre
+ =params.inspect
+ %di
+ %dt Response headers
+ %dd
+ %pre
+ =response.headers.inspect
+ %di
+ %dt Code
+ %dd 500
+ %di
+ %dt Backtrace
+ %dd
+ %pre
+ =@error.backtrace.join("\n")
+ %di
+ %dt Explanation
+ %dd
+ The server encountered an unexpected condition which prevented it from fulfilling the request.
diff --git a/server/views/errors/500.xml.haml b/server/views/errors/500.xml.haml
index 87c8e19..b067212 100644
--- a/server/views/errors/500.xml.haml
+++ b/server/views/errors/500.xml.haml
@@ -1,8 +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
+ %code=response.status
+ %cause= @cause
+ - if @error.class.method_defined? :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
index b6b3e1b..31eac25 100644
--- a/server/views/errors/502.html.haml
+++ b/server/views/errors/502.html.haml
@@ -1,4 +1,4 @@
-%h1 Backend Error
+%h1 Backend provider error
%p= @error.message
@@ -12,3 +12,7 @@
%di
%dt Code
%dd= @error.code
+ %di
+ %dt Explanation
+ %dd
+ The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request.
--
1.7.4.1
[PATCH core 1/4] Added DSL for handling exceptions
Posted by mf...@redhat.com.
From: Michal Fojtik <mf...@redhat.com>
---
server/lib/deltacloud/base_driver/base_driver.rb | 53 +-------
server/lib/deltacloud/base_driver/exceptions.rb | 127 ++++++++++++++++++++
server/lib/deltacloud/drivers/ec2/ec2_driver.rb | 18 ++-
.../lib/deltacloud/drivers/ec2/ec2_mock_driver.rb | 2 +-
server/lib/deltacloud/drivers/mock/mock_driver.rb | 20 ++--
.../drivers/rackspace/rackspace_driver.rb | 24 +++-
.../drivers/rimuhosting/rimuhosting_client.rb | 3 +-
.../drivers/rimuhosting/rimuhosting_driver.rb | 9 +-
server/lib/deltacloud/drivers/sbc/sbc_client.rb | 4 +-
server/lib/deltacloud/drivers/sbc/sbc_driver.rb | 12 ++
.../drivers/terremark/terremark_driver.rb | 13 +--
.../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 --
36 files changed, 301 insertions(+), 197 deletions(-)
create mode 100644 server/lib/deltacloud/base_driver/exceptions.rb
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 8b195f3..d9ebd92 100644
--- a/server/lib/deltacloud/base_driver/base_driver.rb
+++ b/server/lib/deltacloud/base_driver/base_driver.rb
@@ -14,32 +14,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 ||= []
@@ -233,32 +218,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/base_driver/exceptions.rb b/server/lib/deltacloud/base_driver/exceptions.rb
new file mode 100644
index 0000000..e7b6ac8
--- /dev/null
+++ b/server/lib/deltacloud/base_driver/exceptions.rb
@@ -0,0 +1,127 @@
+module Deltacloud
+ module ExceptionHandler
+
+ class DeltacloudException < StandardError
+
+ attr_accessor :code, :name, :message, :backtrace, :request
+
+ def initialize(code, name, message, backtrace, details, request=nil)
+ @code, @name, @message = code, name, message
+ @details = details
+ @backtrace = backtrace
+ @request = request
+ self
+ end
+
+ end
+
+ class AuthenticationFailure < DeltacloudException
+ def initialize(e, details)
+ super(401, e.class.name, e.message, e.backtrace, details)
+ end
+ end
+
+ class ValidationFailure < DeltacloudException
+ def initialize(e, details)
+ super(400, e.class.name, e.message, e.backtrace, details)
+ end
+ end
+
+ class BackendError < DeltacloudException
+ def initialize(e, details)
+ super(500, e.class.name, e.message, e.backtrace, details)
+ end
+ end
+
+ class ProviderError < DeltacloudException
+ def initialize(e, details)
+ super(502, e.class.name, e.message, e.backtrace, details)
+ end
+ end
+
+ class ExceptionDef
+ attr_accessor :status
+ attr_accessor :message
+ attr_reader :conditions
+ attr_reader :handler
+
+ def initialize(conditions, &block)
+ @conditions = conditions
+ instance_eval(&block) if block_given?
+ end
+
+ def status(code)
+ self.status = code
+ end
+
+ def message(message)
+ self.message = message
+ end
+
+ def details(details)
+ self.details = details
+ end
+
+ def exception(handler)
+ self.handler = handler
+ end
+
+ # Condition can be class or regexp
+ #
+ def match?(e)
+ @conditions.each do |c|
+ return true if c.class == Class && e.class == c
+ return true if c.class == Regexp && (e.class.name =~ c or e.message =~ c)
+ end
+ return false
+ end
+
+ def handler(e)
+ return @handler if @handler
+ case @status
+ when 401 then Deltacloud::ExceptionHandler::AuthenticationFailure.new(e, @details)
+ when 400 then Deltacloud::ExceptionHandler::ValidationFailure.new(e, @details)
+ when 500 then Deltacloud::ExceptionHandler::BackendError.new(e, @details)
+ when 502 then Deltacloud::ExceptionHandler::ProviderError.new(e, @details)
+ end
+ end
+
+ end
+
+ class Exceptions
+ attr_reader :exception_definitions
+
+ def initialize(&block)
+ @exception_definitions = []
+ instance_eval(&block) if block_given?
+ self
+ end
+
+ def on(*conditions, &block)
+ @exception_definitions << ExceptionDef::new(conditions, &block) if block_given?
+ end
+ end
+
+ def self.exceptions(&block)
+ @definitions = Exceptions.new(&block).exception_definitions if block_given?
+ @definitions
+ end
+
+ def safely(&block)
+ begin
+ block.call
+ rescue => e
+ Deltacloud::ExceptionHandler::exceptions.each do |exdef|
+ raise exdef.handler(e) if exdef.match?(e)
+ end
+ $stderr.puts "# UNCAUGHT EXCEPTION ~> '#{e.class}' - "
+ $stderr.puts "# #{e.message}"
+ $stderr.puts "# #{e.backtrace.join("\n")}"
+ $stderr.puts "##############"
+ raise BackendError.new(e)
+ end
+ end
+
+ end
+
+end
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
index 4b9899a..ee1b7f3 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_driver.rb
@@ -717,12 +717,18 @@ module Deltacloud
end
end
- def catched_exceptions_list
- {
- :auth => [ /AuthFailure/ ],
- :error => [ /Aws::AwsError/, /Error/ ],
- :glob => [ /AWS::(\w+)/, /Deltacloud::Runner::(\w+)/ ]
- }
+ exceptions do
+ on /(AuthFailure|InvalidAccessKeyId)/ do
+ status 401
+ end
+
+ on /Error/ do
+ status 502
+ end
+
+ on /Deltacloud::Runner::(\w+)/ do
+ status 500
+ end
end
end
diff --git a/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb b/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
index 755b067..8cce73d 100644
--- a/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
+++ b/server/lib/deltacloud/drivers/ec2/ec2_mock_driver.rb
@@ -178,7 +178,7 @@ Deltacloud::Drivers::EC2::EC2Driver.class_eval do
def new_client(credentials, opts={})
if credentials.user != 'mockuser' and credentials.password != 'mockpassword'
- raise Deltacloud::AuthException.new
+ raise "AuthFailure"
end
RightAws::MockEc2.new
end
diff --git a/server/lib/deltacloud/drivers/mock/mock_driver.rb b/server/lib/deltacloud/drivers/mock/mock_driver.rb
index a721197..83a7404 100644
--- a/server/lib/deltacloud/drivers/mock/mock_driver.rb
+++ b/server/lib/deltacloud/drivers/mock/mock_driver.rb
@@ -490,7 +490,7 @@ class MockDriver < Deltacloud::BaseDriver
begin
check_credentials(credentials)
return true
- rescue Deltacloud::AuthException
+ rescue
end
return false
end
@@ -499,16 +499,20 @@ class MockDriver < Deltacloud::BaseDriver
def check_credentials(credentials)
if ( credentials.user != 'mockuser' ) or ( credentials.password != 'mockpassword' )
- raise Deltacloud::AuthException.new
+ raise 'AuthFailure'
end
end
- def catched_exceptions_list
- {
- :auth => [],
- :error => [ /Deltacloud::BackendError/, /Errno::ENOENT/ ],
- :glob => [ /Error/ ]
- }
+ exceptions do
+
+ on /AuthFailure/ do
+ status 401
+ end
+
+ on /Err/ do
+ status 500
+ end
+
end
end
diff --git a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
index 4604168..f173bcc 100644
--- a/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
+++ b/server/lib/deltacloud/drivers/rackspace/rackspace_driver.rb
@@ -391,12 +391,24 @@ private
end
end
- def catched_exceptions_list
- {
- :auth => [ /Authentication failed/ ],
- :error => [ /Error/ ],
- :glob => [ /CloudServers::Exception::(\w+)/, /Deltacloud::Runner::(\w+)/ ]
- }
+ exceptions do
+
+ on /No offering found/ do
+ status 400
+ end
+
+ on /Authentication failed/ do
+ status 401
+ end
+
+ on /Error/ do
+ status 500
+ end
+
+ on /CloudServers::Exception::(\w+)/ do
+ status 500
+ end
+
end
private
diff --git a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
index c1f26ff..9d1d821 100755
--- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
+++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_client.rb
@@ -40,6 +40,7 @@ class RimuHostingClient
if(!@auth.nil?)
headers["Authorization"] = @auth
end
+ safely do
r = @service.send_request(method, @uri.path + resource, data, headers)
puts r.body
res = JSON.parse(r.body)
@@ -47,7 +48,7 @@ class RimuHostingClient
if(res['response_type'] == "ERROR" and ( (res['error_info']['error_class'] == "PermissionException") or
(res['error_info']['error_class'] == "LoginRequired") ))
- raise Deltacloud::AuthException.new
+ raise "AuthFailure"
end
res
end
diff --git a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
index ce5dc5f..6d37644 100755
--- a/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
+++ b/server/lib/deltacloud/drivers/rimuhosting/rimuhosting_driver.rb
@@ -149,15 +149,12 @@ class RimuHostingDriver < Deltacloud::BaseDriver
stopped.to( :finish ) .automatically
end
- def safely(&block)
- begin
- block.call
- rescue Exception => e
- raise Deltacloud::BackendError.new(500, e.class.to_s, e.message, e.backtrace)
+ exceptions do
+ on /AuthFailure/ do
+ status 401
end
end
-
end
end
diff --git a/server/lib/deltacloud/drivers/sbc/sbc_client.rb b/server/lib/deltacloud/drivers/sbc/sbc_client.rb
index 0a4c504..90d091b 100644
--- a/server/lib/deltacloud/drivers/sbc/sbc_client.rb
+++ b/server/lib/deltacloud/drivers/sbc/sbc_client.rb
@@ -180,9 +180,9 @@ class SBCClient
#
def backend_error!(resp)
if resp.is_a?(Net::HTTPUnauthorized)
- raise Deltacloud::AuthException, resp.message
+ raise "AuthFailure"
else
- raise Deltacloud::BackendError.new(resp.code, resp.body, resp.message, '')
+ raise "BackendError"
end
end
diff --git a/server/lib/deltacloud/drivers/sbc/sbc_driver.rb b/server/lib/deltacloud/drivers/sbc/sbc_driver.rb
index b004686..63a57cd 100644
--- a/server/lib/deltacloud/drivers/sbc/sbc_driver.rb
+++ b/server/lib/deltacloud/drivers/sbc/sbc_driver.rb
@@ -118,6 +118,18 @@ class SBCDriver < Deltacloud::BaseDriver
instance(credentials, instance_id)
end
+ exceptions do
+
+ on /AuthFailure/ do
+ status 401
+ end
+
+ on /BackendError/ do
+ status 502
+ end
+
+ end
+
#
# --------------------- Private helpers ---------------------
#
diff --git a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
index 9c481ad..d56df6b 100644
--- a/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
+++ b/server/lib/deltacloud/drivers/terremark/terremark_driver.rb
@@ -192,7 +192,7 @@ end
def valid_credentials?(credentials)
begin
new_client(credentials)
- rescue Deltacloud::AuthException
+ rescue
return false
end
true
@@ -272,20 +272,17 @@ end
vdc_id = terremark_client.default_vdc_id
end
if (vdc_id.nil?)
- raise DeltaCloud::AuthException.new
+ raise "AuthFailure"
end
terremark_client
end
- def safely(&block)
- begin
- block.call
- rescue Exception => e
- raise Deltacloud::BackendError.new(500, e.class.to_s, e.message, e.backtrace)
+ exceptions do
+ on /AuthFailure/ do
+ status 401
end
end
-
end
end
diff --git a/server/lib/deltacloud/helpers/application_helper.rb b/server/lib/deltacloud/helpers/application_helper.rb
index 6bf0085..ad1e7cb 100644
--- a/server/lib/deltacloud/helpers/application_helper.rb
+++ b/server/lib/deltacloud/helpers/application_helper.rb
@@ -100,16 +100,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
@@ -119,7 +119,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 600c9a5..0375c29 100644
--- a/server/lib/deltacloud/validation.rb
+++ b/server/lib/deltacloud/validation.rb
@@ -24,7 +24,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 259cf3b..3d40112 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -23,10 +23,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
@@ -273,8 +283,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 5e48828..3d27173 100644
--- a/server/server.rb
+++ b/server/server.rb
@@ -57,24 +57,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
@@ -497,7 +481,7 @@ END
format.json { convert_to_json(:hardware_profile, @profile) }
end
else
- report_error(404, 'not_found')
+ report_error(404)
end
end
end
@@ -752,7 +736,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
@@ -766,7 +750,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
@@ -780,7 +764,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
@@ -793,7 +777,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
Re: Improved error/exception reporting (rev 2)
Posted by Michal Fojtik <mf...@redhat.com>.
On Apr 28, 2011, at 8:07 PM, marios@redhat.com wrote:
> ACK (minor typo needs fixing before commit):
>
> * clean application (minor whitespace [non] issue)
>
> * Rakefile lines 124/125/126 - typo - you forgot to specify the :mock namespace (e.g. Rake::Task["mock:fixtures:clean"].invoke) so gives an error
>
> * The rake mock:setup/clean/reset stuff is very nice and long overdue - can we automate this during install? (e.g. add it in 'rake package' for example)
>
> * Code 502 'Backend error' - previously you used to get a full stack trace in the 'details' field - i don't know if its better without it but this is a matter of opinion. You could argue that its better without it since it doesn't give you any new information (e.g. you know the problem happened in 'buckets' method since thats what you requested - but imo more information is always better for debugging.
>
Thanks!
I fixed Rakefile and pushed the patchset to SVN. Re 520: I probably forgot to add this information here, thanks!.
-- Michal
>
> marios
>
> On 27/04/11 14:07, mfojtik@redhat.com wrote:
>> Hi,
>>
>> this patchset combine my previous error handling DSL patch and fix all tests/issues
>> so far. (all our test suites are green).
>>
>> Also I recently realized, that we don't have mechanism to 'reset' mock data in mock dir.
>> So I updated Rakefile and nwo there are couple tasks for dealing with mock data (setup, clean, reset)
>>
>> All error pages were updated to be more verbose for users (well HTML pages are helpfull just for developers,
>> which is another reason I increased verbosity). So no you can see backtrace, HTTP status code explanation,
>> request and response headers and of course status code.
>>
>> Since we already discussed fir revision and so far it was 'acked' verbaly ;-) I just resending rebased patch
>> with this additions. For those who look on my previous patch, first patch in this set is not interesting.
>>
>> -- Michal
>>
>
------------------------------------------------------
Michal Fojtik, mfojtik@redhat.com
Deltacloud API: http://deltacloud.org
Re: Improved error/exception reporting (rev 2)
Posted by "marios@redhat.com" <ma...@redhat.com>.
ACK (minor typo needs fixing before commit):
* clean application (minor whitespace [non] issue)
* Rakefile lines 124/125/126 - typo - you forgot to specify the :mock
namespace (e.g. Rake::Task["mock:fixtures:clean"].invoke) so gives an error
* The rake mock:setup/clean/reset stuff is very nice and long overdue
- can we automate this during install? (e.g. add it in 'rake package'
for example)
* Code 502 'Backend error' - previously you used to get a full stack
trace in the 'details' field - i don't know if its better without it but
this is a matter of opinion. You could argue that its better without it
since it doesn't give you any new information (e.g. you know the problem
happened in 'buckets' method since thats what you requested - but imo
more information is always better for debugging.
marios
On 27/04/11 14:07, mfojtik@redhat.com wrote:
> Hi,
>
> this patchset combine my previous error handling DSL patch and fix all tests/issues
> so far. (all our test suites are green).
>
> Also I recently realized, that we don't have mechanism to 'reset' mock data in mock dir.
> So I updated Rakefile and nwo there are couple tasks for dealing with mock data (setup, clean, reset)
>
> All error pages were updated to be more verbose for users (well HTML pages are helpfull just for developers,
> which is another reason I increased verbosity). So no you can see backtrace, HTTP status code explanation,
> request and response headers and of course status code.
>
> Since we already discussed fir revision and so far it was 'acked' verbaly ;-) I just resending rebased patch
> with this additions. For those who look on my previous patch, first patch in this set is not interesting.
>
> -- Michal
>