Skip to content

Commit 7c94b01

Browse files
authored
ref(workflow-engine): Delete dead deletion code (#108092)
While auditing delete behavior, noticed that some potentially problematic code wasn't actually being used, so we remove it.
1 parent 2e6730c commit 7c94b01

File tree

4 files changed

+3
-154
lines changed

4 files changed

+3
-154
lines changed

src/sentry/workflow_engine/migration_helpers/issue_alert_dual_write.py

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
WorkflowDataConditionGroup,
2222
)
2323
from sentry.workflow_engine.models.data_condition import Condition
24-
from sentry.workflow_engine.processors.workflow import (
25-
WorkflowDataConditionGroupType,
26-
delete_workflow,
27-
)
24+
from sentry.workflow_engine.processors.workflow import WorkflowDataConditionGroupType
2825

2926
logger = logging.getLogger(__name__)
3027

@@ -186,26 +183,6 @@ def update_dcg(
186183
return dcg
187184

188185

189-
def delete_migrated_issue_alert(rule: Rule) -> int | None:
190-
try:
191-
alert_rule_workflow = AlertRuleWorkflow.objects.get(rule_id=rule.id)
192-
except AlertRuleWorkflow.DoesNotExist:
193-
# OK state, rule may not have been migrated
194-
logger.info(
195-
"rule was not dual written or objects were already deleted, returning early",
196-
extra={"rule_id": rule.id},
197-
)
198-
return None
199-
200-
workflow: Workflow = alert_rule_workflow.workflow
201-
workflow_id = workflow.id
202-
203-
delete_workflow(workflow)
204-
alert_rule_workflow.delete()
205-
206-
return workflow_id
207-
208-
209186
def delete_workflow_actions(if_dcg: DataConditionGroup) -> None:
210187
dcg_actions = DataConditionGroupAction.objects.filter(condition_group=if_dcg)
211188
action_ids = dcg_actions.values_list("action_id", flat=True)

src/sentry/workflow_engine/processors/workflow.py

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from typing import DefaultDict
66

77
import sentry_sdk
8-
from django.db import router, transaction
98
from django.db.models import Q
109

1110
from sentry import features
@@ -14,13 +13,7 @@
1413
from sentry.services.eventstore.models import GroupEvent
1514
from sentry.workflow_engine.buffer.batch_client import DelayedWorkflowClient, DelayedWorkflowItem
1615
from sentry.workflow_engine.caches.workflow import get_workflows_by_detectors
17-
from sentry.workflow_engine.models import (
18-
Action,
19-
DataConditionGroup,
20-
Detector,
21-
DetectorWorkflow,
22-
Workflow,
23-
)
16+
from sentry.workflow_engine.models import DataConditionGroup, Detector, DetectorWorkflow, Workflow
2417
from sentry.workflow_engine.models.data_condition import DataCondition
2518
from sentry.workflow_engine.models.workflow_data_condition_group import WorkflowDataConditionGroup
2619
from sentry.workflow_engine.processors.contexts.workflow_event_context import (
@@ -49,32 +42,6 @@ class WorkflowDataConditionGroupType(StrEnum):
4942
WORKFLOW_TRIGGER = "workflow_trigger"
5043

5144

52-
def delete_workflow(workflow: Workflow) -> bool:
53-
with transaction.atomic(router.db_for_write(Workflow)):
54-
action_filters = DataConditionGroup.objects.filter(
55-
workflowdataconditiongroup__workflow=workflow
56-
)
57-
58-
actions = Action.objects.filter(
59-
dataconditiongroupaction__condition_group__in=action_filters
60-
)
61-
62-
# Delete the actions associated with a workflow, this is not a cascade delete
63-
# because we want to create a UI to maintain notification actions separately
64-
if actions:
65-
actions.delete()
66-
67-
if action_filters:
68-
action_filters.delete()
69-
70-
if workflow.when_condition_group:
71-
workflow.when_condition_group.delete()
72-
73-
workflow.delete()
74-
75-
return True
76-
77-
7845
@scopedstats.timer()
7946
def enqueue_workflows(
8047
client: DelayedWorkflowClient,

tests/sentry/workflow_engine/migration_helpers/test_issue_alert_dual_write.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from sentry.testutils.cases import TestCase
2222
from sentry.testutils.helpers import install_slack
2323
from sentry.workflow_engine.migration_helpers.issue_alert_dual_write import (
24-
delete_migrated_issue_alert,
2524
update_migrated_issue_alert,
2625
)
2726
from sentry.workflow_engine.models import (
@@ -368,11 +367,6 @@ def assert_issue_alert_deleted(
368367
assert not DataConditionGroupAction.objects.filter(condition_group=if_dcg).exists()
369368
assert not Action.objects.all().exists()
370369

371-
def test_delete_issue_alert(self) -> None:
372-
delete_migrated_issue_alert(self.issue_alert)
373-
374-
self.assert_issue_alert_deleted(self.workflow, self.when_dcg, self.if_dcg)
375-
376370
def test_delete_issue_alert__rule_deletion_task(self) -> None:
377371
self.issue_alert.update(status=ObjectStatus.PENDING_DELETION)
378372
RegionScheduledDeletion.schedule(self.issue_alert, days=0)

tests/sentry/workflow_engine/processors/test_workflow.py

Lines changed: 1 addition & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from datetime import timedelta
22
from unittest.mock import MagicMock, Mock, patch
33

4-
import pytest
54
from django.utils import timezone
65

76
from sentry.eventstream.base import GroupState
@@ -10,20 +9,13 @@
109
from sentry.models.activity import Activity
1110
from sentry.models.environment import Environment
1211
from sentry.services.eventstore.models import GroupEvent
13-
from sentry.testutils.factories import Factories
1412
from sentry.testutils.helpers.datetime import before_now, freeze_time
1513
from sentry.testutils.helpers.features import with_feature
16-
from sentry.testutils.pytest.fixtures import django_db_all
1714
from sentry.types.activity import ActivityType
1815
from sentry.utils import json
1916
from sentry.utils.cache import cache
2017
from sentry.workflow_engine.buffer.batch_client import DelayedWorkflowClient, DelayedWorkflowItem
21-
from sentry.workflow_engine.models import (
22-
Action,
23-
DataConditionGroup,
24-
DataConditionGroupAction,
25-
Workflow,
26-
)
18+
from sentry.workflow_engine.models import DataConditionGroup
2719
from sentry.workflow_engine.models.data_condition import Condition
2820
from sentry.workflow_engine.models.workflow_fire_history import WorkflowFireHistory
2921
from sentry.workflow_engine.processors.contexts.workflow_event_context import (
@@ -32,7 +24,6 @@
3224
)
3325
from sentry.workflow_engine.processors.data_condition_group import get_data_conditions_for_group
3426
from sentry.workflow_engine.processors.workflow import (
35-
delete_workflow,
3627
enqueue_workflows,
3728
evaluate_workflow_triggers,
3829
evaluate_workflows_action_filters,
@@ -1148,83 +1139,3 @@ def test_enqueue_workflow__adds_to_workflow_engine_set(self) -> None:
11481139
)
11491140
},
11501141
)
1151-
1152-
1153-
@django_db_all
1154-
class TestDeleteWorkflow:
1155-
@pytest.fixture(autouse=True)
1156-
def setUp(self) -> None:
1157-
self.organization = Factories.create_organization()
1158-
self.project = Factories.create_project(organization=self.organization)
1159-
1160-
self.workflow = Factories.create_workflow()
1161-
self.workflow_trigger = Factories.create_data_condition_group(
1162-
organization=self.organization
1163-
)
1164-
self.workflow.when_condition_group = self.workflow_trigger
1165-
self.workflow.save()
1166-
1167-
self.action_filter = Factories.create_data_condition_group(organization=self.organization)
1168-
self.action = Factories.create_action()
1169-
self.action_and_filter = Factories.create_data_condition_group_action(
1170-
condition_group=self.action_filter,
1171-
action=self.action,
1172-
)
1173-
1174-
self.workflow_actions = Factories.create_workflow_data_condition_group(
1175-
workflow=self.workflow,
1176-
condition_group=self.action_filter,
1177-
)
1178-
1179-
self.trigger_condition = Factories.create_data_condition(
1180-
condition_group=self.workflow_trigger,
1181-
comparison=1,
1182-
condition_result=True,
1183-
)
1184-
1185-
self.action_condition = Factories.create_data_condition(
1186-
condition_group=self.action_filter,
1187-
comparison=1,
1188-
condition_result=True,
1189-
)
1190-
1191-
@pytest.mark.parametrize(
1192-
"instance_attr",
1193-
[
1194-
"workflow",
1195-
"workflow_trigger",
1196-
"action_filter",
1197-
"action_and_filter",
1198-
"workflow_actions",
1199-
"trigger_condition",
1200-
"action_condition",
1201-
],
1202-
)
1203-
def test_delete_workflow(self, instance_attr: str) -> None:
1204-
instance = getattr(self, instance_attr)
1205-
instance_id = instance.id
1206-
cls = instance.__class__
1207-
1208-
delete_workflow(self.workflow)
1209-
assert not cls.objects.filter(id=instance_id).exists()
1210-
1211-
def test_delete_workflow__no_actions(self) -> None:
1212-
Action.objects.get(id=self.action.id).delete()
1213-
assert not DataConditionGroupAction.objects.filter(id=self.action_and_filter.id).exists()
1214-
1215-
workflow_id = self.workflow.id
1216-
delete_workflow(self.workflow)
1217-
1218-
assert not Workflow.objects.filter(id=workflow_id).exists()
1219-
1220-
def test_delete_workflow__no_workflow_triggers(self) -> None:
1221-
# TODO - when this condition group is deleted, it's removing the workflow
1222-
# it's basically inverted from what's expected on the cascade delete
1223-
self.workflow.when_condition_group = None
1224-
self.workflow.save()
1225-
1226-
DataConditionGroup.objects.get(id=self.workflow_trigger.id).delete()
1227-
1228-
workflow_id = self.workflow.id
1229-
delete_workflow(self.workflow)
1230-
assert not Workflow.objects.filter(id=workflow_id).exists()

0 commit comments

Comments
 (0)