Skip to content

Update instance_integrations table to match integrations schema

What does this MR do and why?

This MR updates instance_integrations table to align the schema with existing integrations table. We previously added instance_integrations table in 405c8b0a as part of Cells architecture in order to split integrations table into instance/non-instance integrations. However, when the table was introduced, we stripped it from the columns that are not needed in instance integrations (project_id/group_id/inherit_from_id/instance columns). We then discovered it would be better to have the schema aligned between the two tables in order to provide a smoother transition for the new instance integrations migration.

This MR:

  • Adds project_id/group_id/inherit_from_id/instance db columns to instance_integrations table
  • Adds IS NULL constraints to project_id/group_id/inherit_from_id, since instance integrations cannot have these values
  • Adds INSTANCE=true constraint to instance column, since instance integrations are always instance wide
  • Renames STI column type to type_new, since that's how it's called in integrations

Note that this table is not currently used and is empty, so I am making all these changes within a single migration.

image

image

Migration output

Up
main: == [advisory_lock_connection] object_id: 127040, pg_backend_pid: 79523
main: == 20241023091427 UpdateInstanceIntegrationsTable: migrating ==================
main: -- add_column(:instance_integrations, :project_id, :bigint, {:null=>true})
main:    -> 0.0024s
main: -- add_column(:instance_integrations, :group_id, :bigint, {:null=>true})
main:    -> 0.0007s
main: -- add_column(:instance_integrations, :inherit_from_id, :bigint, {:null=>true})
main:    -> 0.0006s
main: -- add_column(:instance_integrations, :instance, :boolean, {:default=>true})
main:    -> 0.0017s
main: -- rename_column(:instance_integrations, :type, :type_new)
main:    -> 0.0199s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT project_id_null_constraint\nCHECK ( project_id IS NULL )\nNOT VALID;\n")
main:    -> 0.0016s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0004s
main: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT project_id_null_constraint;")
main:    -> 0.0010s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT group_id_null_constraint\nCHECK ( group_id IS NULL )\nNOT VALID;\n")
main:    -> 0.0006s
main: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT group_id_null_constraint;")
main:    -> 0.0006s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT inherit_from_id_null_constraint\nCHECK ( inherit_from_id IS NULL )\nNOT VALID;\n")
main:    -> 0.0005s
main: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT inherit_from_id_null_constraint;")
main:    -> 0.0009s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT instance_is_true_constraint\nCHECK ( instance = TRUE )\nNOT VALID;\n")
main:    -> 0.0006s
main: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT instance_is_true_constraint;")
main:    -> 0.0005s
main: == 20241023091427 UpdateInstanceIntegrationsTable: migrated (0.0646s) =========

main: == [advisory_lock_connection] object_id: 127040, pg_backend_pid: 79523
ci: == [advisory_lock_connection] object_id: 127460, pg_backend_pid: 79525
ci: == 20241023091427 UpdateInstanceIntegrationsTable: migrating ==================
ci: -- add_column(:instance_integrations, :project_id, :bigint, {:null=>true})
ci:    -> 0.0021s
ci: -- add_column(:instance_integrations, :group_id, :bigint, {:null=>true})
ci:    -> 0.0005s
ci: -- add_column(:instance_integrations, :inherit_from_id, :bigint, {:null=>true})
ci:    -> 0.0006s
ci: -- add_column(:instance_integrations, :instance, :boolean, {:default=>true})
ci:    -> 0.0021s
ci: -- rename_column(:instance_integrations, :type, :type_new)
ci:    -> 0.0017s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT project_id_null_constraint\nCHECK ( project_id IS NULL )\nNOT VALID;\n")
ci:    -> 0.0010s
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0003s
ci: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT project_id_null_constraint;")
ci:    -> 0.0008s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0003s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT group_id_null_constraint\nCHECK ( group_id IS NULL )\nNOT VALID;\n")
ci:    -> 0.0005s
ci: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT group_id_null_constraint;")
ci:    -> 0.0004s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT inherit_from_id_null_constraint\nCHECK ( inherit_from_id IS NULL )\nNOT VALID;\n")
ci:    -> 0.0004s
ci: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT inherit_from_id_null_constraint;")
ci:    -> 0.0004s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE instance_integrations\nADD CONSTRAINT instance_is_true_constraint\nCHECK ( instance = TRUE )\nNOT VALID;\n")
ci:    -> 0.0004s
ci: -- execute("ALTER TABLE instance_integrations VALIDATE CONSTRAINT instance_is_true_constraint;")
ci:    -> 0.0009s
ci: == 20241023091427 UpdateInstanceIntegrationsTable: migrated (0.0384s) =========
Down
main: == [advisory_lock_connection] object_id: 126640, pg_backend_pid: 81248
main: == 20241023091427 UpdateInstanceIntegrationsTable: reverting ==================
main: -- remove_column(:instance_integrations, :project_id, {:if_exists=>true})
main:    -> 0.0218s
main: -- remove_column(:instance_integrations, :group_id, {:if_exists=>true})
main:    -> 0.0023s
main: -- remove_column(:instance_integrations, :inherit_from_id, {:if_exists=>true})
main:    -> 0.0019s
main: -- remove_column(:instance_integrations, :instance, {:if_exists=>true})
main:    -> 0.0027s
main: -- rename_column(:instance_integrations, :type_new, :type)
main:    -> 0.0021s
main: == 20241023091427 UpdateInstanceIntegrationsTable: reverted (0.0349s) =========

main: == [advisory_lock_connection] object_id: 126640, pg_backend_pid: 81248
ci: == [advisory_lock_connection] object_id: 126580, pg_backend_pid: 81657
ci: == 20241023091427 UpdateInstanceIntegrationsTable: reverting ==================
ci: -- remove_column(:instance_integrations, :project_id, {:if_exists=>true})
ci:    -> 0.0158s
ci: -- remove_column(:instance_integrations, :group_id, {:if_exists=>true})
ci:    -> 0.0020s
ci: -- remove_column(:instance_integrations, :inherit_from_id, {:if_exists=>true})
ci:    -> 0.0017s
ci: -- remove_column(:instance_integrations, :instance, {:if_exists=>true})
ci:    -> 0.0023s
ci: -- rename_column(:instance_integrations, :type_new, :type)
ci:    -> 0.0016s
ci: == 20241023091427 UpdateInstanceIntegrationsTable: reverted (0.0318s) =========

ci: == [advisory_lock_connection] object_id: 126580, pg_backend_pid: 81657

Mentions #474809 (closed)

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

MR acceptance checklist

Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Screenshots or screen recordings

Screenshots are required for UI changes, and strongly recommended for all other merge requests.

Before After

How to set up and validate locally

Numbered steps to set up and validate the change are strongly suggested.

Edited by George Koltsov

Merge request reports

Loading