diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb index b82b601541c53f908f4d3c2dea24ed1014b07133..c6c5c30cbf736557f835c3dcde687e7b72429fb2 100644 --- a/app/finders/template_finder.rb +++ b/app/finders/template_finder.rb @@ -16,16 +16,27 @@ class << self def build(type, project, params = {}) if type.to_s == 'licenses' LicenseTemplateFinder.new(project, params) # rubocop: disable CodeReuse/Finder - else + elsif type_allowed?(type) new(type, project, params) end end def all_template_names(project, type) - return {} if !VENDORED_TEMPLATES.key?(type.to_s) && type.to_s != 'licenses' + return {} unless type_allowed?(type) build(type, project).template_names end + + def type_allowed?(type) + case type.to_s + when 'licenses' + true + when 'metrics_dashboard_ymls' + !Feature.enabled?(:remove_monitor_metrics) + else + VENDORED_TEMPLATES.key?(type) + end + end end attr_reader :type, :project, :params diff --git a/app/models/blob_viewer/metrics_dashboard_yml.rb b/app/models/blob_viewer/metrics_dashboard_yml.rb index 4b7a178566cb28fd63d54361c35b61ff2e276fdf..b63f30221989955ec8c7a4874b0f9ed2f6d80f5b 100644 --- a/app/models/blob_viewer/metrics_dashboard_yml.rb +++ b/app/models/blob_viewer/metrics_dashboard_yml.rb @@ -11,6 +11,10 @@ class MetricsDashboardYml < Base self.file_types = %i(metrics_dashboard) self.binary = false + def self.can_render?(blob, verify_binary: true) + super && !Feature.enabled?(:remove_monitor_metrics) + end + def valid? errors.blank? end diff --git a/lib/api/project_templates.rb b/lib/api/project_templates.rb index 8ec67988e399d826d8ed26914e39686118ae1cf1..2360a7e6b2a0de6c7124d805031a9b1f5baef702 100644 --- a/lib/api/project_templates.rb +++ b/lib/api/project_templates.rb @@ -32,6 +32,8 @@ class ProjectTemplates < ::API::Base use :pagination end get ':id/templates/:type' do + bad_request! if params[:type] == 'metrics_dashboard_ymls' && Feature.enabled?(:remove_monitor_metrics) + templates = TemplateFinder.all_template_names(user_project, params[:type]).values.flatten present paginate(::Kaminari.paginate_array(templates)), with: Entities::TemplatesList @@ -60,6 +62,8 @@ class ProjectTemplates < ::API::Base end get ':id/templates/:type/:name', requirements: TEMPLATE_NAMES_ENDPOINT_REQUIREMENTS do + bad_request! if params[:type] == 'metrics_dashboard_ymls' && Feature.enabled?(:remove_monitor_metrics) + begin template = TemplateFinder.build( params[:type], diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb index 74e5dc9f8c30c82e59df897039687adde5f81380..cd1dde55e307249e41cf218ca0555e64c7952bde 100644 --- a/spec/features/projects/blobs/blob_show_spec.rb +++ b/spec/features/projects/blobs/blob_show_spec.rb @@ -580,7 +580,11 @@ def switch_ref_to(ref_name) end describe '.gitlab/dashboards/custom-dashboard.yml' do + let(:remove_monitor_metrics) { false } + before do + stub_feature_flags(remove_monitor_metrics: remove_monitor_metrics) + project.add_maintainer(project.creator) Files::CreateService.new( @@ -608,6 +612,15 @@ def switch_ref_to(ref_name) expect(page).to have_link('Learn more') end end + + context 'when metrics dashboard feature is unavailable' do + let(:remove_monitor_metrics) { true } + + it 'displays the blob without an auxiliary viewer' do + expect(page).to have_content('Environment metrics') + expect(page).not_to have_content('Metrics Dashboard YAML definition', wait: 0) + end + end end context 'invalid dashboard file' do diff --git a/spec/finders/template_finder_spec.rb b/spec/finders/template_finder_spec.rb index 21fea7863ffc48b2b6404bec842cadad9b35a2fc..c466f533a614b8eb23b53dd215e9dc44e8505813 100644 --- a/spec/finders/template_finder_spec.rb +++ b/spec/finders/template_finder_spec.rb @@ -103,6 +103,10 @@ describe '#build' do let(:project) { build_stubbed(:project) } + before do + stub_feature_flags(remove_monitor_metrics: false) + end + where(:type, :expected_class) do :dockerfiles | described_class :gitignores | described_class @@ -119,6 +123,16 @@ it { is_expected.to be_a(expected_class) } it { expect(finder.project).to eq(project) } end + + context 'when metrics dashboard is unavailable' do + before do + stub_feature_flags(remove_monitor_metrics: true) + end + + subject(:finder) { described_class.build(:metrics_dashboard_ymls, project) } + + it { is_expected.to be_nil } + end end describe '#execute' do diff --git a/spec/models/blob_viewer/metrics_dashboard_yml_spec.rb b/spec/models/blob_viewer/metrics_dashboard_yml_spec.rb index d28fa0bbe97c4415cf8be48c579c5549cc219fb5..c9ac13eefc094324959b74772fbce9a78b62e2f3 100644 --- a/spec/models/blob_viewer/metrics_dashboard_yml_spec.rb +++ b/spec/models/blob_viewer/metrics_dashboard_yml_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe BlobViewer::MetricsDashboardYml do +RSpec.describe BlobViewer::MetricsDashboardYml, feature_category: :metrics do include FakeBlobHelpers include RepoHelpers @@ -119,4 +119,18 @@ expect(viewer.errors).to eq ["YAML syntax: The parsed YAML is too big"] end end + + describe '.can_render?' do + subject { described_class.can_render?(blob) } + + it { is_expected.to be false } + + context 'when metrics dashboard feature is available' do + before do + stub_feature_flags(remove_monitor_metrics: false) + end + + it { is_expected.to be true } + end + end end diff --git a/spec/requests/api/project_templates_spec.rb b/spec/requests/api/project_templates_spec.rb index 38d6a05a10440b281fe723763460f6e4dd865b34..91e5ed76c37a03ceb01d8164aca35f7222965bbe 100644 --- a/spec/requests/api/project_templates_spec.rb +++ b/spec/requests/api/project_templates_spec.rb @@ -10,6 +10,7 @@ let(:url_encoded_path) { "#{public_project.namespace.path}%2F#{public_project.path}" } before do + stub_feature_flags(remove_monitor_metrics: false) private_project.add_developer(developer) end @@ -71,6 +72,18 @@ expect(json_response).to satisfy_one { |template| template['key'] == 'Default' } end + context 'when metrics dashboard feature is unavailable' do + before do + stub_feature_flags(remove_monitor_metrics: true) + end + + it 'returns 400 bad request like other unknown types' do + get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls") + + expect(response).to have_gitlab_http_status(:bad_request) + end + end + it 'returns issue templates' do get api("/projects/#{private_project.id}/templates/issues", developer) @@ -171,6 +184,18 @@ expect(json_response['name']).to eq('Default') end + context 'when metrics dashboard feature is unavailable' do + before do + stub_feature_flags(remove_monitor_metrics: true) + end + + it 'returns 400 bad request like other unknown types' do + get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls/Default") + + expect(response).to have_gitlab_http_status(:bad_request) + end + end + it 'returns a specific license' do get api("/projects/#{public_project.id}/templates/licenses/mit")