diff options
author | Sarah Yasonik <syasonik@gitlab.com> | 2019-05-01 10:16:03 +0000 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2019-05-01 10:16:03 +0000 |
commit | 552a3d2fd939d3f8a56cfad9fad62227c1d5aa89 (patch) | |
tree | d10ce5f4615b0e9dbeb7543736984b3e3ff10dbb /spec/controllers | |
parent | d7b75b661f8ed2468a322c4ae55eadcbdb3b2615 (diff) | |
download | gitlab-ce-552a3d2fd939d3f8a56cfad9fad62227c1d5aa89.tar.gz |
Update metrics dashboard API to load yml from repo
Updates the EnvironmentController#metrics_dashboard endpoint
to support a "dashboard" param, which can be used to specify
the filepath of a dashboard configuration from a project
repository. Dashboard configurations are expected to be
stored in .gitlab/dashboards/.
Updates dashboard post-processing steps to exclude custom
metrics, which should only display on the system dashboard.
Diffstat (limited to 'spec/controllers')
-rw-r--r-- | spec/controllers/projects/environments_controller_spec.rb | 91 |
1 files changed, 84 insertions, 7 deletions
diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb index a62422d0229..cf23d937037 100644 --- a/spec/controllers/projects/environments_controller_spec.rb +++ b/spec/controllers/projects/environments_controller_spec.rb @@ -474,25 +474,102 @@ describe Projects::EnvironmentsController do end end - context 'when prometheus endpoint is enabled' do + shared_examples_for '200 response' do |contains_all_dashboards: false| + let(:expected_keys) { %w(dashboard status) } + + before do + expected_keys << 'all_dashboards' if contains_all_dashboards + end + it 'returns a json representation of the environment dashboard' do - get :metrics_dashboard, params: environment_params(format: :json) + get :metrics_dashboard, params: environment_params(dashboard_params) expect(response).to have_gitlab_http_status(:ok) - expect(json_response.keys).to contain_exactly('dashboard', 'status') + expect(json_response.keys).to contain_exactly(*expected_keys) expect(json_response['dashboard']).to be_an_instance_of(Hash) end + end + + shared_examples_for 'error response' do |status_code, contains_all_dashboards: false| + let(:expected_keys) { %w(message status) } + + before do + expected_keys << 'all_dashboards' if contains_all_dashboards + end + + it 'returns an error response' do + get :metrics_dashboard, params: environment_params(dashboard_params) + + expect(response).to have_gitlab_http_status(status_code) + expect(json_response.keys).to contain_exactly(*expected_keys) + end + end + + shared_examples_for 'has all dashboards' do + it 'includes an index of all available dashboards' do + get :metrics_dashboard, params: environment_params(dashboard_params) + + expect(json_response.keys).to include('all_dashboards') + expect(json_response['all_dashboards']).to be_an_instance_of(Array) + expect(json_response['all_dashboards']).to all( include('path', 'default') ) + end + end + + context 'when multiple dashboards is disabled' do + before do + stub_feature_flags(environment_metrics_show_multiple_dashboards: false) + end + + let(:dashboard_params) { { format: :json } } + + it_behaves_like '200 response' context 'when the dashboard could not be provided' do before do allow(YAML).to receive(:safe_load).and_return({}) end - it 'returns an error response' do - get :metrics_dashboard, params: environment_params(format: :json) + it_behaves_like 'error response', :unprocessable_entity + end + + context 'when a dashboard param is specified' do + let(:dashboard_params) { { format: :json, dashboard: '.gitlab/dashboards/not_there_dashboard.yml' } } + + it_behaves_like '200 response' + end + end + + context 'when multiple dashboards is enabled' do + let(:dashboard_params) { { format: :json } } + + it_behaves_like '200 response', contains_all_dashboards: true + it_behaves_like 'has all dashboards' + + context 'when a dashboard could not be provided' do + before do + allow(YAML).to receive(:safe_load).and_return({}) + end + + it_behaves_like 'error response', :unprocessable_entity, contains_all_dashboards: true + it_behaves_like 'has all dashboards' + end + + context 'when a dashboard param is specified' do + let(:dashboard_params) { { format: :json, dashboard: '.gitlab/dashboards/test.yml' } } + + context 'when the dashboard is available' do + let(:dashboard_yml) { fixture_file('lib/gitlab/metrics/dashboard/sample_dashboard.yml') } + let(:dashboard_file) { { '.gitlab/dashboards/test.yml' => dashboard_yml } } + let(:project) { create(:project, :custom_repo, files: dashboard_file) } + let(:environment) { create(:environment, name: 'production', project: project) } + + it_behaves_like '200 response', contains_all_dashboards: true + it_behaves_like 'has all dashboards' + end - expect(response).to have_gitlab_http_status(:unprocessable_entity) - expect(json_response.keys).to contain_exactly('message', 'status', 'http_status') + context 'when the dashboard does not exist' do + it_behaves_like 'error response', :not_found, contains_all_dashboards: true + it_behaves_like 'has all dashboards' end end end |