Skip to content
代码片段 群组 项目
提交 9fc99cc6 编辑于 作者: Jason Goodman's avatar Jason Goodman 提交者: Bob Van Landuyt
浏览文件

Prevent merging an MR when namespace storage limits are exceeded

Return an error message
上级 7ffc3d09
No related branches found
No related tags found
无相关合并请求
...@@ -50,13 +50,23 @@ def hooks_validation_error(merge_request) ...@@ -50,13 +50,23 @@ def hooks_validation_error(merge_request)
private private
def check_size_limit def check_size_limit
size_checker = merge_request.target_project.repository_size_checker size_checker = target_project_size_checker
if size_checker.above_size_limit? if size_checker.above_size_limit?
raise ::MergeRequests::MergeService::MergeError, size_checker.error_message.merge_error raise ::MergeRequests::MergeService::MergeError, size_checker.error_message.merge_error
end end
end end
def target_project_size_checker
root_namespace = merge_request.target_project.namespace.root_ancestor
if ::EE::Gitlab::Namespaces::Storage::Enforcement.enforce_limit?(root_namespace)
::EE::Namespace::RootStorageSize.new(root_namespace)
else
merge_request.target_project.repository_size_checker
end
end
def check_blocking_mrs def check_blocking_mrs
return unless merge_request.merge_blocked_by_other_mrs? return unless merge_request.merge_blocked_by_other_mrs?
......
...@@ -15,6 +15,11 @@ def commit_error ...@@ -15,6 +15,11 @@ def commit_error
push_error push_error
end end
def merge_error
"This merge request cannot be merged, because the namespace storage limit " \
"of #{formatted(limit)} has been reached."
end
def push_error(change_size = 0) def push_error(change_size = 0)
"Your push to this repository has been rejected because the namespace storage limit " \ "Your push to this repository has been rejected because the namespace storage limit " \
"of #{formatted(limit)} has been reached. " \ "of #{formatted(limit)} has been reached. " \
......
# frozen_string_literal: true
require "spec_helper"
RSpec.describe "Merge request > User merges with namespace storage limits", :js, :saas, :sidekiq_inline do
include NamespaceStorageHelpers
let_it_be(:user) { create(:user) }
let_it_be(:group, refind: true) { create(:group) }
let!(:project) { create(:project, :repository, group: group) }
let!(:merge_request) { create(:merge_request, source_project: project) }
before_all do
create(:gitlab_subscription, :premium, namespace: group)
create(:namespace_root_storage_statistics, namespace: group)
end
before do
project.add_developer(user)
enforce_namespace_storage_limit(group)
set_storage_size_limit(group, megabytes: 10)
sign_in(user)
end
context 'when the namespace storage limit has not been exceeded' do
before do
set_used_storage(group, megabytes: 4)
end
it 'merges the merge request' do
visit(merge_request_path(merge_request))
click_merge_button
expect(page).to have_selector('.gl-badge', text: 'Merged')
end
end
context 'when the namespace storage limit has been exceeded' do
before do
set_used_storage(group, megabytes: 15)
end
it 'does not merge the merge request' do
visit(merge_request_path(merge_request))
click_merge_button
expect(page).to have_text(
'This merge request cannot be merged, because ' \
'the namespace storage limit of 10 MB has been reached'
)
end
end
def click_merge_button
page.within(".mr-state-widget") do
click_button("Merge")
end
end
end
...@@ -26,6 +26,15 @@ ...@@ -26,6 +26,15 @@
end end
end end
describe '#merge_error' do
it 'returns the expected message' do
expected_message = "This merge request cannot be merged, because " \
"the namespace storage limit of 10 MB has been reached."
expect(error_message.merge_error).to eq(expected_message)
end
end
describe '#push_error' do describe '#push_error' do
it 'returns the expected message' do it 'returns the expected message' do
expected_message = "Your push to this repository has been rejected because " \ expected_message = "Your push to this repository has been rejected because " \
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe MergeRequests::MergeService do RSpec.describe MergeRequests::MergeService do
include NamespaceStorageHelpers
let(:user) { create(:user) } let(:user) { create(:user) }
let(:merge_request) { create(:merge_request, :simple) } let(:merge_request) { create(:merge_request, :simple) }
let(:project) { merge_request.project } let(:project) { merge_request.project }
...@@ -15,13 +17,82 @@ ...@@ -15,13 +17,82 @@
describe '#execute' do describe '#execute' do
context 'project has exceeded size limit' do context 'project has exceeded size limit' do
before do before do
allow(project.repository_size_checker).to receive(:above_size_limit?).and_return(true) project.update_attribute(:repository_size_limit, 5)
project.statistics.update!(repository_size: 8)
end
it 'persists the correct error message' do
service.execute(merge_request)
expect(merge_request.merge_error).to eq(
'This merge request cannot be merged, ' \
'because this repository has exceeded its size limit of 5 Bytes by 3 Bytes'
)
end
end
context 'when the namespace storage limit has been exceeded', :saas do
let(:namespace) { project.namespace }
before do
create(:gitlab_subscription, :premium, namespace: namespace)
create(:namespace_root_storage_statistics, namespace: namespace)
enforce_namespace_storage_limit(namespace)
set_storage_size_limit(namespace, megabytes: 4)
set_used_storage(namespace, megabytes: 5)
end
it 'persists the correct error message' do
service.execute(merge_request)
expect(merge_request.merge_error).to eq(
'This merge request cannot be merged, ' \
'because the namespace storage limit of 4 MB has been reached.'
)
end
end
context 'when the repository size limit has been exceeded, but the namespace storage limit has not', :saas do
let(:namespace) { project.namespace }
before do
project.update_attribute(:repository_size_limit, 5)
project.statistics.update!(repository_size: 6)
create(:gitlab_subscription, :premium, namespace: namespace)
create(:namespace_root_storage_statistics, namespace: namespace)
enforce_namespace_storage_limit(namespace)
set_storage_size_limit(namespace, megabytes: 10)
set_used_storage(namespace, megabytes: 7)
end
it 'does not set an error message' do
service.execute(merge_request)
expect(merge_request.merge_error).to be_nil
end
end
context 'when the namespace storage limit has been exceeded and the merge request is for a subgroup project', :saas do
let(:group) { create(:group) }
let(:subgroup) { create(:group, parent: group) }
let(:project) { create(:project, :repository, group: subgroup) }
let(:merge_request) { create(:merge_request, :simple, source_project: project) }
before do
create(:gitlab_subscription, :premium, namespace: group)
create(:namespace_root_storage_statistics, namespace: group)
enforce_namespace_storage_limit(group)
set_storage_size_limit(group, megabytes: 6)
set_used_storage(group, megabytes: 8)
end end
it 'persists the correct error message' do it 'persists the correct error message' do
service.execute(merge_request) service.execute(merge_request)
expect(merge_request.merge_error).to include('This merge request cannot be merged') expect(merge_request.merge_error).to eq(
'This merge request cannot be merged, ' \
'because the namespace storage limit of 6 MB has been reached.'
)
end end
end end
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册