Commit 97cc5dce authored by Corinna Wiesner's avatar Corinna Wiesner Committed by Markus Koller

Check if feature flag is enabled for namespace

The feature flag :additional_repo_storage_by_namespace check in
EE::Gitlab::RepositorySizeChecker was done globally. Now it will check
if it's enabled for the given namespace.
parent fa79e06f
......@@ -283,8 +283,7 @@ class Snippet < ApplicationRecord
::Gitlab::RepositorySizeChecker.new(
current_size_proc: -> { repository.size.megabytes },
limit: Gitlab::CurrentSettings.snippet_size_limit,
total_repository_size_excess: nil,
additional_purchased_storage: nil
namespace: nil
)
end
end
......
......@@ -532,8 +532,7 @@ module EE
::Gitlab::RepositorySizeChecker.new(
current_size_proc: -> { statistics.total_repository_size },
limit: actual_size_limit,
total_repository_size_excess: namespace.total_repository_size_excess,
additional_purchased_storage: namespace.additional_purchased_storage_size.megabytes,
namespace: namespace,
enabled: License.feature_available?(:repository_size_limit)
)
end
......
......@@ -16,8 +16,7 @@ module EE
::Gitlab::RepositorySizeChecker.new(
current_size_proc: -> { repository.size.megabytes },
limit: ::Gitlab::CurrentSettings.snippet_size_limit,
total_repository_size_excess: project&.namespace&.total_repository_size_excess,
additional_purchased_storage: project&.namespace&.additional_purchased_storage_size&.megabytes
namespace: project&.namespace
)
end
end
......
......@@ -27,7 +27,15 @@ module EE
def additional_repo_storage_available?
return false unless ::Gitlab::CurrentSettings.automatic_purchased_storage_allocation?
::Feature.enabled?(:additional_repo_storage_by_namespace)
::Feature.enabled?(:additional_repo_storage_by_namespace, namespace)
end
def total_repository_size_excess
namespace&.total_repository_size_excess.to_i
end
def additional_purchased_storage
namespace&.additional_purchased_storage_size&.megabytes.to_i
end
def remaining_additional_purchased_storage
......
......@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::RepositorySizeChecker do
let(:current_size) { 0 }
let(:limit) { 50 }
let(:namespace) { build(:namespace, additional_purchased_storage_size: additional_purchased_storage) }
let(:total_repository_size_excess) { 0 }
let(:additional_purchased_storage) { 0 }
let(:enabled) { true }
......@@ -12,16 +13,17 @@ RSpec.describe Gitlab::RepositorySizeChecker do
subject do
described_class.new(
current_size_proc: -> { current_size },
limit: limit,
total_repository_size_excess: total_repository_size_excess,
additional_purchased_storage: additional_purchased_storage,
current_size_proc: -> { current_size.megabytes },
limit: limit.megabytes,
namespace: namespace,
enabled: enabled
)
end
before do
allow(Gitlab::CurrentSettings).to receive(:automatic_purchased_storage_allocation?).and_return(gitlab_setting_enabled)
allow(namespace).to receive(:total_repository_size_excess).and_return(total_repository_size_excess.megabytes)
end
describe '#above_size_limit?' do
......@@ -33,13 +35,14 @@ RSpec.describe Gitlab::RepositorySizeChecker do
end
context 'with feature flag :additional_repo_storage_by_namespace enabled' do
shared_examples 'feature flag :additional_repo_storage_by_namespace enabled' do
context 'when there is available excess storage' do
it 'returns false' do
expect(subject.above_size_limit?).to eq(false)
end
end
context 'when size is above the limit and there is no exccess storage' do
context 'when size is above the limit and there is no excess storage' do
let(:current_size) { 100 }
let(:total_repository_size_excess) { 20 }
let(:additional_purchased_storage) { 10 }
......@@ -54,6 +57,36 @@ RSpec.describe Gitlab::RepositorySizeChecker do
end
end
include_examples 'feature flag :additional_repo_storage_by_namespace enabled'
context 'when only enabled for a specific namespace' do
before do
stub_feature_flags(additional_repo_storage_by_namespace: false)
end
context 'when namespace is another one than the given one' do
let(:other_namespace) { create(:namespace) }
before do
stub_feature_flags(additional_repo_storage_by_namespace: other_namespace)
end
include_examples 'checker size above limit'
include_examples 'checker size not over limit'
end
context 'when namespace is the given one' do
let(:namespace) { create(:namespace, additional_purchased_storage_size: additional_purchased_storage) }
before do
stub_feature_flags(additional_repo_storage_by_namespace: namespace)
end
include_examples 'feature flag :additional_repo_storage_by_namespace enabled'
end
end
end
context 'with feature flag :additional_repo_storage_by_namespace disabled' do
before do
stub_feature_flags(additional_repo_storage_by_namespace: false)
......@@ -88,7 +121,7 @@ RSpec.describe Gitlab::RepositorySizeChecker do
let(:additional_purchased_storage) { 10 }
it 'returns 1' do
expect(subject.exceeded_size).to eq(1)
expect(subject.exceeded_size).to eq(1.megabytes)
end
end
......@@ -96,7 +129,7 @@ RSpec.describe Gitlab::RepositorySizeChecker do
let(:current_size) { 50 }
it 'returns 1' do
expect(subject.exceeded_size(1)).to eq(1)
expect(subject.exceeded_size(1.megabytes)).to eq(1.megabytes)
end
end
......@@ -104,7 +137,7 @@ RSpec.describe Gitlab::RepositorySizeChecker do
let(:current_size) { 49 }
it 'returns zero' do
expect(subject.exceeded_size(1)).to eq(0)
expect(subject.exceeded_size(1.megabytes)).to eq(0)
end
end
end
......
......@@ -2245,22 +2245,6 @@ RSpec.describe Project do
end
end
describe '#total_repository_size_excess' do
it 'returns the total repository size excess of the namespace' do
allow(project.namespace).to receive(:total_repository_size_excess).and_return(50)
expect(checker.total_repository_size_excess).to eq(50)
end
end
describe '#additional_purchased_storage' do
it 'returns the additional purchased storage size of the namespace' do
allow(project.namespace).to receive(:additional_purchased_storage_size).and_return(100)
expect(checker.additional_purchased_storage).to eq(100.megabytes)
end
end
describe '#enabled?' do
it 'returns true when not equal to zero' do
project.repository_size_limit = 1
......
......@@ -14,21 +14,14 @@ RSpec.describe Snippet do
context 'when snippet belongs to a project' do
subject { build(:project_snippet, project: project) }
let(:namespace) { build(:namespace, additional_purchased_storage_size: 50) }
let(:namespace) { build(:namespace) }
let(:project) { build(:project, namespace: namespace) }
let(:total_repository_size_excess) { 100 }
let(:additional_purchased_storage) { 50.megabytes }
before do
allow(namespace).to receive(:total_repository_size_excess).and_return(total_repository_size_excess)
end
include_examples 'size checker for snippet'
end
context 'when snippet without a project' do
let(:total_repository_size_excess) { 0 }
let(:additional_purchased_storage) { 0 }
let(:namespace) { nil }
include_examples 'size checker for snippet'
end
......
......@@ -3,14 +3,13 @@
module Gitlab
# Centralized class for repository size related calculations.
class RepositorySizeChecker
attr_reader :limit, :total_repository_size_excess, :additional_purchased_storage
attr_reader :limit
# @param current_size_proc [Proc] returns repository size in bytes
def initialize(current_size_proc:, limit:, total_repository_size_excess:, additional_purchased_storage:, enabled: true)
def initialize(current_size_proc:, limit:, namespace:, enabled: true)
@current_size_proc = current_size_proc
@limit = limit
@total_repository_size_excess = total_repository_size_excess.to_i
@additional_purchased_storage = additional_purchased_storage.to_i
@namespace = namespace
@enabled = enabled && limit != 0
end
......@@ -44,6 +43,10 @@ module Gitlab
def error_message
@error_message_object ||= ::Gitlab::RepositorySizeErrorMessage.new(self)
end
private
attr_reader :namespace
end
end
......
......@@ -4,7 +4,7 @@ module Gitlab
class RepositorySizeErrorMessage
include ActiveSupport::NumberHelper
delegate :current_size, :limit, :total_repository_size_excess, :additional_purchased_storage, :exceeded_size, to: :@checker
delegate :current_size, :limit, :exceeded_size, to: :@checker
# @param checher [RepositorySizeChecker]
def initialize(checker)
......
......@@ -3,16 +3,16 @@
require 'spec_helper'
RSpec.describe Gitlab::RepositorySizeChecker do
let_it_be(:namespace) { nil }
let(:current_size) { 0 }
let(:limit) { 50 }
let(:enabled) { true }
subject do
described_class.new(
current_size_proc: -> { current_size },
limit: limit,
total_repository_size_excess: 0,
additional_purchased_storage: 0,
current_size_proc: -> { current_size.megabytes },
limit: limit.megabytes,
namespace: namespace,
enabled: enabled
)
end
......@@ -20,7 +20,7 @@ RSpec.describe Gitlab::RepositorySizeChecker do
describe '#enabled?' do
context 'when enabled' do
it 'returns true' do
expect(subject.enabled?).to be_truthy
expect(subject.enabled?).to eq(true)
end
end
......@@ -28,7 +28,7 @@ RSpec.describe Gitlab::RepositorySizeChecker do
let(:limit) { 0 }
it 'returns false' do
expect(subject.enabled?).to be_falsey
expect(subject.enabled?).to eq(false)
end
end
end
......@@ -37,11 +37,11 @@ RSpec.describe Gitlab::RepositorySizeChecker do
let(:current_size) { 49 }
it 'returns true when changes go over' do
expect(subject.changes_will_exceed_size_limit?(2)).to be_truthy
expect(subject.changes_will_exceed_size_limit?(2.megabytes)).to eq(true)
end
it 'returns false when changes do not go over' do
expect(subject.changes_will_exceed_size_limit?(1)).to be_falsey
expect(subject.changes_will_exceed_size_limit?(1.megabytes)).to eq(false)
end
end
......
......@@ -3,11 +3,11 @@
require 'spec_helper'
RSpec.describe Gitlab::RepositorySizeErrorMessage do
let_it_be(:namespace) { build(:namespace) }
let(:checker) do
Gitlab::RepositorySizeChecker.new(
current_size_proc: -> { 15.megabytes },
total_repository_size_excess: 0,
additional_purchased_storage: 0,
namespace: namespace,
limit: 10.megabytes
)
end
......@@ -15,6 +15,10 @@ RSpec.describe Gitlab::RepositorySizeErrorMessage do
let(:message) { checker.error_message }
let(:base_message) { 'because this repository has exceeded its size limit of 10 MB by 5 MB' }
before do
allow(namespace).to receive(:total_repository_size_excess).and_return(0)
end
describe 'error messages' do
describe '#commit_error' do
it 'returns the correct message' do
......
......@@ -666,8 +666,7 @@ RSpec.describe Snippet do
let(:checker) { subject.repository_size_checker }
let(:current_size) { 60 }
let(:total_repository_size_excess) { 0 }
let(:additional_purchased_storage) { 0 }
let(:namespace) { nil }
before do
allow(subject.repository).to receive(:size).and_return(current_size)
......
......@@ -29,7 +29,7 @@ RSpec.shared_examples 'checker size exceeded' do
let(:current_size) { 51 }
it 'returns zero' do
expect(subject.exceeded_size).to eq(1)
expect(subject.exceeded_size).to eq(1.megabytes)
end
end
......@@ -37,7 +37,7 @@ RSpec.shared_examples 'checker size exceeded' do
let(:current_size) { 50 }
it 'returns zero' do
expect(subject.exceeded_size(1)).to eq(1)
expect(subject.exceeded_size(1.megabytes)).to eq(1.megabytes)
end
end
......@@ -45,7 +45,7 @@ RSpec.shared_examples 'checker size exceeded' do
let(:current_size) { 49 }
it 'returns zero' do
expect(subject.exceeded_size(1)).to eq(0)
expect(subject.exceeded_size(1.megabytes)).to eq(0)
end
end
end
......@@ -4,8 +4,7 @@ RSpec.shared_examples 'size checker for snippet' do |action|
it 'sets up size checker', :aggregate_failures do
expect(checker.current_size).to eq(current_size.megabytes)
expect(checker.limit).to eq(Gitlab::CurrentSettings.snippet_size_limit)
expect(checker.total_repository_size_excess).to eq(total_repository_size_excess)
expect(checker.additional_purchased_storage).to eq(additional_purchased_storage)
expect(checker.enabled?).to eq(true)
expect(checker.instance_variable_get(:@namespace)).to eq(namespace)
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