From b67cd74025ee18f443de332bf4e89eb6e533649c Mon Sep 17 00:00:00 2001
From: Jessie Young <jessieyoung@gitlab.com>
Date: Sun, 23 Feb 2025 08:37:38 -0800
Subject: [PATCH] Revert "Merge branch
 'mw-remove-flag-override-bulk_import_disabled' into 'master' "

This reverts commit 5e6a707aeac7641078b509ea1187f216f26f2e68, reversing
changes made to 96d9ace891521be6a36a5ea0d2e4bbd6a4e27916.
---
 .../import/bulk_imports_controller.rb         |  3 +-
 ...roup_from_another_instance_panel.html.haml |  2 +-
 .../ops/override_bulk_import_disabled.yml     |  8 ++++
 lib/api/bulk_imports.rb                       |  3 +-
 lib/api/group_export.rb                       |  3 +-
 lib/api/project_export.rb                     |  3 +-
 .../import/bulk_imports_controller_spec.rb    | 26 +++++++++++++
 .../import_export/connect_instance_spec.rb    | 30 ++++++++++++---
 spec/requests/api/bulk_imports_spec.rb        | 18 +++++++++
 spec/requests/api/group_export_spec.rb        | 18 +++++++++
 spec/requests/api/project_export_spec.rb      | 38 ++++++++++++++++---
 11 files changed, 136 insertions(+), 16 deletions(-)
 create mode 100644 config/feature_flags/ops/override_bulk_import_disabled.yml

diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index 4064ad7183e01..d6bfcb35788c7 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -158,7 +158,8 @@ def bulk_import_params
   end
 
   def ensure_bulk_import_enabled
-    render_404 unless Gitlab::CurrentSettings.bulk_import_enabled?
+    render_404 unless Gitlab::CurrentSettings.bulk_import_enabled? ||
+      Feature.enabled?(:override_bulk_import_disabled, current_user, type: :ops)
   end
 
   def access_token_key
diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml
index d8c4f887442fc..9153abb3c3bec 100644
--- a/app/views/groups/_import_group_from_another_instance_panel.html.haml
+++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml
@@ -1,4 +1,4 @@
-- bulk_imports_enabled = Gitlab::CurrentSettings.bulk_import_enabled?
+- bulk_imports_enabled = Gitlab::CurrentSettings.bulk_import_enabled? || Feature.enabled?(:override_bulk_import_disabled, current_user, type: :ops)
 
 .gl-flex.gl-flex-col.gl-gap-5
   - if !bulk_imports_enabled
diff --git a/config/feature_flags/ops/override_bulk_import_disabled.yml b/config/feature_flags/ops/override_bulk_import_disabled.yml
new file mode 100644
index 0000000000000..057170a30ad8a
--- /dev/null
+++ b/config/feature_flags/ops/override_bulk_import_disabled.yml
@@ -0,0 +1,8 @@
+---
+name: override_bulk_import_disabled
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132431
+rollout_issue_url:
+milestone: '16.5'
+type: ops
+group: group::import and integrate
+default_enabled: false
diff --git a/lib/api/bulk_imports.rb b/lib/api/bulk_imports.rb
index 2cbadbfa07ee9..a42245bf732a6 100644
--- a/lib/api/bulk_imports.rb
+++ b/lib/api/bulk_imports.rb
@@ -33,7 +33,8 @@ def bulk_import_entity
     end
 
     before do
-      not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
+      not_found! unless Gitlab::CurrentSettings.bulk_import_enabled? ||
+        Feature.enabled?(:override_bulk_import_disabled, current_user, type: :ops)
 
       authenticate!
     end
diff --git a/lib/api/group_export.rb b/lib/api/group_export.rb
index 4e7c8b134dcfe..086d712cc18ba 100644
--- a/lib/api/group_export.rb
+++ b/lib/api/group_export.rb
@@ -70,7 +70,8 @@ class GroupExport < ::API::Base
 
       resource do
         before do
