diff --git a/src/sentry/backup/comparators.py b/src/sentry/backup/comparators.py index c6be2da244a8..249e1795bf55 100644 --- a/src/sentry/backup/comparators.py +++ b/src/sentry/backup/comparators.py @@ -874,7 +874,6 @@ def get_default_comparators() -> dict[str, list[JSONScrubbingComparator]]: DateUpdatedComparator("date_updated"), DateUpdatedComparator("date_added"), ], - "sentry.incident": [UUID4Comparator("detection_uuid")], "sentry.integration": [DateUpdatedComparator("date_updated")], "sentry.orgauthtoken": [ HashObfuscatingComparator("token_hashed", "token_last_characters") diff --git a/src/sentry/deletions/__init__.py b/src/sentry/deletions/__init__.py index 0447852caccd..196c6de5608d 100644 --- a/src/sentry/deletions/__init__.py +++ b/src/sentry/deletions/__init__.py @@ -104,7 +104,6 @@ def load_defaults(manager: DeletionTaskManager) -> None: manager.register(discover.DiscoverSavedQuery, defaults.DiscoverSavedQueryDeletionTask) manager.register(discover.DiscoverSavedQueryProject, BulkModelDeletionTask) manager.register(incidents.AlertRule, defaults.AlertRuleDeletionTask) - manager.register(incidents.Incident, defaults.IncidentDeletionTask) manager.register(integrations.OrganizationIntegration, defaults.OrganizationIntegrationDeletionTask) manager.register(integrations.RepositoryProjectPathConfig, defaults.RepositoryProjectPathConfigDeletionTask) manager.register(investigations.Investigation, defaults.InvestigationDeletionTask) diff --git a/src/sentry/deletions/defaults/__init__.py b/src/sentry/deletions/defaults/__init__.py index 2efeb0749c5c..a2ba4b7fffa6 100644 --- a/src/sentry/deletions/defaults/__init__.py +++ b/src/sentry/deletions/defaults/__init__.py @@ -9,7 +9,6 @@ from .file import * # noqa: F401,F403 from .group import * # noqa: F401,F403 from .grouphash import * # noqa: F401,F403 -from .incident import * # noqa: F401,F403 from .investigation import * # noqa: F401,F403 from .monitor import * # noqa: F401,F403 from .monitor_checkin import * # noqa: F401,F403 diff --git a/src/sentry/deletions/defaults/alertrule.py b/src/sentry/deletions/defaults/alertrule.py index baa3093107dc..87166280015c 100644 --- a/src/sentry/deletions/defaults/alertrule.py +++ b/src/sentry/deletions/defaults/alertrule.py @@ -13,11 +13,9 @@ class AlertRuleDeletionTask(ModelDeletionTask[AlertRule]): manager_name = "objects_with_snapshots" def get_child_relations(self, instance: AlertRule) -> list[BaseRelation]: - from sentry.incidents.models.incident import Incident from sentry.workflow_engine.models import AlertRuleWorkflow return [ - ModelRelation(Incident, {"alert_rule_id": instance.id}), ModelRelation( AlertRuleDetector, {"alert_rule_id": instance.id}, diff --git a/src/sentry/deletions/defaults/detector.py b/src/sentry/deletions/defaults/detector.py index 2b155a371cee..a7ae3340b0a2 100644 --- a/src/sentry/deletions/defaults/detector.py +++ b/src/sentry/deletions/defaults/detector.py @@ -21,7 +21,7 @@ def get_child_relations(self, instance: Detector) -> list[BaseRelation]: # If this detector was dual-written from an AlertRule, cascade deletion # to the AlertRule. AlertRuleDeletionTask will handle cleaning up - # AlertRuleDetector, AlertRuleWorkflow, triggers, and incidents. + # AlertRuleDetector and AlertRuleWorkflow. # NOTE: AlertRule must be deleted before DataSource so that # QuerySubscriptionDeletionTask sees no remaining AlertRule referencing # the SnubaQuery and can safely delete it. diff --git a/src/sentry/deletions/defaults/incident.py b/src/sentry/deletions/defaults/incident.py deleted file mode 100644 index dbeaf9f86b15..000000000000 --- a/src/sentry/deletions/defaults/incident.py +++ /dev/null @@ -1,8 +0,0 @@ -from sentry.deletions.base import ModelDeletionTask -from sentry.incidents.models.incident import Incident - - -class IncidentDeletionTask(ModelDeletionTask[Incident]): - # Historical identifiers belong to the open period. Retiring an Incident must - # not remove the mapping used by notification payloads and legacy links. - pass diff --git a/src/sentry/deletions/defaults/organization.py b/src/sentry/deletions/defaults/organization.py index c1afa7b5213f..0ec36162cea5 100644 --- a/src/sentry/deletions/defaults/organization.py +++ b/src/sentry/deletions/defaults/organization.py @@ -32,7 +32,6 @@ def get_child_relations(self, instance: Organization) -> list[BaseRelation]: from sentry.deletions.defaults.discoversavedquery import DiscoverSavedQueryDeletionTask from sentry.discover.models import DiscoverSavedQuery, TeamKeyTransaction from sentry.incidents.models.alert_rule import AlertRule - from sentry.incidents.models.incident import Incident from sentry.integrations.models.external_issue import ExternalIssue from sentry.investigations.models import Investigation from sentry.models.artifactbundle import ArtifactBundle @@ -54,7 +53,6 @@ def get_child_relations(self, instance: Organization) -> list[BaseRelation]: OrganizationMember, Repository, CommitAuthor, - Incident, AlertRule, Release, Investigation, diff --git a/src/sentry/deletions/defaults/querysubscription.py b/src/sentry/deletions/defaults/querysubscription.py index 497d1173e9fc..7b8df1f94dde 100644 --- a/src/sentry/deletions/defaults/querysubscription.py +++ b/src/sentry/deletions/defaults/querysubscription.py @@ -3,13 +3,6 @@ class QuerySubscriptionDeletionTask(ModelDeletionTask[QuerySubscription]): - def delete_instance(self, instance: QuerySubscription) -> None: - from sentry.incidents.models.incident import Incident - - # Clear the foreign key as the schema was created without a cascade clause - Incident.objects.filter(subscription_id=instance.id).update(subscription_id=None) - super().delete_instance(instance) - def get_child_relations(self, instance: QuerySubscription) -> list[BaseRelation]: from sentry.incidents.models.alert_rule import AlertRule from sentry.snuba.models import SnubaQuery diff --git a/src/sentry/incidents/models/incident.py b/src/sentry/incidents/models/incident.py index 72e0fcc930c9..edc677293f03 100644 --- a/src/sentry/incidents/models/incident.py +++ b/src/sentry/incidents/models/incident.py @@ -1,45 +1,12 @@ from __future__ import annotations -import logging -from datetime import datetime, timedelta from enum import Enum -from typing import Any, ClassVar -from uuid import uuid4 -from django.db import IntegrityError, models, router, transaction +from django.db import models from django.utils import timezone -from sentry.backup.dependencies import PrimaryKeyMap -from sentry.backup.helpers import ImportFlags -from sentry.backup.scopes import ImportScope, RelocationScope +from sentry.backup.scopes import RelocationScope from sentry.db.models import FlexibleForeignKey, Model, UUIDField, cell_silo_model -from sentry.db.models.manager.base import BaseManager -from sentry.models.organization import Organization -from sentry.utils.retries import TimedRetryPolicy - -logger = logging.getLogger(__name__) - - -class IncidentManager(BaseManager["Incident"]): - @TimedRetryPolicy.wrap(timeout=5, exceptions=(IntegrityError,)) - def create(self, organization: Organization, **kwargs: Any) -> Incident: - """ - Creates an Incident. Fetches the maximum identifier value for the org - and increments it by one. If two incidents are created for the - Organization at the same time then an integrity error will be thrown, - and we'll retry again several times. I prefer to lock optimistically - here since if we're creating multiple Incidents a second for an - Organization then we're likely failing at making Incidents useful. - """ - with transaction.atomic(router.db_for_write(Organization)): - result = self.filter(organization=organization).aggregate(models.Max("identifier")) - identifier = result["identifier__max"] - if identifier is None: - identifier = 1 - else: - identifier += 1 - - return super().create(organization=organization, identifier=identifier, **kwargs) class IncidentType(Enum): @@ -79,9 +46,7 @@ class Incident(Model): - UI should be able to handle multiple active incidents """ - __relocation_scope__ = RelocationScope.Global - - objects: ClassVar[IncidentManager] = IncidentManager() + __relocation_scope__ = RelocationScope.Excluded organization = FlexibleForeignKey( "sentry.Organization", on_delete=models.DO_NOTHING, db_constraint=False @@ -115,30 +80,6 @@ class Meta: unique_together = (("organization", "identifier"),) indexes = (models.Index(fields=("alert_rule", "type", "status")),) - @property - def current_end_date(self) -> datetime: - """ - Returns the current end of the incident. Either the date it was closed, - or the current time if it's still open. - """ - return self.date_closed if self.date_closed else timezone.now() - - @property - def duration(self) -> timedelta: - return self.current_end_date - self.date_started - - def normalize_before_relocation_import( - self, pk_map: PrimaryKeyMap, scope: ImportScope, flags: ImportFlags - ) -> int | None: - old_pk = super().normalize_before_relocation_import(pk_map, scope, flags) - if old_pk is None: - return None - - # Generate a new UUID, if one exists. - if self.detection_uuid: - self.detection_uuid = uuid4() - return old_pk - class IncidentActivityType(Enum): """Numeric activity types retained for legacy-compatible response payloads.""" diff --git a/src/sentry/testutils/factories.py b/src/sentry/testutils/factories.py index d3d220070c94..5765669e9c05 100644 --- a/src/sentry/testutils/factories.py +++ b/src/sentry/testutils/factories.py @@ -66,10 +66,6 @@ AlertRuleSeasonality, AlertRuleThresholdType, ) -from sentry.incidents.models.incident import ( - Incident, - IncidentType, -) from sentry.incidents.utils.constants import INCIDENTS_SNUBA_SUBSCRIPTION_TYPE from sentry.integrations.models.data_forwarder import DataForwarder from sentry.integrations.models.doc_integration import DocIntegration @@ -2082,43 +2078,6 @@ def create_integration_external_project( organization_integration_id=oi.id, *args, **kwargs ) - @staticmethod - @assume_test_silo_mode(SiloMode.CELL) - def create_incident( - organization, - projects, - detection_uuid=None, - status=1, - title=None, - query="test query", - date_started=None, - date_detected=None, - date_closed=None, - alert_rule=None, - subscription=None, - ): - if not title: - title = petname.generate(2, " ", letters=10).title() - # Projects configure the default alert rule, not an incident-project relation. - if alert_rule is None: - alert_rule = Factories.create_alert_rule( - organization, projects, query=query, time_window=1 - ) - - incident = Incident.objects.create( - organization=organization, - detection_uuid=detection_uuid, - status=status, - title=title, - alert_rule=alert_rule, - date_started=date_started or timezone.now(), - date_detected=date_detected or timezone.now(), - date_closed=timezone.now() if date_closed is not None else date_closed, - type=IncidentType.ALERT_TRIGGERED.value, - subscription=subscription, - ) - return incident - @staticmethod @assume_test_silo_mode(SiloMode.CELL) def create_alert_rule( diff --git a/src/sentry/testutils/fixtures.py b/src/sentry/testutils/fixtures.py index 1626004d09c1..c07fa804d63d 100644 --- a/src/sentry/testutils/fixtures.py +++ b/src/sentry/testutils/fixtures.py @@ -578,14 +578,6 @@ def create_integration_external_issue(self, *args, **kwargs): def create_integration_external_project(self, *args, **kwargs): return Factories.create_integration_external_project(*args, **kwargs) - def create_incident(self, organization=None, projects=None, *args, **kwargs): - if not organization: - organization = self.organization - if projects is None: - projects = [self.project] - - return Factories.create_incident(organization, projects, *args, **kwargs) - def create_alert_rule(self, organization=None, projects=None, *args, **kwargs) -> AlertRule: if not organization: organization = self.organization diff --git a/src/sentry/testutils/helpers/backups.py b/src/sentry/testutils/helpers/backups.py index 010505b08c93..bdd0e3df002e 100644 --- a/src/sentry/testutils/helpers/backups.py +++ b/src/sentry/testutils/helpers/backups.py @@ -556,9 +556,6 @@ def create_exhaustive_organization( alert.user_id = owner_id alert.save() - # Incident* - self.create_incident(org, [project]) - # Dashboard dashboard = Dashboard.objects.create( title=f"Dashboard 1 for {slug}", diff --git a/tests/sentry/deletions/test_alert_rule.py b/tests/sentry/deletions/test_alert_rule.py index 48e7552f3381..c2b251dad484 100644 --- a/tests/sentry/deletions/test_alert_rule.py +++ b/tests/sentry/deletions/test_alert_rule.py @@ -1,7 +1,6 @@ from unittest.mock import MagicMock, patch import orjson -from django.utils import timezone from urllib3 import HTTPResponse from sentry.deletions.tasks.scheduled import run_scheduled_deletions @@ -11,7 +10,6 @@ AlertRuleSeasonality, AlertRuleSensitivity, ) -from sentry.incidents.models.incident import Incident from sentry.models.groupopenperiod import GroupOpenPeriod from sentry.models.organization import Organization from sentry.testutils.helpers.datetime import before_now @@ -29,14 +27,6 @@ class DeleteAlertRuleTest(BaseWorkflowTest, HybridCloudTestMixin): def test_simple(self) -> None: organization = self.create_organization() alert_rule = self.create_alert_rule(organization=organization) - incident = self.create_incident( - organization, - title="Incident #1", - date_started=timezone.now(), - date_detected=timezone.now(), - projects=[self.project], - alert_rule=alert_rule, - ) one_minute = before_now(minutes=1).isoformat() event = self.store_event( data={"timestamp": one_minute, "fingerprint": ["group1"]}, project_id=self.project.id @@ -45,8 +35,8 @@ def test_simple(self) -> None: assert group group_open_period = GroupOpenPeriod.objects.get(project=self.project, group=group) self.create_incident_group_open_period( - incident_id=incident.id, - incident_identifier=incident.identifier, + incident_id=123, + incident_identifier=42, group_open_period=group_open_period, ) @@ -62,10 +52,9 @@ def test_simple(self) -> None: assert Organization.objects.filter(id=organization.id).exists() assert not AlertRule.objects.filter(id=alert_rule.id).exists() - assert not Incident.objects.filter(id=incident.id).exists() assert IncidentGroupOpenPeriod.objects.filter( - incident_id=incident.id, - incident_identifier=incident.identifier, + incident_id=123, + incident_identifier=42, group_open_period=group_open_period, ).exists() assert GroupOpenPeriod.objects.filter(project=self.project, group=group).exists() @@ -89,14 +78,6 @@ def test_dynamic_alert_rule(self, mock_store_request: MagicMock) -> None: detection_type=AlertRuleDetectionType.DYNAMIC, organization=organization, ) - incident = self.create_incident( - organization, - title="Incident #1", - date_started=timezone.now(), - date_detected=timezone.now(), - projects=[self.project], - alert_rule=alert_rule, - ) self.ScheduledDeletion.schedule(instance=alert_rule, days=0) @@ -105,4 +86,3 @@ def test_dynamic_alert_rule(self, mock_store_request: MagicMock) -> None: assert Organization.objects.filter(id=organization.id).exists() assert not AlertRule.objects.filter(id=alert_rule.id).exists() - assert not Incident.objects.filter(id=incident.id).exists() diff --git a/tests/sentry/deletions/test_incident.py b/tests/sentry/deletions/test_incident.py deleted file mode 100644 index 3bd9592c19e5..000000000000 --- a/tests/sentry/deletions/test_incident.py +++ /dev/null @@ -1,49 +0,0 @@ -from django.utils import timezone - -from sentry.deletions.tasks.scheduled import run_scheduled_deletions -from sentry.incidents.models.incident import Incident -from sentry.models.groupopenperiod import GroupOpenPeriod -from sentry.testutils.helpers.datetime import before_now -from sentry.testutils.hybrid_cloud import HybridCloudTestMixin -from sentry.workflow_engine.models import IncidentGroupOpenPeriod -from tests.sentry.workflow_engine.test_base import BaseWorkflowTest - - -class DeleteIncidentTest(BaseWorkflowTest, HybridCloudTestMixin): - def test_simple(self) -> None: - organization = self.create_organization() - alert_rule = self.create_alert_rule(organization=organization) - incident = self.create_incident( - organization, - title="Incident #1", - date_started=timezone.now(), - date_detected=timezone.now(), - projects=[self.project], - alert_rule=alert_rule, - ) - - one_minute = before_now(minutes=1).isoformat() - event = self.store_event( - data={"timestamp": one_minute, "fingerprint": ["group1"]}, project_id=self.project.id - ) - group = event.group - assert group - group_open_period = GroupOpenPeriod.objects.get(project=self.project, group=group) - self.create_incident_group_open_period( - incident_id=incident.id, - incident_identifier=incident.identifier, - group_open_period=group_open_period, - ) - - self.ScheduledDeletion.schedule(instance=incident, days=0) - - with self.tasks(): - run_scheduled_deletions() - - assert not Incident.objects.filter(id=incident.id).exists() - assert IncidentGroupOpenPeriod.objects.filter( - incident_id=incident.id, - incident_identifier=incident.identifier, - group_open_period=group_open_period, - ).exists() - assert GroupOpenPeriod.objects.filter(project=self.project, group=group).exists() diff --git a/tests/sentry/deletions/test_project.py b/tests/sentry/deletions/test_project.py index 00c259e9b95a..16b35fef9c67 100644 --- a/tests/sentry/deletions/test_project.py +++ b/tests/sentry/deletions/test_project.py @@ -2,7 +2,6 @@ from sentry.deletions.tasks.scheduled import run_scheduled_deletions from sentry.incidents.models.alert_rule import AlertRule -from sentry.incidents.models.incident import Incident from sentry.models.activity import Activity from sentry.models.commit import Commit from sentry.models.commitauthor import CommitAuthor @@ -178,13 +177,6 @@ def test_simple(self) -> None: subscription_id="a-snuba-id-maybe", query_extra="", ) - incident = self.create_incident( - organization=project.organization, - projects=[project], - alert_rule=metric_alert_rule, - title="Something bad happened", - subscription=query_sub, - ) self.ScheduledDeletion.schedule(instance=project, days=0) with self.tasks(): @@ -215,9 +207,6 @@ def test_simple(self) -> None: assert not MonitorCheckIn.objects.filter(id=checkin.id).exists() assert not QuerySubscription.objects.filter(id=query_sub.id).exists() - incident.refresh_from_db() - assert Incident.objects.filter(id=incident.id).exists() - assert AlertRule.objects.filter(id=metric_alert_rule.id).exists() def test_delete_error_events(self) -> None: diff --git a/tests/sentry/deletions/test_querysubscription.py b/tests/sentry/deletions/test_querysubscription.py index 95ce88296021..b78a185225eb 100644 --- a/tests/sentry/deletions/test_querysubscription.py +++ b/tests/sentry/deletions/test_querysubscription.py @@ -12,9 +12,6 @@ def test_alert_rule(self) -> None: alert_rule = self.create_alert_rule() snuba_query = alert_rule.snuba_query subscription = QuerySubscription.objects.get(snuba_query_id=snuba_query.id) - incident = self.create_incident( - projects=[self.project], status=20, alert_rule=alert_rule, subscription=subscription - ) self.ScheduledDeletion.schedule(instance=subscription, days=0) @@ -22,8 +19,6 @@ def test_alert_rule(self) -> None: run_scheduled_deletions() assert SnubaQuery.objects.filter(id=snuba_query.id).exists() - incident.refresh_from_db() - assert incident.subscription_id is None assert not QuerySubscription.objects.filter(id=subscription.id).exists() def test_data_source(self) -> None: diff --git a/tests/sentry/incidents/models/test_alert_rule.py b/tests/sentry/incidents/models/test_alert_rule.py index d02ed7d126e7..ecbe1984ecd9 100644 --- a/tests/sentry/incidents/models/test_alert_rule.py +++ b/tests/sentry/incidents/models/test_alert_rule.py @@ -5,12 +5,10 @@ from sentry.testutils.cases import TestCase -class IncidentAlertRuleRelationTest(TestCase): +class AlertRuleSnapshotTest(TestCase): def test(self) -> None: self.alert_rule = self.create_alert_rule() - self.incident = self.create_incident(alert_rule=self.alert_rule, projects=[self.project]) - assert self.incident.alert_rule.id == self.alert_rule.id all_alert_rules = list(AlertRule.objects.all()) assert self.alert_rule in all_alert_rules @@ -19,7 +17,6 @@ def test(self) -> None: all_alert_rules = list(AlertRule.objects.all()) assert self.alert_rule not in all_alert_rules - assert self.incident.alert_rule.id == self.alert_rule.id class AlertRuleFetchForProjectTest(TestCase): diff --git a/tests/sentry/incidents/models/test_incidents.py b/tests/sentry/incidents/models/test_incidents.py deleted file mode 100644 index c90915311413..000000000000 --- a/tests/sentry/incidents/models/test_incidents.py +++ /dev/null @@ -1,100 +0,0 @@ -import unittest -from datetime import timedelta -from unittest.mock import patch - -from django.db import router, transaction -from django.utils import timezone - -from sentry.db.models.manager.base import BaseManager -from sentry.incidents.models.incident import ( - Incident, - IncidentStatus, - IncidentType, -) -from sentry.testutils.cases import TestCase -from sentry.testutils.helpers.datetime import freeze_time - - -class IncidentCreationTest(TestCase): - def test_simple(self) -> None: - title = "hello" - alert_rule = self.create_alert_rule() - incident = Incident.objects.create( - self.organization, - title=title, - type=IncidentType.ALERT_TRIGGERED.value, - alert_rule=alert_rule, - ) - assert incident.identifier == 1 - assert incident.title == title - - # Check identifier correctly increments - incident = Incident.objects.create( - self.organization, - title=title, - type=IncidentType.ALERT_TRIGGERED.value, - alert_rule=alert_rule, - ) - assert incident.identifier == 2 - - def test_identifier_conflict(self) -> None: - create_method = BaseManager.create - call_count = [0] - alert_rule = self.create_alert_rule() - - def mock_base_create(*args, **kwargs): - if not call_count[0]: - call_count[0] += 1 - # This incident will take the identifier we already fetched and - # use it, which will cause the database to throw an integrity - # error. - with transaction.atomic(router.db_for_write(Incident)): - incident = Incident.objects.create( - self.organization, - status=IncidentStatus.OPEN.value, - title="Conflicting Incident", - type=IncidentType.ALERT_TRIGGERED.value, - alert_rule=alert_rule, - ) - assert incident.identifier == kwargs["identifier"] - create_method(*args, **kwargs) - self.fail("Expected an integrity error") - else: - call_count[0] += 1 - - return create_method(*args, **kwargs) - - self.organization - with patch.object(BaseManager, "create", new=mock_base_create): - incident = Incident.objects.create( - self.organization, - alert_rule=alert_rule, - status=IncidentStatus.OPEN.value, - title="hi", - type=IncidentType.ALERT_TRIGGERED.value, - ) - # We should have 3 calls - one for initial create, one for conflict, - # then the final one for the retry we get due to the conflict - assert call_count[0] == 3 - # Ideally this would be 2, but because we create the conflicting - # row inside of a transaction it ends up rolled back. We just want - # to verify that it was created successfully. - assert incident.identifier == 1 - - -@freeze_time() -class IncidentDurationTest(unittest.TestCase): - def test(self) -> None: - incident = Incident(date_started=timezone.now() - timedelta(minutes=5)) - assert incident.duration == timedelta(minutes=5) - incident.date_closed = incident.date_started + timedelta(minutes=2) - assert incident.duration == timedelta(minutes=2) - - -@freeze_time() -class IncidentCurrentEndDateTest(unittest.TestCase): - def test(self) -> None: - incident = Incident() - assert incident.current_end_date == timezone.now() - incident.date_closed = timezone.now() - timedelta(minutes=10) - assert incident.current_end_date == timezone.now() - timedelta(minutes=10) diff --git a/tests/sentry/issues/test_ingest_incident_integration.py b/tests/sentry/issues/test_ingest_incident_integration.py index b38dc84b0a83..88e8f2b7da59 100644 --- a/tests/sentry/issues/test_ingest_incident_integration.py +++ b/tests/sentry/issues/test_ingest_incident_integration.py @@ -5,7 +5,6 @@ from sentry.event_manager import GroupInfo from sentry.incidents.grouptype import MetricIssue -from sentry.incidents.models.incident import Incident, IncidentStatus from sentry.incidents.utils.constants import INCIDENTS_SNUBA_SUBSCRIPTION_TYPE from sentry.issues.grouptype import FeedbackGroup from sentry.issues.ingest import save_issue_occurrence @@ -116,7 +115,6 @@ def test_ingestion_preserves_open_period_without_legacy_incident(self) -> None: _, group_info = self.save_issue_occurrence() open_period = GroupOpenPeriod.objects.get(group=group_info.group) assert open_period.date_ended is None - assert not Incident.objects.exists() assert not IncidentGroupOpenPeriod.objects.exists() def test_modern_detector_without_legacy_rule(self) -> None: @@ -124,7 +122,6 @@ def test_modern_detector_without_legacy_rule(self) -> None: self.alert_rule.delete() _, group_info = self.save_issue_occurrence() assert GroupOpenPeriod.objects.filter(group=group_info.group).exists() - assert not Incident.objects.exists() assert not IncidentGroupOpenPeriod.objects.exists() def test_non_metric_issue(self) -> None: @@ -132,18 +129,13 @@ def test_non_metric_issue(self) -> None: assert GroupOpenPeriod.objects.filter(group=group_info.group).exists() assert not IncidentGroupOpenPeriod.objects.exists() - def test_priority_and_resolution_preserve_historical_incident(self) -> None: + def test_priority_and_resolution_preserve_historical_mapping(self) -> None: _, group_info = self.save_issue_occurrence() group = group_info.group open_period = GroupOpenPeriod.objects.get(group=group) - incident = self.create_incident( - organization=self.organization, - alert_rule=self.alert_rule, - status=IncidentStatus.CRITICAL.value, - ) mapping = self.create_incident_group_open_period( - incident_id=incident.id, - incident_identifier=incident.identifier, + incident_id=123, + incident_identifier=42, group_open_period=open_period, ) @@ -159,30 +151,19 @@ def test_priority_and_resolution_preserve_historical_incident(self) -> None: update_status(group, self.mock_status_change_message) open_period.refresh_from_db() group.refresh_from_db() - incident.refresh_from_db() mapping.refresh_from_db() assert group.status == GroupStatus.RESOLVED assert open_period.date_ended is not None - assert incident.status == IncidentStatus.CRITICAL.value - assert incident.date_closed is None - assert mapping.incident_id == incident.id - assert Incident.objects.count() == 1 + assert mapping.incident_id == 123 + assert mapping.incident_identifier == 42 - def test_resolving_unmapped_period_does_not_attach_outstanding_incident(self) -> None: - incident = self.create_incident( - organization=self.organization, - alert_rule=self.alert_rule, - status=IncidentStatus.CRITICAL.value, - ) + def test_resolving_unmapped_period_preserves_open_period(self) -> None: _, group_info = self.save_issue_occurrence() with self.tasks(): update_status(group_info.group, self.mock_status_change_message) open_period = GroupOpenPeriod.objects.get(group=group_info.group) assert open_period.date_ended is not None assert not IncidentGroupOpenPeriod.objects.exists() - incident.refresh_from_db() - assert incident.date_closed is None - assert Incident.objects.count() == 1 def test_ongoing_transition_preserves_open_period(self) -> None: _, group_info = self.save_issue_occurrence() @@ -198,7 +179,6 @@ def test_ongoing_transition_preserves_open_period(self) -> None: ).exists() open_period.refresh_from_db() assert open_period.date_ended is None - assert not Incident.objects.exists() assert not IncidentGroupOpenPeriod.objects.exists() def test_resolve_previous_activation_after_next_activation_opened(self) -> None: