Use some helpful HTTP status codes, not just generic 422.
authorTom Clegg <tom@clinicalfuture.com>
Thu, 5 Dec 2013 21:08:28 +0000 (13:08 -0800)
committerTom Clegg <tom@clinicalfuture.com>
Thu, 5 Dec 2013 21:25:11 +0000 (13:25 -0800)
* 403 for PermissionDeniedError
* 401 for UnauthorizedError

services/api/app/controllers/application_controller.rb
services/api/app/models/arvados_model.rb
services/api/app/models/node.rb
services/api/test/functional/arvados/v1/nodes_controller_test.rb

index dfe615309010f7dcaef20661ddcf83eb5a50412e..10915803370d1f38aaad956dfeebf9573a7114d9 100644 (file)
@@ -83,7 +83,8 @@ class ApplicationController < ActionController::Base
     else
       errors = [e.inspect]
     end
-    render json: { errors: errors }, status: 422
+    status = if e.respond_to?(:http_status) ? e.http_status : 422
+    render json: { errors: errors }, status: status
   end
 
   def render_not_found(e=ActionController::RoutingError.new("Path not found"))
index 60e850864cb362cb333af41bf99fde692be7ddb1..991755b48a67f9803bbcdf415c1552c09dec1ba2 100644 (file)
@@ -17,6 +17,15 @@ class ArvadosModel < ActiveRecord::Base
   has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'"
 
   class PermissionDeniedError < StandardError
+    def http_status
+      403
+    end
+  end
+
+  class UnauthorizedError < StandardError
+    def http_status
+      401
+    end
   end
 
   def self.kind_class(kind)
index 33527358db8000e717f91f3e45366396be3ccfbd..08dc6628a7da37817981e2e10dc2e2fe2844be51 100644 (file)
@@ -72,7 +72,7 @@ class Node < ArvadosModel
 
     if o[:ping_secret] != self.info[:ping_secret]
       logger.info "Ping: secret mismatch: received \"#{o[:ping_secret]}\" != \"#{self.info[:ping_secret]}\""
-      raise ArvadosModel::PermissionDeniedError.new("Incorrect ping_secret")
+      raise ArvadosModel::UnauthorizedError.new("Incorrect ping_secret")
     end
     self.last_ping_at = Time.now
 
index db7fce73e543b6350373ac61091460041f8c51e0..3e239c36c951a22f2926835b69971cb1ee9ac322 100644 (file)
@@ -63,7 +63,7 @@ class Arvados::V1::NodesControllerTest < ActionController::TestCase
       local_ipv4: '172.17.2.174',
       ping_secret: 'dricrha4lcpi23pd69e44soanc069udawxvn3zzj45hs8bumvn'
     }
-    assert_response :unprocessable_entity
+    assert_response 401
   end
 
 end