From 4917d4151a855cc87b1fb40fb487d8f33e7aca60 Mon Sep 17 00:00:00 2001
From: George Koltsov <gkoltsov@gitlab.com>
Date: Tue, 29 Oct 2024 12:03:34 +0000
Subject: [PATCH] Update instance_integrations table to match integrations
 schema

- Add project_id/group_id/inherit_from_id columns to match existing
integrations table for easier transition of data
- Add IS NULL constraints to project_id/group_id/inherit_from_id since
these values will always be null for instance integrations
- Add instance=true constraint

Changelog: other
---
 .../integrations/instance_integration.rb      |  5 ++++
 ...1427_update_instance_integrations_table.rb | 26 +++++++++++++++++++
 ..._instance_integrations_type_to_type_new.rb | 15 +++++++++++
 ...eanup_instance_integrations_type_rename.rb | 15 +++++++++++
 db/schema_migrations/20241023091427           |  1 +
 db/schema_migrations/20241024125520           |  1 +
 db/schema_migrations/20241024132407           |  1 +
 db/structure.sql                              | 12 +++++++--
 spec/db/schema_spec.rb                        |  3 ++-
 9 files changed, 76 insertions(+), 3 deletions(-)
 create mode 100644 db/migrate/20241023091427_update_instance_integrations_table.rb
 create mode 100644 db/migrate/20241024125520_rename_instance_integrations_type_to_type_new.rb
 create mode 100644 db/post_migrate/20241024132407_cleanup_instance_integrations_type_rename.rb
 create mode 100644 db/schema_migrations/20241023091427
 create mode 100644 db/schema_migrations/20241024125520
 create mode 100644 db/schema_migrations/20241024132407

diff --git a/app/models/integrations/instance_integration.rb b/app/models/integrations/instance_integration.rb
index 9fc52fb570808..bca4e11e09d11 100644
--- a/app/models/integrations/instance_integration.rb
+++ b/app/models/integrations/instance_integration.rb
@@ -2,6 +2,11 @@
 
 module Integrations
   class InstanceIntegration < Integration
+    include IgnorableColumns
+
     self.table_name = 'instance_integrations'
+    self.inheritance_column = :type_new # rubocop:disable Database/AvoidInheritanceColumn -- supporting instance integrations migration
+
+    ignore_column :type, remove_with: '17.7', remove_after: '2024-12-02'
   end
 end
