diff --git a/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/create.rb b/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/create.rb index 26bb423e4147753accc2d6e9288514b718bf364b..5dd9f666326c09e114abef99148b1cd421604e7d 100644 --- a/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/create.rb +++ b/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/create.rb @@ -5,6 +5,7 @@ module GitlabSubscriptions module UserAddOnAssignments class Create < BaseMutation graphql_name 'UserAddOnAssignmentCreate' + include ::GitlabSubscriptions::CodeSuggestionsHelper argument :add_on_purchase_id, ::Types::GlobalIDType[::GitlabSubscriptions::AddOnPurchase], required: true, description: 'Global ID of AddOnPurchase to be assigned to.' @@ -50,9 +51,7 @@ def ready?(add_on_purchase_id:, user_id:) attr_reader :add_on_purchase, :user_to_be_assigned def feature_enabled? - Feature.enabled?(:hamilton_seat_management, add_on_purchase&.namespace) - # Once the FF for SM is merged we should use it for SM instead of hamilton_seat_management - # https://gitlab.com/gitlab-org/gitlab/-/issues/433011 + code_suggestions_available?(add_on_purchase&.namespace) end def create_user_add_on_service @@ -64,10 +63,6 @@ def create_user_add_on_service service_class.new(add_on_purchase: add_on_purchase, user: user_to_be_assigned) end - - def gitlab_saas? - ::Gitlab::Saas.feature_available?(:code_suggestions) - end end end end diff --git a/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/remove.rb b/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/remove.rb index c9c42ac50ce3d8928af87cee30f91602646ffb6c..91a2073df733767939ff3f5fe878885ab59469bf 100644 --- a/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/remove.rb +++ b/ee/app/graphql/mutations/gitlab_subscriptions/user_add_on_assignments/remove.rb @@ -5,6 +5,7 @@ module GitlabSubscriptions module UserAddOnAssignments class Remove < BaseMutation graphql_name 'UserAddOnAssignmentRemove' + include ::GitlabSubscriptions::CodeSuggestionsHelper argument :add_on_purchase_id, ::Types::GlobalIDType[::GitlabSubscriptions::AddOnPurchase], required: true, description: 'Global ID of AddOnPurchase assignment belongs to.' @@ -54,7 +55,7 @@ def ready?(add_on_purchase_id:, user_id:) attr_reader :add_on_purchase, :user_to_be_removed def feature_enabled? - Feature.enabled?(:hamilton_seat_management, add_on_purchase&.namespace) + code_suggestions_available?(add_on_purchase&.namespace) end def log_event diff --git a/ee/app/graphql/resolvers/gitlab_subscriptions/self_managed/add_on_eligible_users_resolver.rb b/ee/app/graphql/resolvers/gitlab_subscriptions/self_managed/add_on_eligible_users_resolver.rb index 7492215224216fdc7c35b038672a9eb71e6f9fe0..40900647953b5c3baf62bc3e394a86df21a5b7a5 100644 --- a/ee/app/graphql/resolvers/gitlab_subscriptions/self_managed/add_on_eligible_users_resolver.rb +++ b/ee/app/graphql/resolvers/gitlab_subscriptions/self_managed/add_on_eligible_users_resolver.rb @@ -33,7 +33,7 @@ def resolve(add_on_type:, search: nil) private def authorize! - return unless Gitlab::Saas.feature_available?(:code_suggestions) || !current_user.can_admin_all_resources? + return unless gitlab_saas? || !current_user.can_admin_all_resources? raise_resource_not_available_error! end diff --git a/ee/app/helpers/gitlab_subscriptions/code_suggestions_helper.rb b/ee/app/helpers/gitlab_subscriptions/code_suggestions_helper.rb index 458ab4f2775e248aa67529eba5e173dfbede7e5b..a91f00cbbe8e7d96ab06f42d02744bfbbe65350b 100644 --- a/ee/app/helpers/gitlab_subscriptions/code_suggestions_helper.rb +++ b/ee/app/helpers/gitlab_subscriptions/code_suggestions_helper.rb @@ -2,6 +2,8 @@ module GitlabSubscriptions module CodeSuggestionsHelper + include GitlabSubscriptions::SubscriptionHelper + def code_suggestions_available?(namespace = nil) if gitlab_saas? Feature.enabled?(:hamilton_seat_management, namespace) @@ -9,11 +11,5 @@ def code_suggestions_available?(namespace = nil) Feature.enabled?(:self_managed_code_suggestions) end end - - private - - def gitlab_saas? - ::Gitlab::Saas.feature_available?(:code_suggestions) - end end end diff --git a/ee/app/helpers/gitlab_subscriptions/subscription_helper.rb b/ee/app/helpers/gitlab_subscriptions/subscription_helper.rb new file mode 100644 index 0000000000000000000000000000000000000000..c369ddef8c5dc21920e153c944c4b3bb4e7d8219 --- /dev/null +++ b/ee/app/helpers/gitlab_subscriptions/subscription_helper.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module GitlabSubscriptions + module SubscriptionHelper + def gitlab_saas? + ::Gitlab::Saas.feature_available?(:gitlab_saas_subscriptions) + end + + def gitlab_sm? + !gitlab_saas? + end + end +end diff --git a/ee/app/models/ee/user.rb b/ee/app/models/ee/user.rb index 39f87aee7a529f890c3133aced8835e87980da01..ebe12a71d1131ea4bee3c1be326437d2462c82bc 100644 --- a/ee/app/models/ee/user.rb +++ b/ee/app/models/ee/user.rb @@ -11,6 +11,7 @@ module User include ::Gitlab::Utils::StrongMemoize include AuditorUserHelper + include GitlabSubscriptions::SubscriptionHelper DEFAULT_ROADMAP_LAYOUT = 'months' DEFAULT_GROUP_VIEW = 'details' @@ -584,7 +585,7 @@ def code_suggestions_add_on_available? end def eligible_for_self_managed_code_suggestions? - return false if ::Gitlab::Saas.feature_available?(:code_suggestions) + return false if gitlab_saas? active? && !bot? && !ghost? end diff --git a/ee/config/saas_features/code_suggestions.yml b/ee/config/saas_features/gitlab_saas_subscriptions.yml similarity index 69% rename from ee/config/saas_features/code_suggestions.yml rename to ee/config/saas_features/gitlab_saas_subscriptions.yml index 771e062a45fa6341d4bf4ed7802b11a576dff7c6..a97edc596b6e8d933deb87b3e0432791c8e73720 100644 --- a/ee/config/saas_features/code_suggestions.yml +++ b/ee/config/saas_features/gitlab_saas_subscriptions.yml @@ -1,5 +1,5 @@ --- -name: code_suggestions -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137534 +name: gitlab_saas_subscriptions +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/138644 milestone: '16.7' group: group::purchase diff --git a/ee/lib/ee/gitlab/saas.rb b/ee/lib/ee/gitlab/saas.rb index 336b8a19e44d9ba37e515324f7167e49fa150b25..a369439146ad48de34afa83ffd7850f6ad521881 100644 --- a/ee/lib/ee/gitlab/saas.rb +++ b/ee/lib/ee/gitlab/saas.rb @@ -18,7 +18,7 @@ module Saas search_indexing_status subscriptions_trials group_custom_roles - code_suggestions + gitlab_saas_subscriptions ].freeze CONFIG_FILE_ROOT = 'ee/config/saas_features' diff --git a/ee/spec/helpers/gitlab_subscriptions/code_suggestions_helper_spec.rb b/ee/spec/helpers/gitlab_subscriptions/code_suggestions_helper_spec.rb index 8bf12f8dcf23b6562fbdee9bc8cc027f15938ff6..4c37d1b139a4f280b1b59e7b5a5122c591730f3d 100644 --- a/ee/spec/helpers/gitlab_subscriptions/code_suggestions_helper_spec.rb +++ b/ee/spec/helpers/gitlab_subscriptions/code_suggestions_helper_spec.rb @@ -8,7 +8,7 @@ let_it_be(:namespace) { build_stubbed(:group) } before do - stub_saas_features(code_suggestions: true) + stub_saas_features(gitlab_saas_subscriptions: true) end context 'when SaaS feature flag is globally enabled' do @@ -40,7 +40,7 @@ context 'when GitLab is self-managed' do before do - stub_saas_features(code_suggestions: false) + stub_saas_features(gitlab_saas_subscriptions: false) end context 'when self-managed feature flag is enabled' do diff --git a/ee/spec/helpers/gitlab_subscriptions/subscription_helper_spec.rb b/ee/spec/helpers/gitlab_subscriptions/subscription_helper_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..e4b67e53d070ea9a68ac0a379fd932d56f7828a3 --- /dev/null +++ b/ee/spec/helpers/gitlab_subscriptions/subscription_helper_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSubscriptions::SubscriptionHelper, feature_category: :seat_cost_management do + describe '#gitlab_saas?' do + context 'when GitLab is SaaS' do + before do + stub_saas_features(gitlab_saas_subscriptions: true) + end + + it 'returns true' do + expect(helper.gitlab_saas?).to be_truthy + end + end + + context 'when GitLab is not SaaS' do + before do + stub_saas_features(gitlab_saas_subscriptions: false) + end + + it 'returns false' do + expect(helper.gitlab_saas?).to be_falsy + end + end + end + + describe '#gitlab_sm?' do + context 'when GitLab is self-managed' do + before do + stub_saas_features(gitlab_saas_subscriptions: false) + end + + it 'returns true' do + expect(helper.gitlab_sm?).to be_truthy + end + end + + context 'when GitLab is not self-managed' do + before do + stub_saas_features(gitlab_saas_subscriptions: true) + end + + it 'returns false' do + expect(helper.gitlab_sm?).to be_falsy + end + end + end +end diff --git a/ee/spec/models/ee/user_spec.rb b/ee/spec/models/ee/user_spec.rb index a469e6563476ba00ea396792319ca675a3ecd829..82476b2746505008140409df637a427e941c48db 100644 --- a/ee/spec/models/ee/user_spec.rb +++ b/ee/spec/models/ee/user_spec.rb @@ -2915,7 +2915,7 @@ context 'when on Saas/Gitlab.com' do before do - stub_saas_features(code_suggestions: true) + stub_saas_features(gitlab_saas_subscriptions: true) end it 'returns false by default' do @@ -2925,7 +2925,7 @@ context 'when on self managed' do before do - stub_saas_features(code_suggestions: false) + stub_saas_features(gitlab_saas_subscriptions: false) stub_licensed_features(code_suggestions: true) end diff --git a/ee/spec/requests/api/graphql/gitlab_subscriptions/add_on_eligible_users_spec.rb b/ee/spec/requests/api/graphql/gitlab_subscriptions/add_on_eligible_users_spec.rb index 4b81f3f9d40d882adbe251230d3adb5edd143ebf..cea122635cdf98b55798d08792e05b2315b6e7fb 100644 --- a/ee/spec/requests/api/graphql/gitlab_subscriptions/add_on_eligible_users_spec.rb +++ b/ee/spec/requests/api/graphql/gitlab_subscriptions/add_on_eligible_users_spec.rb @@ -23,7 +23,7 @@ end before do - stub_saas_features(code_suggestions: true) + stub_saas_features(gitlab_saas_subscriptions: true) end context 'when the user is not eligible to admin add-on purchases on the namespace' do diff --git a/ee/spec/requests/api/graphql/gitlab_subscriptions/self_managed/add_on_eligible_users_spec.rb b/ee/spec/requests/api/graphql/gitlab_subscriptions/self_managed/add_on_eligible_users_spec.rb index e880ca4d06ead3de302bd59d31b35bda53044b9a..95110716180b0be759f3e761ecc184d5fc4ba20f 100644 --- a/ee/spec/requests/api/graphql/gitlab_subscriptions/self_managed/add_on_eligible_users_spec.rb +++ b/ee/spec/requests/api/graphql/gitlab_subscriptions/self_managed/add_on_eligible_users_spec.rb @@ -43,7 +43,7 @@ describe 'authorization' do context 'on a self-managed instance' do before do - stub_saas_features(code_suggestions: false) # !Gitlab.com? + stub_saas_features(gitlab_saas_subscriptions: false) end context 'with owner access' do @@ -64,7 +64,7 @@ let_it_be(:current_user) { create(:admin) } before do - stub_saas_features(code_suggestions: true) # Gitlab.com? + stub_saas_features(gitlab_saas_subscriptions: true) end include_examples 'not authorized' @@ -79,7 +79,7 @@ let_it_be(:active_user_2) { create(:user, name: 'GitlabX') } before do - stub_saas_features(code_suggestions: false) + stub_saas_features(gitlab_saas_subscriptions: false) end before_all do diff --git a/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/create_spec.rb b/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/create_spec.rb index 8f3f2f4ad72f4c6b074b1cf3acca4db807f675d7..ad5eac8f94274f9a36b5a4eaff480596afa9d740 100644 --- a/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/create_spec.rb +++ b/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/create_spec.rb @@ -55,14 +55,6 @@ end shared_examples 'validates the query' do - context 'when feature flag hamilton_seat_management is disabled' do - before do - stub_feature_flags(hamilton_seat_management: false) - end - - it_behaves_like 'empty response' - end - context 'when current_user is admin' do let(:current_user) { create(:admin) } @@ -179,7 +171,7 @@ context 'on Gitlab.com/Saas' do before do - stub_saas_features(code_suggestions: true) + stub_saas_features(gitlab_saas_subscriptions: true) end let_it_be(:current_user) { create(:user) } @@ -190,6 +182,15 @@ namespace.add_owner(current_user) namespace.add_developer(assignee_user) end + + context 'with feature flag disabled' do + before do + stub_feature_flags(hamilton_seat_management: false) + end + + it_behaves_like 'empty response' + end + it_behaves_like 'validates the query' it_behaves_like 'success response' @@ -287,7 +288,7 @@ context 'on self managed instances' do before do - stub_saas_features(code_suggestions: false) + stub_saas_features(gitlab_saas_subscriptions: false) end let(:current_user) { create(:admin) } @@ -296,6 +297,14 @@ it_behaves_like 'validates the query' it_behaves_like 'success response' + context 'with feature flag disabled' do + before do + stub_feature_flags(self_managed_code_suggestions: false) + end + + it_behaves_like 'empty response' + end + context 'when current_user is not an admin' do let(:current_user) { create(:user) } diff --git a/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/remove_spec.rb b/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/remove_spec.rb index 6f2db0a8fce284799d7c6befe19561f55109f1ab..95723e29552297c613857c419727d8c8c7af915b 100644 --- a/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/remove_spec.rb +++ b/ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/remove_spec.rb @@ -108,12 +108,24 @@ it_behaves_like 'success response' - context 'when feature flag hamilton_seat_management is disabled' do - before do - stub_feature_flags(hamilton_seat_management: false) + context 'when feature flag is disabled' do + context 'when SaaS' do + before do + stub_saas_features(gitlab_saas_subscriptions: true) + stub_feature_flags(hamilton_seat_management: false) + end + + it_behaves_like 'empty response' end - it_behaves_like 'empty response' + context 'when self-managed' do + before do + stub_saas_features(gitlab_saas_subscriptions: false) + stub_feature_flags(self_managed_code_suggestions: false) + end + + it_behaves_like 'empty response' + end end context 'when current_user is admin' do diff --git a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb index b2ab310031aa5e3f43de42f3a9e3ab51496c1273..b13f5964730e58a8b8de5cf01beac80c2218c2d9 100644 --- a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb +++ b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/saas/create_service_spec.rb @@ -17,7 +17,7 @@ end before do - stub_saas_features(code_suggestions: true) + stub_saas_features(gitlab_saas_subscriptions: true) end describe '#execute' do diff --git a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb index 71a401a7458490b8d8d78c1a68a26ed615aa3033..2e3144a023bbc17f4c5b79b0c89ffc90f9c65e25 100644 --- a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb +++ b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb @@ -13,7 +13,7 @@ end before do - stub_saas_features(code_suggestions: false) + stub_saas_features(gitlab_saas_subscriptions: false) end describe '#execute' do