-          not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
+          not_found! unless Gitlab::CurrentSettings.bulk_import_enabled? ||
+            Feature.enabled?(:override_bulk_import_disabled, current_user, type: :ops)
         end
 
         desc 'Start relations export' do
diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb
index c1e73dedfaf8b..48ed6457cda0d 100644
--- a/lib/api/project_export.rb
+++ b/lib/api/project_export.rb
@@ -110,7 +110,8 @@ class ProjectExport < ::API::Base
 
       resource do
         before do
-          not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
+          not_found! unless Gitlab::CurrentSettings.bulk_import_enabled? ||
+            Feature.enabled?(:override_bulk_import_disabled, current_user, type: :ops)
 
           authorize_admin_project
         end
diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb
index 2adc081c0a4e1..cee8996dfe943 100644
--- a/spec/controllers/import/bulk_imports_controller_spec.rb
+++ b/spec/controllers/import/bulk_imports_controller_spec.rb
@@ -514,6 +514,7 @@ def get_status(params_override = {}, format = :json)
     context 'when importing groups and projects by direct transfer is disabled' do
       before do
         stub_application_setting(bulk_import_enabled: false)
+        stub_feature_flags(override_bulk_import_disabled: false)
 
         allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
           allow(instance).to receive(:validate_instance_version!).and_return(true)
@@ -538,6 +539,31 @@ def get_status(params_override = {}, format = :json)
           expect(response).to have_gitlab_http_status(:not_found)
         end
       end
+
+      context 'when the override_bulk_import_disabled feature flag is enabled' do
+        before do
+          stub_feature_flags(override_bulk_import_disabled: true)
+        end
+
+        context 'POST configure' do
+          it 'does not return 404' do
+            post :configure, params: {
+              bulk_import_gitlab_access_token: 'token', bulk_import_gitlab_url: 'https://gitlab.example'
+            }
+
+            expect(response).to have_gitlab_http_status(:found)
+            expect(response).to redirect_to(status_import_bulk_imports_url)
+          end
+        end
+
+        context 'GET status' do
+          it 'does not return 404' do
+            get :status
+
+            expect(response).to have_gitlab_http_status(:ok)
+          end
+        end
+      end
     end
   end
 
diff --git a/spec/features/groups/import_export/connect_instance_spec.rb b/spec/features/groups/import_export/connect_instance_spec.rb
index 6f2db4ab2de22..ba38cc5189313 100644
--- a/spec/features/groups/import_export/connect_instance_spec.rb
+++ b/spec/features/groups/import_export/connect_instance_spec.rb
@@ -80,14 +80,34 @@
   context 'when importing groups and projects by direct transfer is disabled' do
     before do
       stub_application_setting(bulk_import_enabled: false)
+    end
 
-      open_import_group
+    context 'when the override_bulk_import_disabled feature flag is disabled' do
+      before do
+        stub_feature_flags(override_bulk_import_disabled: false)
+
+        open_import_group
+      end
+
+      it 'renders fields and button disabled' do
+        expect(page).to have_field('GitLab source instance base URL', disabled: true)
+        expect(page).to have_field('Personal access token', disabled: true)
+        expect(page).to have_button('Connect instance', disabled: true)
+      end
     end
 
-    it "doesn't render fields and button" do
-      expect(page).not_to have_field('GitLab source instance base URL')
-      expect(page).not_to have_field('Personal access token')
-      expect(page).not_to have_button('Connect instance')
+    context 'when the override_bulk_import_disabled feature flag is enabled' do
+      before do
+        stub_feature_flags(override_bulk_import_disabled: true)
+
+        open_import_group
+      end
+
+      it 'renders fields and button enabled' do
+        expect(page).to have_field('GitLab source instance base URL', disabled: false)
+        expect(page).to have_field('Personal access token', disabled: false)
+        expect(page).to have_button('Connect instance', disabled: false)
+      end
     end
   end
 