diff --git a/db/migrate/20241023091427_update_instance_integrations_table.rb b/db/migrate/20241023091427_update_instance_integrations_table.rb
new file mode 100644
index 0000000000000..a038f39ef4d37
--- /dev/null
+++ b/db/migrate/20241023091427_update_instance_integrations_table.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class UpdateInstanceIntegrationsTable < Gitlab::Database::Migration[2.2]
+  milestone '17.6'
+
+  disable_ddl_transaction!
+
+  def up
+    add_column :instance_integrations, :project_id, :bigint, null: true, if_not_exists: true
+    add_column :instance_integrations, :group_id, :bigint, null: true, if_not_exists: true
+    add_column :instance_integrations, :inherit_from_id, :bigint, null: true, if_not_exists: true
+    add_column :instance_integrations, :instance, :boolean, default: true, if_not_exists: true
+
+    add_check_constraint :instance_integrations, 'project_id IS NULL', 'project_id_null_constraint'
+    add_check_constraint :instance_integrations, 'group_id IS NULL', 'group_id_null_constraint'
+    add_check_constraint :instance_integrations, 'inherit_from_id IS NULL', 'inherit_from_id_null_constraint'
+    add_check_constraint :instance_integrations, 'instance = TRUE', 'instance_is_true_constraint'
+  end
+
+  def down
+    remove_column :instance_integrations, :project_id, if_exists: true
+    remove_column :instance_integrations, :group_id, if_exists: true
+    remove_column :instance_integrations, :inherit_from_id, if_exists: true
+    remove_column :instance_integrations, :instance, if_exists: true
+  end
+end
diff --git a/db/migrate/20241024125520_rename_instance_integrations_type_to_type_new.rb b/db/migrate/20241024125520_rename_instance_integrations_type_to_type_new.rb
new file mode 100644
index 0000000000000..56b24db8a236e
--- /dev/null
+++ b/db/migrate/20241024125520_rename_instance_integrations_type_to_type_new.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RenameInstanceIntegrationsTypeToTypeNew < Gitlab::Database::Migration[2.2]
+  milestone '17.6'
+
+  disable_ddl_transaction!
+
+  def up
+    rename_column_concurrently :instance_integrations, :type, :type_new
+  end
+
+  def down
+    undo_rename_column_concurrently :instance_integrations, :type, :type_new
+  end
+end
diff --git a/db/post_migrate/20241024132407_cleanup_instance_integrations_type_rename.rb b/db/post_migrate/20241024132407_cleanup_instance_integrations_type_rename.rb
new file mode 100644
index 0000000000000..4497109917a27
--- /dev/null
+++ b/db/post_migrate/20241024132407_cleanup_instance_integrations_type_rename.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CleanupInstanceIntegrationsTypeRename < Gitlab::Database::Migration[2.2]
+  milestone '17.6'
+
+  disable_ddl_transaction!
+
+  def up
+    cleanup_concurrent_column_rename :instance_integrations, :type, :type_new
+  end
+
+  def down
+    undo_cleanup_concurrent_column_rename :instance_integrations, :type, :type_new
+  end
+end
diff --git a/db/schema_migrations/20241023091427 b/db/schema_migrations/20241023091427
new file mode 100644
index 0000000000000..c59a1c6410933
--- /dev/null
+++ b/db/schema_migrations/20241023091427
@@ -0,0 +1 @@
+dcfbdf675f0ebc3b0a05881fa19cffcf505f977c86d355e0a67535c96f309945
\ No newline at end of file
diff --git a/db/schema_migrations/20241024125520 b/db/schema_migrations/20241024125520
new file mode 100644
index 0000000000000..be8a359c5760d
--- /dev/null
+++ b/db/schema_migrations/20241024125520
@@ -0,0 +1 @@
+a1d6a2bbb0053e26d256ea9a86e618df16e73cb91cbbdb74772c8c5c4d5368a9
\ No newline at end of file
diff --git a/db/schema_migrations/20241024132407 b/db/schema_migrations/20241024132407
new file mode 100644
index 0000000000000..610da62c622a6
--- /dev/null
+++ b/db/schema_migrations/20241024132407
@@ -0,0 +1 @@
+573b6e641a7da39f16be66702d687f266d4bf084e6816acd98380716cc09d5bf
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index cdbcf563f2650..630084c4cd579 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -12720,11 +12720,19 @@ CREATE TABLE instance_integrations (
     group_mention_events boolean DEFAULT false NOT NULL,
     group_confidential_mention_events boolean DEFAULT false NOT NULL,
     category text DEFAULT 'common'::text,
-    type text,
     encrypted_properties bytea,
     encrypted_properties_iv bytea,
+    project_id bigint,
+    group_id bigint,
+    inherit_from_id bigint,
+    instance boolean DEFAULT true,
+    type_new text,
+    CONSTRAINT check_2f305455fe CHECK ((char_length(type_new) <= 255)),
     CONSTRAINT check_611836812c CHECK ((char_length(category) <= 255)),
-    CONSTRAINT check_69b7b09aa8 CHECK ((char_length(type) <= 255))
+    CONSTRAINT group_id_null_constraint CHECK ((group_id IS NULL)),
+    CONSTRAINT inherit_from_id_null_constraint CHECK ((inherit_from_id IS NULL)),
+    CONSTRAINT instance_is_true_constraint CHECK ((instance = true)),
+    CONSTRAINT project_id_null_constraint CHECK ((project_id IS NULL))
 );
 
 CREATE SEQUENCE instance_integrations_id_seq
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index d62a5455848bb..9852176784e84 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -230,7 +230,8 @@
     ai_testing_terms_acceptances: %w[user_id], # testing terms only have 1 entry, and if the user is deleted the record should remain
     namespace_settings: %w[early_access_program_joined_by_id], # isn't used inside product itself. Only through Snowflake
     workspaces_agent_config_versions: %w[item_id], # polymorphic associations
-    work_item_types: %w[correct_id] # temporary column that is not a foreign key
+    work_item_types: %w[correct_id], # temporary column that is not a foreign key
+    instance_integrations: %w[project_id group_id inherit_from_id] # these columns are not used in instance integrations
   }.with_indifferent_access.freeze
 
   context 'for table' do
-- 
GitLab