Commit 7b6e75e7 authored by Robert Speicher's avatar Robert Speicher

Merge branch '184-allow-for-acceptable-user-growth-during-sm-license-upload' into 'master'

Allow some extra users when registering a new license

See merge request gitlab-org/gitlab!46407
parents 6c244364 7d8b888e
...@@ -6,6 +6,7 @@ class License < ApplicationRecord ...@@ -6,6 +6,7 @@ class License < ApplicationRecord
STARTER_PLAN = 'starter'.freeze STARTER_PLAN = 'starter'.freeze
PREMIUM_PLAN = 'premium'.freeze PREMIUM_PLAN = 'premium'.freeze
ULTIMATE_PLAN = 'ultimate'.freeze ULTIMATE_PLAN = 'ultimate'.freeze
ALLOWED_PERCENTAGE_OF_USERS_OVERAGE = (10 / 100.0).freeze
EES_FEATURES = %i[ EES_FEATURES = %i[
audit_events audit_events
...@@ -562,13 +563,20 @@ class License < ApplicationRecord ...@@ -562,13 +563,20 @@ class License < ApplicationRecord
end end
end end
def restricted_user_count_with_threshold
# overage should only be applied for new subscriptions not for renewals.
return restricted_user_count if previous_user_count
(restricted_user_count * (1 + ALLOWED_PERCENTAGE_OF_USERS_OVERAGE)).to_i
end
def check_users_limit def check_users_limit
return unless restricted_user_count return unless restricted_user_count
if previous_user_count && (prior_historical_max <= previous_user_count) if previous_user_count && (prior_historical_max <= previous_user_count)
return if restricted_user_count >= current_active_users_count return if restricted_user_count >= current_active_users_count
else else
return if restricted_user_count >= prior_historical_max return if restricted_user_count_with_threshold >= prior_historical_max
end end
user_count = prior_historical_max == 0 ? current_active_users_count : prior_historical_max user_count = prior_historical_max == 0 ? current_active_users_count : prior_historical_max
......
...@@ -28,38 +28,92 @@ RSpec.describe License do ...@@ -28,38 +28,92 @@ RSpec.describe License do
end end
describe '#check_users_limit' do describe '#check_users_limit' do
before do context 'for each plan' do
create(:group_member, :guest) before do
create(:group_member, :reporter) create(:group_member, :guest)
create(:license, plan: plan) create(:group_member, :reporter)
end create(:license, plan: plan)
end
let(:users_count) { nil } let(:users_count) { nil }
let(:new_license) do let(:new_license) do
gl_license = build(:gitlab_license, restrictions: { plan: plan, active_user_count: users_count, previous_user_count: 1 }) gl_license = build(:gitlab_license, restrictions: { plan: plan, active_user_count: users_count, previous_user_count: 1 })
build(:license, data: gl_license.export) build(:license, data: gl_license.export)
end end
where(:gl_plan, :valid) do where(:gl_plan, :valid) do
::License::STARTER_PLAN | false ::License::STARTER_PLAN | false
::License::PREMIUM_PLAN | false ::License::PREMIUM_PLAN | false
::License::ULTIMATE_PLAN | true ::License::ULTIMATE_PLAN | true
end end
with_them do with_them do
let(:plan) { gl_plan } let(:plan) { gl_plan }
context 'when license has restricted users' do
let(:users_count) { 1 }
it { expect(new_license.valid?).to eq(valid) }
end
context 'when license has restricted users' do context 'when license has unlimited users' do
let(:users_count) { 1 } let(:users_count) { nil }
it { expect(new_license.valid?).to eq(valid) } it 'is always valid' do
expect(new_license.valid?).to eq(true)
end
end
end end
end
context 'when license has unlimited users' do context 'threshold for users overage' do
let(:users_count) { nil } let(:current_active_users_count) { 0 }
let(:new_license) do
gl_license = build(
:gitlab_license,
starts_at: Date.today,
restrictions: { active_user_count: 10, previous_user_count: previous_user_count }
)
it 'is always valid' do build(:license, data: gl_license.export)
expect(new_license.valid?).to eq(true) end
context 'when current active users count is above the limit set by the license' do
before do
create_list(:user, current_active_users_count)
HistoricalData.track!
end
context 'when license is from a fresh subscription' do
let(:previous_user_count) { nil }
context 'when current active users count is under the threshold' do
let(:current_active_users_count) { 11 }
it 'accepts the license' do
expect(new_license).to be_valid
end
end
context 'when current active users count is above the threshold' do
let(:current_active_users_count) { 12 }
it 'does not accept the license' do
expect(new_license).not_to be_valid
end
end
end
context 'when license is from a renewal' do
let(:previous_user_count) { 1 }
context 'when current active users count is under the threshold' do
let(:current_active_users_count) { 11 }
it 'does not accept the license' do
expect(new_license).not_to be_valid
end
end
end 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