Commit d3a10c19 authored by rpereira2's avatar rpereira2

Return error message when URL is blocked

When the Prometheus URL is blocked, the custom metric form should
display the appropriate error message.
parent e27d8f25
---
title: Display error message in custom metric form validation when prometheus URL
is blocked
merge_request: 27863
author:
type: fixed
......@@ -7,7 +7,7 @@ module Gitlab
def query(query)
client_query(query)
{ valid: true }
rescue Gitlab::PrometheusClient::QueryError => ex
rescue Gitlab::PrometheusClient::QueryError, Gitlab::HTTP::BlockedUrlError => ex
{ valid: false, error: ex.message }
end
......
......@@ -3,7 +3,10 @@
require 'spec_helper'
describe Gitlab::Prometheus::Queries::ValidateQuery do
let(:client) { double('prometheus_client') }
include PrometheusHelpers
let(:api_url) { 'https://prometheus.example.com' }
let(:client) { Gitlab::PrometheusClient.new(api_url) }
let(:query) { 'avg(metric)' }
subject { described_class.new(client) }
......@@ -21,16 +24,39 @@ describe Gitlab::Prometheus::Queries::ValidateQuery do
end
context 'invalid query' do
let(:message) { 'message' }
before do
allow(client).to receive(:query).with(query).and_raise(Gitlab::PrometheusClient::QueryError.new(message))
let(:query) { 'invalid query' }
let(:error_message) { "invalid parameter 'query': 1:9: parse error: unexpected identifier \"query\"" }
it 'returns invalid' do
Timecop.freeze do
stub_prometheus_query_error(
prometheus_query_with_time_url(query, Time.now),
error_message
)
expect(subject.query(query)).to eq(valid: false, error: error_message)
end
end
end
it 'passes query to prometheus' do
expect(subject.query(query)).to eq(valid: false, error: message)
context 'when exceptions occur' do
context 'Gitlab::HTTP::BlockedUrlError' do
let(:api_url) { 'http://192.168.1.1' }
expect(client).to have_received(:query).with(query)
let(:message) do
"URL 'http://192.168.1.1/api/v1/query?query=avg%28metric%29&time=#{Time.now.to_f}'" \
" is blocked: Requests to the local network are not allowed"
end
before do
stub_application_setting(allow_local_requests_from_web_hooks_and_services: false)
end
it 'catches exception and returns invalid' do
Timecop.freeze do
expect(subject.query(query)).to eq(valid: false, error: message)
end
end
end
end
end
......@@ -68,6 +68,21 @@ module PrometheusHelpers
})
end
def stub_prometheus_query_error(url, error_message = 'error', body: {}, headers: {})
response = {
status: 'error',
errorType: 'bad_data',
error: error_message
}.merge(body)
WebMock.stub_request(:get, url)
.to_return({
status: 400,
headers: { 'Content-Type' => 'application/json' }.merge(headers),
body: response.to_json
})
end
def stub_prometheus_request_with_exception(url, exception_type)
WebMock.stub_request(:get, url).to_raise(exception_type)
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment