Commit 4c9d84e0 authored by Oswaldo Ferreira's avatar Oswaldo Ferreira

Show correct exceeding limit on LFS push

parent cb8df09f
...@@ -122,7 +122,7 @@ module LfsRequest ...@@ -122,7 +122,7 @@ module LfsRequest
def render_size_error def render_size_error
render( render(
json: { json: {
message: Gitlab::RepositorySizeError.new(project).push_error, message: Gitlab::RepositorySizeError.new(project).push_error(@exceeded_limit),
documentation_url: help_url, documentation_url: help_url,
}, },
content_type: "application/vnd.git-lfs+json", content_type: "application/vnd.git-lfs+json",
...@@ -134,9 +134,11 @@ module LfsRequest ...@@ -134,9 +134,11 @@ module LfsRequest
return false unless project.size_limit_enabled? return false unless project.size_limit_enabled?
return @limit_exceeded if defined?(@limit_exceeded) return @limit_exceeded if defined?(@limit_exceeded)
size_of_objects = objects.sum { |o| o[:size] } lfs_push_size = objects.sum { |o| o[:size] }
size_with_lfs_push = project.repository_and_lfs_size + lfs_push_size
@limit_exceeded = (project.repository_and_lfs_size + size_of_objects) > project.actual_size_limit @exceeded_limit = size_with_lfs_push - project.actual_size_limit
@limit_exceeded = @exceeded_limit > 0
end end
end end
......
...@@ -20,8 +20,8 @@ module Gitlab ...@@ -20,8 +20,8 @@ module Gitlab
"This merge request cannot be merged, #{base_message}" "This merge request cannot be merged, #{base_message}"
end end
def push_error def push_error(exceeded_limit = nil)
"Your push has been rejected, #{base_message}. #{more_info_message}" "Your push has been rejected, #{base_message(exceeded_limit)}. #{more_info_message}"
end end
def new_changes_error def new_changes_error
...@@ -38,8 +38,8 @@ module Gitlab ...@@ -38,8 +38,8 @@ module Gitlab
private private
def base_message def base_message(exceeded_limit = nil)
"because this repository has exceeded its size limit of #{limit} by #{size_to_remove}" "because this repository has exceeded its size limit of #{limit} by #{size_to_remove(exceeded_limit)}"
end end
def current_size def current_size
...@@ -50,8 +50,8 @@ module Gitlab ...@@ -50,8 +50,8 @@ module Gitlab
format_number(project.actual_size_limit) format_number(project.actual_size_limit)
end end
def size_to_remove def size_to_remove(exceeded_limit = nil)
format_number(project.size_to_remove) format_number(exceeded_limit || project.size_to_remove)
end end
def format_number(number) def format_number(number)
......
...@@ -32,8 +32,22 @@ describe Gitlab::RepositorySizeError, lib: true do ...@@ -32,8 +32,22 @@ describe Gitlab::RepositorySizeError, lib: true do
end end
describe '#push_error' do describe '#push_error' do
it 'returns the correct message' do context 'with exceeded_limit value' do
expect(message.push_error).to eq("Your push has been rejected, #{base_message}. #{message.more_info_message}") let(:rejection_message) do
'because this repository has exceeded its size limit of 10 MB by 15 MB'
end
it 'returns the correct message' do
expect(message.push_error(15.megabytes))
.to eq("Your push has been rejected, #{rejection_message}. #{message.more_info_message}")
end
end
context 'without exceeded_limit value' do
it 'returns the correct message' do
expect(message.push_error)
.to eq("Your push has been rejected, #{base_message}. #{message.more_info_message}")
end
end end
end end
......
...@@ -663,11 +663,14 @@ describe 'Git LFS API and storage' do ...@@ -663,11 +663,14 @@ describe 'Git LFS API and storage' do
end end
context 'when pushing a lfs object that does not exist' do context 'when pushing a lfs object that does not exist' do
let(:sample_size) { 150.megabytes }
let(:sample_oid) { '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897' }
let(:body) do let(:body) do
{ 'operation' => 'upload', { 'operation' => 'upload',
'objects' => [ 'objects' => [
{ 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', { 'oid' => sample_oid,
'size' => 157507855 'size' => sample_size
}] }]
} }
end end
...@@ -678,31 +681,43 @@ describe 'Git LFS API and storage' do ...@@ -678,31 +681,43 @@ describe 'Git LFS API and storage' do
it 'responds with upload hypermedia link' do it 'responds with upload hypermedia link' do
expect(json_response['objects']).to be_kind_of(Array) expect(json_response['objects']).to be_kind_of(Array)
expect(json_response['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") expect(json_response['objects'].first['oid']).to eq(sample_oid)
expect(json_response['objects'].first['size']).to eq(157507855) expect(json_response['objects'].first['size']).to eq(sample_size)
expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}.git/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/157507855") expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}")
expect(json_response['objects'].first['actions']['upload']['header']).to eq('Authorization' => authorization) expect(json_response['objects'].first['actions']['upload']['header']).to eq('Authorization' => authorization)
end end
context 'and project is above the limit' do context 'and project is above the limit' do
let(:update_lfs_permissions) do let(:update_lfs_permissions) do
allow_any_instance_of(Project).to receive(:above_size_limit?).and_return(true) allow_any_instance_of(Project).to receive_messages(
repository_and_lfs_size: 100.megabytes,
actual_size_limit: 99.megabytes)
end end
it 'responds with status 406' do it 'responds with status 406' do
expect(response).to have_http_status(406) expect(response).to have_http_status(406)
end end
it 'show correct error message' do
expect(json_response['message']).to eql('Your push has been rejected, because this repository has exceeded its size limit of 99 MB by 1 MB. Please contact your GitLab administrator for more information.')
end
end end
context 'and project will go over the limit' do context 'and project will go over the limit' do
let(:update_lfs_permissions) do let(:update_lfs_permissions) do
allow_any_instance_of(Project).to receive_messages(actual_size_limit: 145, size_limit_enabled?: true) allow_any_instance_of(Project).to receive_messages(
repository_and_lfs_size: 200.megabytes,
actual_size_limit: 300.megabytes)
end end
it 'responds with status 406' do it 'responds with status 406' do
expect(response).to have_http_status(406) expect(response).to have_http_status(406)
expect(json_response['documentation_url']).to include('/help') expect(json_response['documentation_url']).to include('/help')
end end
it 'show correct error message' do
expect(json_response['message']).to eql('Your push has been rejected, because this repository has exceeded its size limit of 300 MB by 50 MB. Please contact your GitLab administrator for more information.')
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