Browse Source

feat(workflow): Adding adopted/unadopted timestamps to Release models (#26262)

Chris Fuller 3 years ago
parent
commit
f8914fd8ec

+ 1 - 1
migrations_lockfile.txt

@@ -7,5 +7,5 @@ will then be regenerated, and you should be able to merge without conflicts.
 
 jira_ac: 0001_initial
 nodestore: 0002_nodestore_no_dictfield
-sentry: 0206_organization_require_email_verification_flag
+sentry: 0207_release_adoption
 social_auth: 0001_initial

+ 125 - 0
src/sentry/migrations/0207_release_adoption.py

@@ -0,0 +1,125 @@
+# Generated by Django 1.11.29 on 2021-05-26 17:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    # This flag is used to mark that a migration shouldn't be automatically run in
+    # production. We set this to True for operations that we think are risky and want
+    # someone from ops to run manually and monitor.
+    # General advice is that if in doubt, mark your migration as `is_dangerous`.
+    # Some things you should always mark as dangerous:
+    # - Large data migrations. Typically we want these to be run manually by ops so that
+    #   they can be monitored. Since data migrations will now hold a transaction open
+    #   this is even more important.
+    # - Adding columns to highly active tables, even ones that are NULL.
+    is_dangerous = True
+
+    # This flag is used to decide whether to run this migration in a transaction or not.
+    # By default we prefer to run in a transaction, but for migrations where you want
+    # to `CREATE INDEX CONCURRENTLY` this needs to be set to False. Typically you'll
+    # want to create an index concurrently when adding one to an existing table.
+    # You'll also usually want to set this to `False` if you're writing a data
+    # migration, since we don't want the entire migration to run in one long-running
+    # transaction.
+    atomic = False
+
+    dependencies = [
+        ("sentry", "0206_organization_require_email_verification_flag"),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            database_operations=[
+                migrations.RunSQL(
+                    """
+                    ALTER TABLE "sentry_release_project" ADD COLUMN "adopted" timestamp with time zone NULL;
+                    """,
+                    reverse_sql="""
+                    ALTER TABLE "sentry_release_project" DROP COLUMN "adopted";
+                    """,
+                ),
+                migrations.RunSQL(
+                    """
+                    ALTER TABLE "sentry_release_project" ADD COLUMN "unadopted" timestamp with time zone NULL;
+                    """,
+                    reverse_sql="""
+                    ALTER TABLE "sentry_release_project" DROP COLUMN "unadopted";
+                    """,
+                ),
+                migrations.RunSQL(
+                    """
+                    ALTER TABLE "sentry_releaseprojectenvironment" ADD COLUMN "adopted" timestamp with time zone NULL;
+                    """,
+                    reverse_sql="""
+                    ALTER TABLE "sentry_releaseprojectenvironment" DROP COLUMN "adopted";
+                    """,
+                ),
+                migrations.RunSQL(
+                    """
+                    ALTER TABLE "sentry_releaseprojectenvironment" ADD COLUMN "unadopted" timestamp with time zone NULL;
+                    """,
+                    reverse_sql="""
+                    ALTER TABLE "sentry_releaseprojectenvironment" DROP COLUMN "unadopted";
+                    """,
+                ),
+                migrations.RunSQL(
+                    """
+                    CREATE INDEX CONCURRENTLY IF NOT EXISTS "sentry_release_project_proj_id_adopted_4ce765fa" ON "sentry_release_project" ("project_id", "adopted");
+                    """,
+                    reverse_sql="DROP INDEX CONCURRENTLY IF EXISTS sentry_release_project_proj_id_adopted_4ce765fa",
+                ),
+                migrations.RunSQL(
+                    """
+                    CREATE INDEX CONCURRENTLY IF NOT EXISTS "sentry_release_project_proj_id_unadopted_8h5g84ee" ON "sentry_release_project" ("project_id", "unadopted");
+                    """,
+                    reverse_sql="DROP INDEX CONCURRENTLY IF EXISTS sentry_release_project_proj_id_unadopted_8h5g84ee",
+                ),
+                migrations.RunSQL(
+                    """
+                    CREATE INDEX CONCURRENTLY IF NOT EXISTS "sentry_releaseprojectenvironment_proj_id_env_id_adopted_j6h89s3" ON "sentry_releaseprojectenvironment" ("project_id", "adopted", "environment_id");
+                    """,
+                    reverse_sql="DROP INDEX CONCURRENTLY IF EXISTS sentry_releaseprojectenvironment_proj_id_env_id_adopted_j6h89s3",
+                ),
+                migrations.RunSQL(
+                    """
+                    CREATE INDEX CONCURRENTLY IF NOT EXISTS "sentry_releaseprojectenvironment_proj_id_env_id_unadopted_kyh5m" ON "sentry_releaseprojectenvironment" ("project_id", "unadopted", "environment_id");
+                    """,
+                    reverse_sql="DROP INDEX CONCURRENTLY IF EXISTS sentry_releaseprojectenvironment_proj_id_env_id_unadopted_kyh5m",
+                ),
+            ],
+            state_operations=[
+                migrations.AddField(
+                    model_name="releaseproject",
+                    name="adopted",
+                    field=models.DateTimeField(blank=True, db_index=False, null=True),
+                ),
+                migrations.AddField(
+                    model_name="releaseproject",
+                    name="unadopted",
+                    field=models.DateTimeField(blank=True, db_index=False, null=True),
+                ),
+                migrations.AddField(
+                    model_name="releaseprojectenvironment",
+                    name="adopted",
+                    field=models.DateTimeField(blank=True, db_index=False, null=True),
+                ),
+                migrations.AddField(
+                    model_name="releaseprojectenvironment",
+                    name="unadopted",
+                    field=models.DateTimeField(blank=True, db_index=False, null=True),
+                ),
+                migrations.AlterIndexTogether(
+                    name="releaseproject",
+                    index_together={("project", "adopted"), ("project", "unadopted")},
+                ),
+                migrations.AlterIndexTogether(
+                    name="releaseprojectenvironment",
+                    index_together={
+                        ("project", "unadopted", "environment"),
+                        ("project", "adopted", "environment"),
+                    },
+                ),
+            ],
+        ),
+    ]

+ 7 - 0
src/sentry/models/release.py

@@ -56,9 +56,16 @@ class ReleaseProject(Model):
     release = FlexibleForeignKey("sentry.Release")
     new_groups = BoundedPositiveIntegerField(null=True, default=0)
 
+    adopted = models.DateTimeField(null=True, blank=True)
+    unadopted = models.DateTimeField(null=True, blank=True)
+
     class Meta:
         app_label = "sentry"
         db_table = "sentry_release_project"
+        index_together = (
+            ("project", "adopted"),
+            ("project", "unadopted"),
+        )
         unique_together = (("project", "release"),)
 
 

+ 7 - 0
src/sentry/models/releaseprojectenvironment.py

@@ -19,9 +19,16 @@ class ReleaseProjectEnvironment(Model):
     last_seen = models.DateTimeField(default=timezone.now, db_index=True)
     last_deploy_id = BoundedPositiveIntegerField(null=True, db_index=True)
 
+    adopted = models.DateTimeField(null=True, blank=True)
+    unadopted = models.DateTimeField(null=True, blank=True)
+
     class Meta:
         app_label = "sentry"
         db_table = "sentry_releaseprojectenvironment"
+        index_together = (
+            ("project", "adopted", "environment"),
+            ("project", "unadopted", "environment"),
+        )
         unique_together = (("project", "release", "environment"),)
 
     __repr__ = sane_repr("project", "release", "environment")