Browse Source

ref(crons): Add owner_{user,team}_id to Monitor (#68809)

This will replace the owner_actor_id, since we are trying to move away
from actor.

---------

Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Evan Purkhiser 11 months ago
parent
commit
4938469612

+ 5 - 0
fixtures/backup/model_dependencies/detailed.json

@@ -3222,6 +3222,11 @@
         "model": "sentry.organization",
         "nullable": false
       },
+      "owner_user_id": {
+        "kind": "HybridCloudForeignKey",
+        "model": "sentry.user",
+        "nullable": true
+      },
       "project_id": {
         "kind": "ImplicitForeignKey",
         "model": "sentry.project",

+ 2 - 1
fixtures/backup/model_dependencies/flat.json

@@ -446,7 +446,8 @@
   "sentry.metricskeyindexer": [],
   "sentry.monitor": [
     "sentry.organization",
-    "sentry.project"
+    "sentry.project",
+    "sentry.user"
   ],
   "sentry.monitorcheckin": [
     "sentry.monitor",

+ 1 - 1
migrations_lockfile.txt

@@ -9,5 +9,5 @@ feedback: 0004_index_together
 hybridcloud: 0016_add_control_cacheversion
 nodestore: 0002_nodestore_no_dictfield
 replays: 0004_index_together
-sentry: 0694_db_index_alert_rule_actions
+sentry: 0695_add_monitors_ownership_owner_user_id_team_id
 social_auth: 0002_default_auto_field

+ 54 - 0
src/sentry/migrations/0695_add_monitors_ownership_owner_user_id_team_id.py

@@ -0,0 +1,54 @@
+# Generated by Django 5.0.3 on 2024-04-12 18:18
+
+from django.db import migrations, models
+
+import sentry.db.models.fields.bounded
+import sentry.db.models.fields.hybrid_cloud_foreign_key
+from sentry.new_migrations.migrations import CheckedMigration
+
+
+class Migration(CheckedMigration):
+    # This flag is used to mark that a migration shouldn't be automatically run in production.
+    # This should only be used for operations where it's safe to run the migration after your
+    # code has deployed. So this should not be used for most operations that alter the schema
+    # of a table.
+    # Here are some things that make sense to mark as post deployment:
+    # - Large data migrations. Typically we want these to be run manually so that they can be
+    #   monitored and not block the deploy for a long period of time while they run.
+    # - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
+    #   run this outside deployments so that we don't block them. Note that while adding an index
+    #   is a schema change, it's completely safe to run the operation after the code has deployed.
+    # Once deployed, run these manually via: https://develop.sentry.dev/database-migrations/#migration-deployment
+
+    is_post_deployment = False
+
+    dependencies = [
+        ("sentry", "0694_db_index_alert_rule_actions"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="monitor",
+            name="owner_team_id",
+            field=sentry.db.models.fields.bounded.BoundedBigIntegerField(db_index=True, null=True),
+        ),
+        migrations.AddField(
+            model_name="monitor",
+            name="owner_user_id",
+            field=sentry.db.models.fields.hybrid_cloud_foreign_key.HybridCloudForeignKey(
+                "sentry.User", db_index=True, null=True, on_delete="CASCADE"
+            ),
+        ),
+        migrations.AddConstraint(
+            model_name="monitor",
+            constraint=models.CheckConstraint(
+                check=models.Q(
+                    models.Q(("owner_team_id__isnull", False), ("owner_user_id__isnull", True)),
+                    models.Q(("owner_team_id__isnull", True), ("owner_user_id__isnull", False)),
+                    models.Q(("owner_team_id__isnull", True), ("owner_user_id__isnull", True)),
+                    _connector="OR",
+                ),
+                name="monitor_owner_team_or_user_check",
+            ),
+        ),
+    ]

+ 23 - 0
src/sentry/monitors/models.py

@@ -31,6 +31,7 @@ from sentry.db.models import (
     region_silo_only_model,
     sane_repr,
 )
+from sentry.db.models.fields.hybrid_cloud_foreign_key import HybridCloudForeignKey
 from sentry.db.models.fields.slug import SentrySlugField
 from sentry.db.models.utils import slugify_instance
 from sentry.locks import locks
@@ -252,6 +253,18 @@ class Monitor(Model):
     owner_actor_id = BoundedBigIntegerField(null=True, db_index=True)
     """
     The owner of the monitors actor_id.
+
+    @deprecated Will be replaced with user_id / team_id
+    """
+
+    owner_user_id = HybridCloudForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete="CASCADE")
+    """
+    The user assigned as the owner of this model.
+    """
+
+    owner_team_id = BoundedBigIntegerField(null=True, db_index=True)
+    """
+    The team assigned as the owener of this model.
     """
 
     config: models.Field[dict[str, Any], dict[str, Any]] = JSONField(default=dict)
@@ -266,6 +279,16 @@ class Monitor(Model):
         indexes = [
             models.Index(fields=["organization_id", "slug"]),
         ]
+        constraints = [
+            models.CheckConstraint(
+                check=(
+                    models.Q(owner_team_id__isnull=False, owner_user_id__isnull=True)
+                    | models.Q(owner_team_id__isnull=True, owner_user_id__isnull=False)
+                    | models.Q(owner_team_id__isnull=True, owner_user_id__isnull=True)
+                ),
+                name="monitor_owner_team_or_user_check",
+            )
+        ]
 
     __repr__ = sane_repr("guid", "project_id", "name")
 

File diff suppressed because it is too large
+ 206 - 204
tests/sentry/backup/snapshots/ReleaseTests/test_at_head.pysnap


+ 2 - 1
tests/sentry/backup/snapshots/test_comparators/test_default_comparators.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2024-04-10T15:02:31.213310+00:00'
+created: '2024-04-12T19:46:00.491186+00:00'
 creator: sentry
 source: tests/sentry/backup/test_comparators.py
 ---
@@ -809,6 +809,7 @@ source: tests/sentry/backup/test_comparators.py
   - class: ForeignKeyComparator
     fields:
     - organization_id
+    - owner_user_id
     - project_id
   model_name: sentry.monitor
 - comparators:

Some files were not shown because too many files changed in this diff