From 57f8876de82afe4efb629003504c409435b00d0b Mon Sep 17 00:00:00 2001
From: moaz-khalifa <mkhalifa@gitlab.com>
Date: Fri, 23 Aug 2024 14:14:34 +0200
Subject: [PATCH] Convert upstream_id in
 virtual_registries_packages_maven_cached_responses into LFK

---
 config/gitlab_loose_foreign_keys.yml          |  4 +++
 ..._packages_maven_upstream_record_changes.rb | 15 ++++++++++
 ...kgs_mvn_cached_responses_upstream_id_fk.rb | 30 +++++++++++++++++++
 db/schema_migrations/20240823110954           |  1 +
 db/schema_migrations/20240823113710           |  1 +
 db/structure.sql                              |  5 ++--
 .../packages/maven/cached_responses.rb        |  2 +-
 .../packages/maven/cached_response_spec.rb    |  7 +++++
 .../packages/maven/upstream_spec.rb           |  4 +++
 9 files changed, 65 insertions(+), 4 deletions(-)
 create mode 100644 db/post_migrate/20240823110954_track_virtual_registries_packages_maven_upstream_record_changes.rb
 create mode 100644 db/post_migrate/20240823113710_remove_vregs_pkgs_mvn_upstreams_vregs_pkgs_mvn_cached_responses_upstream_id_fk.rb
 create mode 100644 db/schema_migrations/20240823110954
 create mode 100644 db/schema_migrations/20240823113710

diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 5230cfc985ab1..c8d0fc02debe1 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -466,6 +466,10 @@ user_details:
   - table: namespaces
     column: enterprise_group_id
     on_delete: async_nullify
+virtual_registries_packages_maven_cached_responses:
+  - table: virtual_registries_packages_maven_upstreams
+    column: upstream_id
+    on_delete: async_nullify
 vulnerability_export_parts:
   - table: organizations
     column: organization_id
diff --git a/db/post_migrate/20240823110954_track_virtual_registries_packages_maven_upstream_record_changes.rb b/db/post_migrate/20240823110954_track_virtual_registries_packages_maven_upstream_record_changes.rb
new file mode 100644
index 0000000000000..ef4045a31e3ad
--- /dev/null
+++ b/db/post_migrate/20240823110954_track_virtual_registries_packages_maven_upstream_record_changes.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackVirtualRegistriesPackagesMavenUpstreamRecordChanges < Gitlab::Database::Migration[2.2]
+  include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+  milestone '17.4'
+
+  def up
+    track_record_deletions(:virtual_registries_packages_maven_upstreams)
+  end
+
+  def down
+    untrack_record_deletions(:virtual_registries_packages_maven_upstreams)
+  end
+end
diff --git a/db/post_migrate/20240823113710_remove_vregs_pkgs_mvn_upstreams_vregs_pkgs_mvn_cached_responses_upstream_id_fk.rb b/db/post_migrate/20240823113710_remove_vregs_pkgs_mvn_upstreams_vregs_pkgs_mvn_cached_responses_upstream_id_fk.rb
new file mode 100644
index 0000000000000..0ffb64f3d4468
--- /dev/null
+++ b/db/post_migrate/20240823113710_remove_vregs_pkgs_mvn_upstreams_vregs_pkgs_mvn_cached_responses_upstream_id_fk.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class RemoveVregsPkgsMvnUpstreamsVregsPkgsMvnCachedResponsesUpstreamIdFk < Gitlab::Database::Migration[2.2]
+  milestone '17.4'
+  disable_ddl_transaction!
+
+  FOREIGN_KEY_NAME = 'fk_rails_1167f21441'
+
+  def up
+    with_lock_retries do
+      remove_foreign_key_if_exists(
+        :virtual_registries_packages_maven_cached_responses,
+        :virtual_registries_packages_maven_upstreams,
+        name: FOREIGN_KEY_NAME,
+        reverse_lock_order: true
+      )
+    end
+  end
+
+  def down
+    add_concurrent_foreign_key(
+      :virtual_registries_packages_maven_cached_responses,
+      :virtual_registries_packages_maven_upstreams,
+      name: FOREIGN_KEY_NAME,
+      column: :upstream_id,
+      target_column: :id,
+      on_delete: :nullify
+    )
+  end
+end
diff --git a/db/schema_migrations/20240823110954 b/db/schema_migrations/20240823110954
new file mode 100644
index 0000000000000..37a10ff1b100a
--- /dev/null
+++ b/db/schema_migrations/20240823110954
@@ -0,0 +1 @@
+a64beea59b93163168802d44712c9637dbb255792feb1aed84025ea7dc03ccc7
\ No newline at end of file
diff --git a/db/schema_migrations/20240823113710 b/db/schema_migrations/20240823113710
new file mode 100644
index 0000000000000..c5de49c1becf1
--- /dev/null
+++ b/db/schema_migrations/20240823113710
@@ -0,0 +1 @@
+1254dd3a1d7e28ab9866877ad278d370c93949d7f0dd9973283c745e4fe5cdf8
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 6ca4b98c2d638..106d4967753c8 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -32874,6 +32874,8 @@ CREATE TRIGGER trigger_update_vulnerability_reads_on_vulnerability_update AFTER
 
 CREATE TRIGGER users_loose_fk_trigger AFTER DELETE ON users REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
 