diff --git a/spec/requests/api/bulk_imports_spec.rb b/spec/requests/api/bulk_imports_spec.rb
index 974a56a33487e..107620d62f12b 100644
--- a/spec/requests/api/bulk_imports_spec.rb
+++ b/spec/requests/api/bulk_imports_spec.rb
@@ -52,11 +52,29 @@
   shared_examples 'disabled feature' do
     before do
       stub_application_setting(bulk_import_enabled: false)
+      stub_feature_flags(override_bulk_import_disabled: false)
     end
 
     it_behaves_like '404 response' do
       let(:message) { '404 Not Found' }
     end
+
+    it 'enables the feature when override flag is enabled for the user' do
+      stub_feature_flags(override_bulk_import_disabled: user)
+
+      request
+
+      expect(response).not_to have_gitlab_http_status(:not_found)
+    end
+
+    it 'does not enable the feature when override flag is enabled for another user' do
+      other_user = create(:user)
+      stub_feature_flags(override_bulk_import_disabled: other_user)
+
+      request
+
+      expect(response).to have_gitlab_http_status(:not_found)
+    end
   end
 
   describe 'GET /bulk_imports' do
diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb
index e88516b6546ea..fd7c74c8193c3 100644
--- a/spec/requests/api/group_export_spec.rb
+++ b/spec/requests/api/group_export_spec.rb
@@ -423,11 +423,29 @@
 
       before do
         stub_application_setting(bulk_import_enabled: false)
+        stub_feature_flags(override_bulk_import_disabled: false)
       end
 
       it_behaves_like '404 response' do
         let(:message) { '404 Not Found' }
       end
+
+      it 'enables the feature when override flag is enabled for the user' do
+        stub_feature_flags(override_bulk_import_disabled: user)
+
+        request
+
+        expect(response).to have_gitlab_http_status(:accepted)
+      end
+
+      it 'does not enable the feature when override flag is enabled for another user' do
+        other_user = create(:user)
+        stub_feature_flags(override_bulk_import_disabled: other_user)
+
+        request
+
+        expect(response).to have_gitlab_http_status(:not_found)
+      end
     end
   end
 end
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index c4abea5da9ffc..3f30f4165d3a2 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -735,37 +735,63 @@
       context 'with bulk_import is disabled' do
         before do
           stub_application_setting(bulk_import_enabled: false)
+          stub_feature_flags(override_bulk_import_disabled: false)
+        end
+
+        shared_examples 'flag override' do |expected_http_status:|
+          it 'enables the feature when override flag is enabled for the user' do
+            stub_feature_flags(override_bulk_import_disabled: user)
+
+            request
+
+            expect(response).to have_gitlab_http_status(expected_http_status)
+          end
+
+          it 'does not enable the feature when override flag is enabled for another user' do
+            other_user = create(:user)
+            stub_feature_flags(override_bulk_import_disabled: other_user)
+
+            request
+
+            expect(response).to have_gitlab_http_status(:not_found)
+          end
         end
 
         describe 'POST /projects/:id/export_relations' do
+          subject(:request) { post api(path, user) }
+
           it_behaves_like '404 response' do
             let(:message) { '404 Not Found' }
-
-            subject(:request) { post api(path, user) }
           end
+
+          it_behaves_like 'flag override', expected_http_status: :accepted
         end
 
         describe 'GET /projects/:id/export_relations/download' do
           let_it_be(:export) { create(:bulk_import_export, project: project, relation: 'labels', user: user) }
           let_it_be(:upload) { create(:bulk_import_export_upload, export: export) }
 
+          subject(:request) { get api(download_path, user) }
+
           before do
             upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
           end
 
           it_behaves_like '404 response' do
             let(:message) { '404 Not Found' }
-
-            subject(:request) { get api(download_path, user) }
           end
+
+          it_behaves_like 'flag override', expected_http_status: :ok
         end
 
         describe 'GET /projects/:id/export_relations/status' do
+          subject(:request) { get api(status_path, user) }
+
           it_behaves_like '404 response' do
             let(:message) { '404 Not Found' }
-
-            subject(:request) { get api(status_path, user) }
           end
+
+          it_behaves_like 'flag override', expected_http_status: :ok
         end
       end
     end
-- 
GitLab