Commit 4dba72cf authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch '35228-move-endpoint-to-copy-common_metrics-yml-to-core' into 'master'

Move endpoint to copy common_metrics.yml to core

See merge request gitlab-org/gitlab!21548
parents 4fe69713 d7ed4700
...@@ -6,13 +6,13 @@ module Projects ...@@ -6,13 +6,13 @@ module Projects
include BlobHelper include BlobHelper
before_action :check_repository_available! before_action :check_repository_available!
before_action :validate_required_params!
before_action :validate_dashboard_template! before_action :validate_dashboard_template!
before_action :authorize_push! before_action :authorize_push!
USER_DASHBOARDS_DIR = ::Metrics::Dashboard::ProjectDashboardService::DASHBOARD_ROOT USER_DASHBOARDS_DIR = ::Metrics::Dashboard::ProjectDashboardService::DASHBOARD_ROOT
DASHBOARD_TEMPLATES = { DASHBOARD_TEMPLATES = {
::Metrics::Dashboard::SystemDashboardService::DASHBOARD_PATH => true, ::Metrics::Dashboard::SystemDashboardService::DASHBOARD_PATH => ::Metrics::Dashboard::SystemDashboardService::DASHBOARD_PATH
::Metrics::Dashboard::ClusterDashboardService::DASHBOARD_PATH => true
}.freeze }.freeze
def create def create
...@@ -29,8 +29,8 @@ module Projects ...@@ -29,8 +29,8 @@ module Projects
def respond_success def respond_success
respond_to do |format| respond_to do |format|
format.html { redirect_to ide_edit_path(project, branch, new_dashboard_path) } format.html { redirect_to ide_edit_path(project, redirect_safe_branch_name, new_dashboard_path) }
format.json { render json: { redirect_to: ide_edit_path(project, branch, new_dashboard_path) }, status: :created } format.json { render json: { redirect_to: ide_edit_path(project, redirect_safe_branch_name, new_dashboard_path) }, status: :created }
end end
end end
...@@ -44,11 +44,15 @@ module Projects ...@@ -44,11 +44,15 @@ module Projects
end end
def authorize_push! def authorize_push!
access_denied!(%q(You can't commit to this project)) unless user_access(project).can_push_to_branch?(branch) access_denied!(%q(You can't commit to this project)) unless user_access(project).can_push_to_branch?(params[:branch])
end end
def branch def validate_required_params!
params.require(:branch) params.require(%i(branch file_name dashboard))
end
def validate_dashboard_template!
access_denied! unless dashboard_template
end end
def dashboard_attrs def dashboard_attrs
...@@ -57,26 +61,36 @@ module Projects ...@@ -57,26 +61,36 @@ module Projects
file_path: new_dashboard_path, file_path: new_dashboard_path,
file_content: new_dashboard_content, file_content: new_dashboard_content,
encoding: 'text', encoding: 'text',
branch_name: branch, branch_name: params[:branch],
start_branch: repository.branch_exists?(branch) ? branch : project.default_branch start_branch: repository.branch_exists?(params[:branch]) ? params[:branch] : project.default_branch
} }
end end
def commit_message def commit_message
params[:commit_message] || "Create custom dashboard #{params.require(:file_name)}" params[:commit_message] || "Create custom dashboard #{params[:file_name]}"
end end
def new_dashboard_path def new_dashboard_path
File.join(USER_DASHBOARDS_DIR, params.require(:file_name)) File.join(USER_DASHBOARDS_DIR, params[:file_name])
end end
def new_dashboard_content def new_dashboard_content
File.read params.require(:dashboard) File.read(Rails.root.join(dashboard_template))
end end
def validate_dashboard_template! def dashboard_template
access_denied! unless DASHBOARD_TEMPLATES[params.require(:dashboard)] dashboard_templates[params[:dashboard]]
end
def dashboard_templates
DASHBOARD_TEMPLATES
end
def redirect_safe_branch_name
repository.find_branch(params[:branch]).name
end end
end end
end end
end end
Projects::PerformanceMonitoring::DashboardsController.prepend_if_ee('EE::Projects::PerformanceMonitoring::DashboardsController')
...@@ -259,6 +259,10 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do ...@@ -259,6 +259,10 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end end
end end
namespace :performance_monitoring do
resources :dashboards, only: [:create]
end
namespace :error_tracking do namespace :error_tracking do
resources :projects, only: :index resources :projects, only: :index
end end
......
# frozen_string_literal: true
module EE
module Projects
module PerformanceMonitoring
module DashboardsController
extend ::Gitlab::Utils::Override
DASHBOARD_TEMPLATES = {
::Metrics::Dashboard::SystemDashboardService::DASHBOARD_PATH => ::Metrics::Dashboard::SystemDashboardService::DASHBOARD_PATH,
::Metrics::Dashboard::ClusterDashboardService::DASHBOARD_PATH => ::Metrics::Dashboard::ClusterDashboardService::DASHBOARD_PATH
}.freeze
private
override :dashboard_templates
def dashboard_templates
DASHBOARD_TEMPLATES
end
end
end
end
end
...@@ -60,10 +60,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do ...@@ -60,10 +60,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :subscriptions, only: [:create, :destroy] resources :subscriptions, only: [:create, :destroy]
namespace :performance_monitoring do
resources :dashboards, only: [:create]
end
resources :licenses, only: [:index, :create, :update] resources :licenses, only: [:index, :create, :update]
resource :threat_monitoring, only: [:show], controller: :threat_monitoring resource :threat_monitoring, only: [:show], controller: :threat_monitoring
......
...@@ -6,8 +6,10 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -6,8 +6,10 @@ describe Projects::PerformanceMonitoring::DashboardsController do
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
let_it_be(:namespace) { create(:namespace) } let_it_be(:namespace) { create(:namespace) }
let!(:project) { create(:project, :repository, name: 'dashboard-project', namespace: namespace) } let!(:project) { create(:project, :repository, name: 'dashboard-project', namespace: namespace) }
let(:repository) { project.repository }
let(:branch) { double(name: branch_name) }
let(:commit_message) { 'test' } let(:commit_message) { 'test' }
let(:branch) { "#{Time.current.to_i}_dashboard_new_branch" } let(:branch_name) { "#{Time.current.to_i}_dashboard_new_branch" }
let(:dashboard) { 'config/prometheus/common_metrics.yml' } let(:dashboard) { 'config/prometheus/common_metrics.yml' }
let(:file_name) { 'custom_dashboard.yml' } let(:file_name) { 'custom_dashboard.yml' }
let(:params) do let(:params) do
...@@ -17,7 +19,7 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -17,7 +19,7 @@ describe Projects::PerformanceMonitoring::DashboardsController do
dashboard: dashboard, dashboard: dashboard,
file_name: file_name, file_name: file_name,
commit_message: commit_message, commit_message: commit_message,
branch: branch, branch: branch_name,
format: :json format: :json
} }
end end
...@@ -35,30 +37,44 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -35,30 +37,44 @@ describe Projects::PerformanceMonitoring::DashboardsController do
end end
context 'valid parameters' do context 'valid parameters' do
it 'delegates commit creation to service' do ['config/prometheus/common_metrics.yml', 'ee/config/prometheus/cluster_metrics.yml'].each do |dashboard_template|
dashboard_attrs = { context "dashboard template #{dashboard_template}" do
commit_message: commit_message, let(:dashboard) { dashboard_template }
branch_name: branch,
start_branch: 'master', it 'delegates commit creation to service' do
encoding: 'text', allow(controller).to receive(:repository).and_return(repository)
file_path: '.gitlab/dashboards/custom_dashboard.yml', allow(repository).to receive(:find_branch).and_return(branch)
file_content: File.read('config/prometheus/common_metrics.yml') dashboard_attrs = {
} commit_message: commit_message,
branch_name: branch_name,
start_branch: 'master',
encoding: 'text',
file_path: '.gitlab/dashboards/custom_dashboard.yml',
file_content: File.read(dashboard)
}
service_instance = instance_double(::Files::CreateService)
expect(::Files::CreateService).to receive(:new).with(project, user, dashboard_attrs).and_return(service_instance)
expect(service_instance).to receive(:execute).and_return(status: :success)
service_instance = instance_double(::Files::CreateService) post :create, params: params
expect(::Files::CreateService).to receive(:new).with(project, user, dashboard_attrs).and_return(service_instance) end
expect(service_instance).to receive(:execute).and_return(status: :success) end
end
it 'extends dashboard template path to absolute url' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success }))
allow(controller).to receive(:repository).and_return(repository)
allow(repository).to receive(:find_branch).and_return(branch)
expect(File).to receive(:read).with(Rails.root.join('config/prometheus/common_metrics.yml')).and_return('')
post :create, params: params post :create, params: params
end end
context 'selected branch already exists' do context 'selected branch already exists' do
it 'responds with :created status code', :aggregate_failures do it 'responds with :created status code', :aggregate_failures do
post :create, params: params repository.add_branch(user, branch_name, 'master')
expect(response).to have_gitlab_http_status :created
params[:file_name] = 'some_new_name.yml'
post :create, params: params post :create, params: params
...@@ -69,11 +85,14 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -69,11 +85,14 @@ describe Projects::PerformanceMonitoring::DashboardsController do
context 'request format json' do context 'request format json' do
it 'returns path to new file' do it 'returns path to new file' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success })) allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success }))
allow(controller).to receive(:repository).and_return(repository)
expect(repository).to receive(:find_branch).with(branch_name).and_return(branch)
post :create, params: params post :create, params: params
expect(response).to have_gitlab_http_status :created expect(response).to have_gitlab_http_status :created
expect(json_response).to eq('redirect_to' => "/-/ide/project/#{namespace.path}/#{project.name}/edit/#{branch}/-/.gitlab/dashboards/#{file_name}") expect(json_response).to eq('redirect_to' => "/-/ide/project/#{namespace.path}/#{project.name}/edit/#{branch_name}/-/.gitlab/dashboards/#{file_name}")
end end
context 'files create service failure' do context 'files create service failure' do
...@@ -96,10 +115,13 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -96,10 +115,13 @@ describe Projects::PerformanceMonitoring::DashboardsController do
it 'redirects to ide with new file' do it 'redirects to ide with new file' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success })) allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success }))
allow(controller).to receive(:repository).and_return(repository)
expect(repository).to receive(:find_branch).with(branch_name).and_return(branch)
post :create, params: params post :create, params: params
expect(response).to redirect_to "/-/ide/project/#{namespace.path}/#{project.name}/edit/#{branch}/-/.gitlab/dashboards/#{file_name}" expect(response).to redirect_to "/-/ide/project/#{namespace.path}/#{project.name}/edit/#{branch_name}/-/.gitlab/dashboards/#{file_name}"
end end
context 'files create service failure' do context 'files create service failure' do
...@@ -131,9 +153,11 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -131,9 +153,11 @@ describe Projects::PerformanceMonitoring::DashboardsController do
end end
it 'use default commit message' do it 'use default commit message' do
allow(controller).to receive(:repository).and_return(repository)
allow(repository).to receive(:find_branch).and_return(branch)
dashboard_attrs = { dashboard_attrs = {
commit_message: 'Create custom dashboard custom_dashboard.yml', commit_message: 'Create custom dashboard custom_dashboard.yml',
branch_name: branch, branch_name: branch_name,
start_branch: 'master', start_branch: 'master',
encoding: 'text', encoding: 'text',
file_path: ".gitlab/dashboards/custom_dashboard.yml", file_path: ".gitlab/dashboards/custom_dashboard.yml",
...@@ -149,7 +173,7 @@ describe Projects::PerformanceMonitoring::DashboardsController do ...@@ -149,7 +173,7 @@ describe Projects::PerformanceMonitoring::DashboardsController do
end end
context 'missing branch' do context 'missing branch' do
let(:branch) { nil } let(:branch_name) { nil }
it 'raises ActionController::ParameterMissing' do it 'raises ActionController::ParameterMissing' do
expect { post :create, params: params }.to raise_error ActionController::ParameterMissing expect { post :create, params: params }.to raise_error ActionController::ParameterMissing
......
# frozen_string_literal: true
require 'spec_helper'
describe Projects::PerformanceMonitoring::DashboardsController do
let_it_be(:user) { create(:user) }
let_it_be(:namespace) { create(:namespace) }
let!(:project) { create(:project, :repository, name: 'dashboard-project', namespace: namespace) }
let(:repository) { project.repository }
let(:branch) { double(name: branch_name) }
let(:commit_message) { 'test' }
let(:branch_name) { "#{Time.current.to_i}_dashboard_new_branch" }
let(:dashboard) { 'config/prometheus/common_metrics.yml' }
let(:file_name) { 'custom_dashboard.yml' }
let(:params) do
{
namespace_id: namespace,
project_id: project,
dashboard: dashboard,
file_name: file_name,
commit_message: commit_message,
branch: branch_name,
format: :json
}
end
describe 'POST #create' do
context 'authenticated user' do
before do
sign_in(user)
end
context 'project with repository feature' do
context 'with rights to push to the repository' do
before do
project.add_maintainer(user)
end
context 'valid parameters' do
it 'delegates commit creation to service' do
allow(controller).to receive(:repository).and_return(repository)
allow(repository).to receive(:find_branch).and_return(branch)
dashboard_attrs = {
commit_message: commit_message,
branch_name: branch_name,
start_branch: 'master',
encoding: 'text',
file_path: '.gitlab/dashboards/custom_dashboard.yml',
file_content: File.read('config/prometheus/common_metrics.yml')
}
service_instance = instance_double(::Files::CreateService)
expect(::Files::CreateService).to receive(:new).with(project, user, dashboard_attrs).and_return(service_instance)
expect(service_instance).to receive(:execute).and_return(status: :success)
post :create, params: params
end
it 'extends dashboard template path to absolute url' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success }))
allow(controller).to receive(:repository).and_return(repository)
allow(repository).to receive(:find_branch).and_return(branch)
expect(File).to receive(:read).with(Rails.root.join('config/prometheus/common_metrics.yml')).and_return('')
post :create, params: params
end
context 'selected branch already exists' do
it 'responds with :created status code', :aggregate_failures do
repository.add_branch(user, branch_name, 'master')
post :create, params: params
expect(response).to have_gitlab_http_status :created
end
end
context 'request format json' do
it 'returns path to new file' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success }))
allow(controller).to receive(:repository).and_return(repository)
expect(repository).to receive(:find_branch).with(branch_name).and_return(branch)
post :create, params: params
expect(response).to have_gitlab_http_status :created
expect(json_response).to eq('redirect_to' => "/-/ide/project/#{namespace.path}/#{project.name}/edit/#{branch_name}/-/.gitlab/dashboards/#{file_name}")
end
context 'files create service failure' do
it 'returns json with failure message' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: false, message: 'something went wrong' }))
post :create, params: params
expect(response).to have_gitlab_http_status :bad_request
expect(response).to set_flash[:alert].to eq('something went wrong')
expect(json_response).to eq('error' => 'something went wrong')
end
end
end
context 'request format html' do
before do
params.delete(:format)
end
it 'redirects to ide with new file' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: :success }))
allow(controller).to receive(:repository).and_return(repository)
expect(repository).to receive(:find_branch).with(branch_name).and_return(branch)
post :create, params: params
expect(response).to redirect_to "/-/ide/project/#{namespace.path}/#{project.name}/edit/#{branch_name}/-/.gitlab/dashboards/#{file_name}"
end
context 'files create service failure' do
it 'redirects back and sets alert' do
allow(::Files::CreateService).to receive(:new).and_return(double(execute: { status: false, message: 'something went wrong' }))
allow(controller).to receive(:repository).and_return(repository)
allow(repository).to receive(:find_branch).and_return(branch)
post :create, params: params
expect(response).to set_flash[:alert].to eq('something went wrong')
expect(response).to redirect_to namespace_project_environments_path
end
end
end
end
context 'invalid dashboard template' do
let(:dashboard) { 'config/database.yml' }
it 'responds 404 not found' do
post :create, params: params
expect(response).to have_gitlab_http_status :not_found
end
end
context 'missing commit message' do
before do
params.delete(:commit_message)
end
it 'use default commit message' do
allow(controller).to receive(:repository).and_return(repository)
allow(repository).to receive(:find_branch).and_return(branch)
dashboard_attrs = {
commit_message: 'Create custom dashboard custom_dashboard.yml',
branch_name: branch_name,
start_branch: 'master',
encoding: 'text',
file_path: ".gitlab/dashboards/custom_dashboard.yml",
file_content: File.read('config/prometheus/common_metrics.yml')
}
service_instance = instance_double(::Files::CreateService)
expect(::Files::CreateService).to receive(:new).with(project, user, dashboard_attrs).and_return(service_instance)
expect(service_instance).to receive(:execute).and_return(status: :success)
post :create, params: params
end
end
context 'missing branch' do
let(:branch_name) { nil }
it 'raises ActionController::ParameterMissing' do
expect { post :create, params: params }.to raise_error ActionController::ParameterMissing
end
end
end
context 'without rights to push to repository' do
before do
project.add_guest(user)
end
it 'responds with :forbidden status code' do
post :create, params: params
expect(response).to have_gitlab_http_status :forbidden
end
end
end
context 'project without repository feature' do
let!(:project) { create(:project, name: 'dashboard-project', namespace: namespace) }
it 'responds with :not_found status code' do
post :create, params: params
expect(response).to have_gitlab_http_status :not_found
end
end
end
end
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