Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit 13a74e0

Browse files
v3: Return helpful errors when talking to Routing API
This commit introduces a generic `service_unavailable` error that corresponds to a 503. [#162395328] Co-authored-by: Belinda Liu <bliu@pivotal.io>
1 parent a94a075 commit 13a74e0

4 files changed

Lines changed: 66 additions & 4 deletions

File tree

app/controllers/v3/application_controller.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def bad_request!(message)
3030
raise CloudController::Errors::ApiError.new_from_details('BadRequest', message)
3131
end
3232

33+
def service_unavailable!(message)
34+
raise CloudController::Errors::ApiError.new_from_details('ServiceUnavailable', message)
35+
end
36+
3337
def resource_not_found!(resource)
3438
raise CloudController::Errors::NotFound.new_from_details('ResourceNotFound', "#{resource.to_s.humanize} not found")
3539
end

app/controllers/v3/domains_controller.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def create
4242
unauthorized! unless permission_queryer.can_write_globally?
4343
end
4444

45-
if message.router_group_guid.present? && router_group_not_found?(message.router_group_guid)
45+
if message.router_group_guid.present? && fetch_router_group(message.router_group_guid).nil?
4646
unprocessable!("Router group with guid '#{message.router_group_guid}' not found.")
4747
end
4848
domain = DomainCreate.new.create(message: message, shared_organizations: shared_org_objects)
@@ -211,7 +211,14 @@ def find_missing_guid(db_organizations, message_shared_org_guids)
211211
(message_shared_org_guids - db_organizations.map(&:guid)).first
212212
end
213213

214-
def router_group_not_found?(router_group_guid)
215-
!CloudController::DependencyLocator.instance.routing_api_client.router_group(router_group_guid)
214+
def fetch_router_group(router_group_guid)
215+
routing_client = CloudController::DependencyLocator.instance.routing_api_client
216+
service_unavailable!('The Routing API is disabled.') unless routing_client.enabled?
217+
218+
routing_client.router_group(router_group_guid)
219+
rescue RoutingApi::RoutingApiUnavailable
220+
service_unavailable!('The Routing API is currently unavailable. Please try again later.')
221+
rescue RoutingApi::UaaUnavailable
222+
service_unavailable!('Communicating with the Routing API failed because UAA is currently unavailable. Please try again later.')
216223
end
217224
end

spec/request/domains_spec.rb

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
allow(VCAP::CloudController::RoutingApi::Client).to receive(:new).and_return(routing_api_client)
1616
allow(routing_api_client).to receive(:router_group).with('some-router-guid').and_return router_group
1717
allow(routing_api_client).to receive(:router_group).with('some-other-router-guid').and_return nil
18+
allow(routing_api_client).to receive(:enabled?).and_return true
1819
end
1920

2021
describe 'GET /v3/domains' do
@@ -788,6 +789,51 @@
788789
end
789790

790791
it_behaves_like 'permissions for single object endpoint', ALL_PERMISSIONS
792+
793+
context 'when the Routing API is unavailable' do
794+
let(:user_header) { admin_headers_for(user) }
795+
796+
before do
797+
allow(routing_api_client).to receive(:router_group).and_raise VCAP::CloudController::RoutingApi::RoutingApiUnavailable
798+
end
799+
800+
it 'returns a 503 and helpful error message' do
801+
post '/v3/domains', domain_params.to_json, user_header
802+
803+
expect(last_response.status).to eq(503)
804+
expect(parsed_response['errors'][0]['detail']).to eq 'The Routing API is currently unavailable. Please try again later.'
805+
end
806+
end
807+
808+
context 'when the Routing API is disabled' do
809+
let(:user_header) { admin_headers_for(user) }
810+
811+
before do
812+
allow(routing_api_client).to receive(:enabled?).and_return false
813+
end
814+
815+
it 'returns a 503 with a helpful message' do
816+
post '/v3/domains', domain_params.to_json, user_header
817+
818+
expect(last_response.status).to eq(503)
819+
expect(parsed_response['errors'][0]['detail']).to eq 'The Routing API is disabled.'
820+
end
821+
end
822+
823+
context 'when UAA is unavailable' do
824+
let(:user_header) { admin_headers_for(user) }
825+
826+
before do
827+
allow(routing_api_client).to receive(:router_group).and_raise VCAP::CloudController::RoutingApi::UaaUnavailable
828+
end
829+
830+
it 'returns a 503 with a helpful message' do
831+
post '/v3/domains', domain_params.to_json, user_header
832+
833+
expect(last_response.status).to eq(503)
834+
expect(parsed_response['errors'][0]['detail']).to eq 'Communicating with the Routing API failed because UAA is currently unavailable. Please try again later.'
835+
end
836+
end
791837
end
792838

793839
describe 'when creating a private domain' do
@@ -1088,7 +1134,7 @@
10881134
end
10891135
end
10901136

1091-
context 'when a router group is provided' do
1137+
describe 'when a router group is provided' do
10921138
let(:params) do
10931139
{
10941140
name: 'my-domain.biz',

vendor/errors/v2.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@
9898
http_code: 429
9999
message: "Rate Limit Exceeded: Unauthenticated requests from this IP address have exceeded the limit. Please log in."
100100

101+
10015:
102+
name: ServiceUnavailable
103+
http_code: 503
104+
message: "%s"
105+
101106
20001:
102107
name: UserInvalid
103108
http_code: 400

0 commit comments

Comments
 (0)