diff --git a/app/controllers/clusters/base_controller.rb b/app/controllers/clusters/base_controller.rb index dd5be596ad14c6beb81f96d020234a0371946d63..e7b76b87ad94836df6adcdaf29e553e41b6df4ed 100644 --- a/app/controllers/clusters/base_controller.rb +++ b/app/controllers/clusters/base_controller.rb @@ -10,7 +10,7 @@ class Clusters::BaseController < ApplicationController feature_category :deployment_management urgency :low, [ - :index, :show, :environments, :cluster_status, :prometheus_proxy, + :index, :show, :environments, :cluster_status, :destroy, :new_cluster_docs, :connect, :new, :create_user ] diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb index 873aa5e18dc27b621d7883c64aa70d9dcd17f8a1..2f6331a682257accbbd9001e8d76f388e482161f 100644 --- a/app/controllers/clusters/clusters_controller.rb +++ b/app/controllers/clusters/clusters_controller.rb @@ -2,7 +2,6 @@ class Clusters::ClustersController < Clusters::BaseController include RoutableActions - include Metrics::Dashboard::PrometheusApiProxy include MetricsDashboard before_action :cluster, only: [:cluster_status, :show, :update, :destroy, :clear_cache] diff --git a/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb b/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb deleted file mode 100644 index 6a24a7308b707adb9c399787fd7a10fef7aa5d31..0000000000000000000000000000000000000000 --- a/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -module Metrics::Dashboard::PrometheusApiProxy - extend ActiveSupport::Concern - include RenderServiceResults - - included do - before_action :authorize_read_prometheus!, only: [:prometheus_proxy] - end - - def prometheus_proxy - return not_found if Feature.enabled?(:remove_monitor_metrics) - - variable_substitution_result = - proxy_variable_substitution_service.new(proxyable, permit_params).execute - - return error_response(variable_substitution_result) if variable_substitution_result[:status] == :error - - prometheus_result = ::Prometheus::ProxyService.new( - proxyable, - proxy_method, - proxy_path, - variable_substitution_result[:params] - ).execute - - return continue_polling_response if prometheus_result.nil? - return error_response(prometheus_result) if prometheus_result[:status] == :error - - success_response(prometheus_result) - end - - private - - def proxyable - raise NotImplementedError, "#{self.class} must implement method: #{__callee__}" - end - - def proxy_variable_substitution_service - raise NotImplementedError, "#{self.class} must implement method: #{__callee__}" - end - - def permit_params - params.permit! - end - - def proxy_method - request.method - end - - def proxy_path - params[:proxy_path] - end -end diff --git a/app/controllers/projects/environments/prometheus_api_controller.rb b/app/controllers/projects/environments/prometheus_api_controller.rb deleted file mode 100644 index cbb16d596a00068c2cb6f6923851c03f08b63340..0000000000000000000000000000000000000000 --- a/app/controllers/projects/environments/prometheus_api_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -class Projects::Environments::PrometheusApiController < Projects::ApplicationController - include Metrics::Dashboard::PrometheusApiProxy - - before_action :proxyable - - feature_category :metrics - urgency :low - - private - - def proxyable - @proxyable ||= project.environments.find(params[:id]) - end - - def proxy_variable_substitution_service - ::Prometheus::ProxyVariableSubstitutionService - end -end diff --git a/app/controllers/projects/prometheus/alerts_controller.rb b/app/controllers/projects/prometheus/alerts_controller.rb index 27ac64e5758de4890157007d9e6429158eb10e79..80a8dbf4729eb09ea6799a00cc15139dd639bb52 100644 --- a/app/controllers/projects/prometheus/alerts_controller.rb +++ b/app/controllers/projects/prometheus/alerts_controller.rb @@ -3,8 +3,6 @@ module Projects module Prometheus class AlertsController < Projects::ApplicationController - include MetricsDashboard - respond_to :json protect_from_forgery except: [:notify] @@ -14,7 +12,6 @@ class AlertsController < Projects::ApplicationController prepend_before_action :repository, :project_without_auth, only: [:notify] before_action :authorize_read_prometheus_alerts!, except: [:notify] - before_action :alert, only: [:metrics_dashboard] feature_category :incident_management urgency :low @@ -33,17 +30,6 @@ def notify_service .new(project, params.permit!) end - def alert - @alert ||= alerts_finder(metric: params[:id]).execute.first || render_404 - end - - def alerts_finder(opts = {}) - Projects::Prometheus::AlertsFinder.new({ - project: project, - environment: params[:environment_id] - }.reverse_merge(opts)) - end - def extract_alert_manager_token(request) Doorkeeper::OAuth::Token.from_bearer_authorization(request) end @@ -52,13 +38,6 @@ def project_without_auth @project ||= Project .find_by_full_path("#{params[:namespace_id]}/#{params[:project_id]}") end - - def metrics_dashboard_params - { - embedded: true, - prometheus_alert_id: alert.id - } - end end end end diff --git a/ee/spec/controllers/admin/clusters_controller_spec.rb b/ee/spec/controllers/admin/clusters_controller_spec.rb index 844343870514cc2ecdff12bb08cb4d50befa1546..b079d092d31960ef184e9fc69ad69febde40bec2 100644 --- a/ee/spec/controllers/admin/clusters_controller_spec.rb +++ b/ee/spec/controllers/admin/clusters_controller_spec.rb @@ -76,14 +76,4 @@ def get_cluster get_cluster end end - - private - - def prometheus_proxy_params(params = {}) - { - id: cluster.id.to_s, - proxy_path: 'query', - query: '1' - }.merge(params) - end end diff --git a/spec/controllers/admin/clusters_controller_spec.rb b/spec/controllers/admin/clusters_controller_spec.rb index d04cd20f4e65b04da00f13156b808def7e031498..35bfb829bf7172e5f466e7c828c9e0e290c4e90d 100644 --- a/spec/controllers/admin/clusters_controller_spec.rb +++ b/spec/controllers/admin/clusters_controller_spec.rb @@ -102,39 +102,6 @@ def get_index(params = {}) end end - it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do - let(:cluster) { create(:cluster, :instance, :provided_by_gcp) } - - let(:metrics_dashboard_req_params) do - { - id: cluster.id - } - end - end - - describe 'GET #prometheus_proxy' do - let(:user) { admin } - let(:proxyable) do - create(:cluster, :instance, :provided_by_gcp) - end - - it_behaves_like 'metrics dashboard prometheus api proxy' do - context 'with anonymous user' do - let(:prometheus_body) { nil } - - before do - sign_out(admin) - end - - it 'returns 404' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - end - end - describe 'POST #create_user' do let(:params) do { @@ -283,41 +250,6 @@ def get_show(tab: nil) let(:subject) { get_show } end - describe 'functionality' do - context 'when remove_monitor_metrics FF is disabled' do - before do - stub_feature_flags(remove_monitor_metrics: false) - end - - render_views - - it 'responds successfully' do - get_show - - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:cluster)).to eq(cluster) - end - - it 'renders integration tab view' do - get_show(tab: 'integrations') - - expect(response).to render_template('clusters/clusters/_integrations') - expect(response).to have_gitlab_http_status(:ok) - end - end - - context 'when remove_monitor_metrics FF is enabled' do - render_views - - it 'renders details tab view' do - get_show(tab: 'integrations') - - expect(response).to render_template('clusters/clusters/_details') - expect(response).to have_gitlab_http_status(:ok) - end - end - end - describe 'security' do it { expect { get_show }.to be_allowed_for(:admin) } it { expect { get_show }.to be_denied_for(:user) } diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb index f36494c3d78267ba7a59ceb78870d7e5fc7d650a..6c747d4f00f757064d508e17c2a05099f012259b 100644 --- a/spec/controllers/groups/clusters_controller_spec.rb +++ b/spec/controllers/groups/clusters_controller_spec.rb @@ -115,46 +115,6 @@ def go(params = {}) end end - it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do - let(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) } - - let(:metrics_dashboard_req_params) do - { - id: cluster.id, - group_id: group.name - } - end - end - - describe 'GET #prometheus_proxy' do - let(:proxyable) do - create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) - end - - it_behaves_like 'metrics dashboard prometheus api proxy' do - let(:proxyable_params) do - { - id: proxyable.id.to_s, - group_id: group.name - } - end - - context 'with anonymous user' do - let(:prometheus_body) { nil } - - before do - sign_out(user) - end - - it 'returns 404' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - end - end - describe 'POST create for existing cluster' do let(:params) do { @@ -353,41 +313,6 @@ def go(tab: nil) let(:subject) { go } end - describe 'functionality' do - context 'when remove_monitor_metrics FF is disabled' do - before do - stub_feature_flags(remove_monitor_metrics: false) - end - - render_views - - it 'renders view' do - go - - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:cluster)).to eq(cluster) - end - - it 'renders integration tab view', :aggregate_failures do - go(tab: 'integrations') - - expect(response).to render_template('clusters/clusters/_integrations') - expect(response).to have_gitlab_http_status(:ok) - end - end - - context 'when remove_monitor_metrics FF is enabled' do - render_views - - it 'renders details tab view', :aggregate_failures do - go(tab: 'integrations') - - expect(response).to render_template('clusters/clusters/_details') - expect(response).to have_gitlab_http_status(:ok) - end - end - end - describe 'security' do it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) } it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) } diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb index f976b5bfe670eb189f107ca89d6c9aacab295305..bface88667401a7d19023bf86fa592e4cd3ce7cf 100644 --- a/spec/controllers/projects/clusters_controller_spec.rb +++ b/spec/controllers/projects/clusters_controller_spec.rb @@ -113,57 +113,6 @@ def go(params = {}) end end - describe 'GET #prometheus_proxy' do - let(:proxyable) do - create(:cluster, :provided_by_gcp, projects: [project]) - end - - it_behaves_like 'metrics dashboard prometheus api proxy' do - let(:proxyable_params) do - { - id: proxyable.id.to_s, - namespace_id: project.namespace.full_path, - project_id: project.path - } - end - - context 'with anonymous user' do - let(:prometheus_body) { nil } - - before do - sign_out(user) - end - - it 'redirects to signin page' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to redirect_to(new_user_session_path) - end - end - - context 'with a public project' do - before do - project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - project.project_feature.update!(metrics_dashboard_access_level: ProjectFeature::ENABLED) - end - - context 'with guest user' do - let(:prometheus_body) { nil } - - before do - project.add_guest(user) - end - - it 'returns 404' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - end - end - end - it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) } @@ -396,41 +345,6 @@ def go(tab: nil) let(:subject) { go } end - describe 'functionality' do - context 'when remove_monitor_metrics FF is disabled' do - before do - stub_feature_flags(remove_monitor_metrics: false) - end - - render_views - - it "renders view" do - go - - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:cluster)).to eq(cluster) - end - - it 'renders integration tab view' do - go(tab: 'integrations') - - expect(response).to render_template('clusters/clusters/_integrations') - expect(response).to have_gitlab_http_status(:ok) - end - end - - context 'when remove_monitor_metrics FF is enabled' do - render_views - - it 'renders details tab view', :aggregate_failures do - go(tab: 'integrations') - - expect(response).to render_template('clusters/clusters/_details') - expect(response).to have_gitlab_http_status(:ok) - end - end - end - describe 'security' do it 'is allowed for admin when admin mode enabled', :enable_admin_mode do expect { go }.to be_allowed_for(:admin) diff --git a/spec/controllers/projects/environments/prometheus_api_controller_spec.rb b/spec/controllers/projects/environments/prometheus_api_controller_spec.rb deleted file mode 100644 index ef2d743c82f70d18cf9658c806d9d7814a312d27..0000000000000000000000000000000000000000 --- a/spec/controllers/projects/environments/prometheus_api_controller_spec.rb +++ /dev/null @@ -1,96 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Projects::Environments::PrometheusApiController do - let_it_be(:user) { create(:user) } - let_it_be_with_reload(:project) { create(:project) } - let_it_be(:proxyable) { create(:environment, project: project) } - - before do - project.add_reporter(user) - sign_in(user) - end - - describe 'GET #prometheus_proxy' do - it_behaves_like 'metrics dashboard prometheus api proxy' do - let(:proxyable_params) do - { - id: proxyable.id.to_s, - namespace_id: project.namespace.full_path, - project_id: project.path - } - end - - context 'with variables' do - let(:prometheus_body) { '{"status":"success"}' } - let(:pod_name) { "pod1" } - - before do - expected_params[:query] = %{up{pod_name="#{pod_name}"}} - expected_params[:variables] = { 'pod_name' => pod_name } - end - - it 'replaces variables with values' do - get :prometheus_proxy, params: prometheus_proxy_params.merge( - query: 'up{pod_name="{{pod_name}}"}', variables: { 'pod_name' => pod_name } - ) - - expect(response).to have_gitlab_http_status(:success) - expect(Prometheus::ProxyService).to have_received(:new) - .with(proxyable, 'GET', 'query', expected_params) - end - - context 'with invalid variables' do - let(:params_with_invalid_variables) do - prometheus_proxy_params.merge( - query: 'up{pod_name="{{pod_name}}"}', variables: ['a'] - ) - end - - it 'returns 400' do - get :prometheus_proxy, params: params_with_invalid_variables - - expect(response).to have_gitlab_http_status(:bad_request) - expect(Prometheus::ProxyService).not_to receive(:new) - end - end - end - - context 'with anonymous user' do - let(:prometheus_body) { nil } - - before do - sign_out(user) - end - - it 'redirects to signin page' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to redirect_to(new_user_session_path) - end - end - - context 'with a public project' do - before do - project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - project.project_feature.update!(metrics_dashboard_access_level: ProjectFeature::ENABLED) - end - - context 'with guest user' do - let(:prometheus_body) { nil } - - before do - project.add_guest(user) - end - - it 'returns 404' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - end - end - end -end diff --git a/spec/controllers/projects/prometheus/alerts_controller_spec.rb b/spec/controllers/projects/prometheus/alerts_controller_spec.rb index 44292b9ce194d2ed5c1cf7cd66147f3cad18d44b..3e64631fbf1c02fa3965564d263a088d10291575 100644 --- a/spec/controllers/projects/prometheus/alerts_controller_spec.rb +++ b/spec/controllers/projects/prometheus/alerts_controller_spec.rb @@ -6,7 +6,6 @@ let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:environment) { create(:environment, project: project) } - let_it_be(:metric) { create(:prometheus_metric, project: project) } before do project.add_maintainer(user) @@ -43,16 +42,6 @@ end end - shared_examples 'project non-specific metric' do |status| - let(:other) { create(:prometheus_alert) } - - it "returns #{status}" do - make_request(id: other.prometheus_metric_id) - - expect(response).to have_gitlab_http_status(status) - end - end - describe 'POST #notify' do let(:alert_1) { build(:alert_management_alert, :prometheus, project: project) } let(:alert_2) { build(:alert_management_alert, :prometheus, project: project) } @@ -115,67 +104,7 @@ end end - describe 'GET #metrics_dashboard', feature_category: :metrics do - let!(:alert) do - create(:prometheus_alert, project: project, environment: environment, prometheus_metric: metric) - end - - before do - stub_feature_flags(remove_monitor_metrics: false) - end - - it 'returns a json object with the correct keys' do - get :metrics_dashboard, params: request_params(id: metric.id, environment_id: alert.environment.id), format: :json - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response.keys).to contain_exactly('dashboard', 'status', 'metrics_data') - end - - it 'is the correct embed' do - get :metrics_dashboard, params: request_params(id: metric.id, environment_id: alert.environment.id), format: :json - - title = json_response['dashboard']['panel_groups'][0]['panels'][0]['title'] - - expect(title).to eq(metric.title) - end - - it 'finds the first alert embed without environment_id' do - get :metrics_dashboard, params: request_params(id: metric.id), format: :json - - title = json_response['dashboard']['panel_groups'][0]['panels'][0]['title'] - - expect(title).to eq(metric.title) - end - - it 'returns 404 for non-existant alerts' do - get :metrics_dashboard, params: request_params(id: 0), format: :json - - expect(response).to have_gitlab_http_status(:not_found) - end - - it 'returns 404 when metrics dashboard feature is unavailable' do - stub_feature_flags(remove_monitor_metrics: true) - - get :metrics_dashboard, params: request_params(id: 0), format: :json - - expect(response).to have_gitlab_http_status(:not_found) - end - end - def project_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project) end - - def request_params(opts = {}, defaults = {}) - project_params(opts.reverse_merge(defaults)) - end - - def alert_path(alert) - project_prometheus_alert_path( - project, - alert.prometheus_metric_id, - environment_id: alert.environment, - format: :json - ) - end end diff --git a/spec/features/clusters/cluster_health_dashboard_spec.rb b/spec/features/clusters/cluster_health_dashboard_spec.rb deleted file mode 100644 index e932f8c6b98efb139c7558a68688710d2fa7d88a..0000000000000000000000000000000000000000 --- a/spec/features/clusters/cluster_health_dashboard_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'Cluster Health board', :js, :kubeclient, :use_clean_rails_memory_store_caching, :sidekiq_inline, -feature_category: :deployment_management do - include KubernetesHelpers - include PrometheusHelpers - - let_it_be(:current_user) { create(:user) } - let_it_be(:clusterable) { create(:project) } - let_it_be(:cluster) { create(:cluster, :provided_by_gcp, :project, projects: [clusterable]) } - let_it_be(:cluster_path) { project_cluster_path(clusterable, cluster) } - - before do - stub_feature_flags(remove_monitor_metrics: false) - - clusterable.add_maintainer(current_user) - - sign_in(current_user) - end - - it 'shows cluster board section within the page' do - visit cluster_path - - expect(page).to have_text('Health') - - click_link 'Health' - - expect(page).to have_css('.cluster-health-graphs') - end - - context 'feature remove_monitor_metrics enabled' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'does not show the cluster health tab' do - visit cluster_path - - expect(page).not_to have_text('Health') - end - - it 'does not show the cluster health section' do - visit project_cluster_path(clusterable, cluster, { tab: 'health' }) - - expect(page).not_to have_text('you must first enable Prometheus in the Integrations tab') - end - end - - context 'no prometheus available' do - it 'shows enable Prometheus message' do - visit cluster_path - - click_link 'Health' - - expect(page).to have_text('you must first enable Prometheus in the Integrations tab') - end - end - - context 'when there is cluster with enabled prometheus' do - before do - create(:clusters_integrations_prometheus, enabled: true, cluster: cluster) - stub_kubeclient_discover(cluster.platform.api_url) - end - - context 'waiting for data' do - before do - stub_empty_response - end - - it 'shows container and waiting for data message' do - visit cluster_path - - click_link 'Health' - - wait_for_requests - - expect(page).to have_css('.prometheus-graphs') - expect(page).to have_text('Waiting for performance data') - end - end - - context 'connected, prometheus returns data' do - before do - stub_connected - - visit cluster_path - - click_link 'Health' - - wait_for_requests - end - - it 'renders charts' do - expect(page).to have_css('.prometheus-graphs') - expect(page).to have_css('.prometheus-graph') - expect(page).to have_css('.prometheus-graph-title') - expect(page).to have_css('[_echarts_instance_]') - expect(page).to have_css('.prometheus-graph', count: 2) - expect(page).to have_content('Avg') - end - - it 'focuses the single panel on toggle' do - click_button('More actions', match: :first) - click_button('Expand panel') - - expect(page).to have_css('.prometheus-graph', count: 1) - - click_button('Collapse panel') - - expect(page).to have_css('.prometheus-graph', count: 2) - end - end - - def stub_empty_response - stub_prometheus_request(/prometheus-prometheus-server/, status: 204, body: {}) - stub_prometheus_request(%r{prometheus/api/v1}, status: 204, body: {}) - end - - def stub_connected - stub_prometheus_request(/prometheus-prometheus-server/, body: prometheus_values_body) - stub_prometheus_request(%r{prometheus/api/v1}, body: prometheus_values_body) - end - end -end diff --git a/spec/support/shared_examples/controllers/metrics/dashboard/prometheus_api_proxy_shared_examples.rb b/spec/support/shared_examples/controllers/metrics/dashboard/prometheus_api_proxy_shared_examples.rb deleted file mode 100644 index 9cdde13b36b01994466323ef349ab77754f4e991..0000000000000000000000000000000000000000 --- a/spec/support/shared_examples/controllers/metrics/dashboard/prometheus_api_proxy_shared_examples.rb +++ /dev/null @@ -1,163 +0,0 @@ -# frozen_string_literal: true - -RSpec.shared_examples_for 'metrics dashboard prometheus api proxy' do - let(:service_params) { [proxyable, 'GET', 'query', expected_params] } - let(:service_result) { { status: :success, body: prometheus_body } } - let(:prometheus_proxy_service) { instance_double(Prometheus::ProxyService) } - let(:proxyable_params) do - { - id: proxyable.id.to_s - } - end - - let(:expected_params) do - ActionController::Parameters.new( - prometheus_proxy_params( - proxy_path: 'query', - controller: described_class.controller_path, - action: 'prometheus_proxy' - ) - ).permit! - end - - before do - stub_feature_flags(remove_monitor_metrics: false) - - allow_next_instance_of(Prometheus::ProxyService, *service_params) do |proxy_service| - allow(proxy_service).to receive(:execute).and_return(service_result) - end - end - - context 'with valid requests' do - context 'with success result' do - let(:prometheus_body) { '{"status":"success"}' } - let(:prometheus_json_body) { Gitlab::Json.parse(prometheus_body) } - - it 'returns prometheus response' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(Prometheus::ProxyService).to have_received(:new).with(*service_params) - expect(response).to have_gitlab_http_status(:ok) - expect(json_response).to eq(prometheus_json_body) - end - - context 'with nil query' do - let(:params_without_query) do - prometheus_proxy_params.except(:query) - end - - before do - expected_params.delete(:query) - end - - it 'does not raise error' do - get :prometheus_proxy, params: params_without_query - - expect(Prometheus::ProxyService).to have_received(:new).with(*service_params) - end - end - end - - context 'with nil result' do - let(:service_result) { nil } - - it 'returns 204 no_content' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(json_response['status']).to eq(_('processing')) - expect(json_response['message']).to eq(_('Not ready yet. Try again later.')) - expect(response).to have_gitlab_http_status(:no_content) - end - end - - context 'with 404 result' do - let(:service_result) { { http_status: 404, status: :success, body: '{"body": "value"}' } } - - it 'returns body' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - expect(json_response['body']).to eq('value') - end - end - - context 'with error result' do - context 'with http_status' do - let(:service_result) do - { http_status: :service_unavailable, status: :error, message: 'error message' } - end - - it 'sets the http response status code' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:service_unavailable) - expect(json_response['status']).to eq('error') - expect(json_response['message']).to eq('error message') - end - end - - context 'without http_status' do - let(:service_result) { { status: :error, message: 'error message' } } - - it 'returns bad_request' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['status']).to eq('error') - expect(json_response['message']).to eq('error message') - end - end - end - - context 'when metrics dashboard feature is unavailable' do - before do - stub_feature_flags(remove_monitor_metrics: true) - end - - it 'returns 404 not found' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - expect(response.body).to be_empty - end - end - end - - context 'with inappropriate requests' do - let(:prometheus_body) { nil } - - context 'without correct permissions' do - let(:user2) { create(:user) } - - before do - sign_out(user) - sign_in(user2) - end - - it 'returns 404' do - get :prometheus_proxy, params: prometheus_proxy_params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - end - - context 'with invalid proxyable id' do - let(:prometheus_body) { nil } - - it 'returns 404' do - get :prometheus_proxy, params: prometheus_proxy_params(id: proxyable.id + 1) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - private - - def prometheus_proxy_params(params = {}) - { - proxy_path: 'query', - query: '1' - }.merge(proxyable_params).merge(params) - end -end