+CREATE TRIGGER virtual_registries_packages_maven_upstreams_loose_fk_trigger AFTER DELETE ON virtual_registries_packages_maven_upstreams REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
+
 ALTER TABLE ONLY deployments
     ADD CONSTRAINT fk_009fd21147 FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE;
 
@@ -34599,9 +34601,6 @@ ALTER TABLE ONLY ci_sources_projects
 ALTER TABLE ONLY ci_sources_projects
     ADD CONSTRAINT fk_rails_10a1eb379a_p_tmp FOREIGN KEY (partition_id, pipeline_id) REFERENCES p_ci_pipelines(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
 
-ALTER TABLE ONLY virtual_registries_packages_maven_cached_responses
-    ADD CONSTRAINT fk_rails_1167f21441 FOREIGN KEY (upstream_id) REFERENCES virtual_registries_packages_maven_upstreams(id) ON DELETE SET NULL;
-
 ALTER TABLE ONLY zoom_meetings
     ADD CONSTRAINT fk_rails_1190f0e0fa FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
 
diff --git a/spec/factories/virtual_registries/packages/maven/cached_responses.rb b/spec/factories/virtual_registries/packages/maven/cached_responses.rb
index bd16e4892e853..0a407638a4e02 100644
--- a/spec/factories/virtual_registries/packages/maven/cached_responses.rb
+++ b/spec/factories/virtual_registries/packages/maven/cached_responses.rb
@@ -5,7 +5,7 @@
     class: 'VirtualRegistries::Packages::Maven::CachedResponse' do
     upstream { association :virtual_registries_packages_maven_upstream }
     group { upstream.group }
-    relative_path { '/a/relative/path/test.txt' }
+    relative_path { |n| "/a/relative/path/test-#{n}.txt" }
     size { 1.kilobyte }
     upstream_etag { OpenSSL::Digest.hexdigest('SHA256', 'test') }
     content_type { 'text/plain' }
diff --git a/spec/models/virtual_registries/packages/maven/cached_response_spec.rb b/spec/models/virtual_registries/packages/maven/cached_response_spec.rb
index b4cd3e176e9f4..a532771b5521e 100644
--- a/spec/models/virtual_registries/packages/maven/cached_response_spec.rb
+++ b/spec/models/virtual_registries/packages/maven/cached_response_spec.rb
@@ -114,4 +114,11 @@
       it { is_expected.to contain_exactly(cached_response) }
     end
   end
+
+  context 'with loose foreign key on virtual_registries_packages_maven_cached_responses.upstream_id' do
+    it_behaves_like 'cleanup by a loose foreign key' do
+      let_it_be(:parent) { create(:virtual_registries_packages_maven_upstream) }
+      let_it_be(:model) { create(:virtual_registries_packages_maven_cached_response, upstream: parent) }
+    end
+  end
 end
diff --git a/spec/models/virtual_registries/packages/maven/upstream_spec.rb b/spec/models/virtual_registries/packages/maven/upstream_spec.rb
index f70fa4108c256..c19f30ebef8f8 100644
--- a/spec/models/virtual_registries/packages/maven/upstream_spec.rb
+++ b/spec/models/virtual_registries/packages/maven/upstream_spec.rb
@@ -7,6 +7,10 @@
 
   subject(:upstream) { build(:virtual_registries_packages_maven_upstream) }
 
+  it_behaves_like 'it has loose foreign keys' do
+    let(:factory_name) { :virtual_registries_packages_maven_upstream }
+  end
+
   describe 'associations' do
     it do
       is_expected.to have_many(:cached_responses)
-- 
GitLab