Skip to content

Commit 28e70ff

Browse files
kconsgeorge-sentry
authored andcommitted
fix(workflows): Don't return Workflows while they're being deleted (#112541)
Fixes ISWF-2420.
1 parent d737c15 commit 28e70ff

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

src/sentry/api/bases/rule.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ def convert_args(
6262
if use_workflow_engine:
6363
try:
6464
arw = AlertRuleWorkflow.objects.get(
65-
rule_id=rule_id, workflow__organization=project.organization
65+
rule_id=rule_id,
66+
workflow__organization=project.organization,
67+
workflow__status=ObjectStatus.ACTIVE,
6668
)
6769
kwargs["rule"] = arw.workflow
6870
except AlertRuleWorkflow.DoesNotExist:

src/sentry/api/endpoints/project_rule_details.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,10 @@ def delete(self, request: Request, project: Project, rule: Rule | Workflow) -> R
451451
rule=rule, user_id=request.user.id, type=RuleActivityType.DELETED.value
452452
)
453453
scheduled = CellScheduledDeletion.schedule(rule, days=0, actor=request.user)
454+
# The Rule's scheduled deletion should take care of the workflow, but
455+
# we mark it pending immediately so we don't return it while the deletion is in progress.
456+
for workflow in Workflow.objects.filter(alertruleworkflow__rule_id=rule.id):
457+
workflow.update(status=ObjectStatus.PENDING_DELETION)
454458

455459
self.create_audit_entry(
456460
request=request,

tests/sentry/api/endpoints/test_project_rule_details.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,16 @@ def test_workflow_engine_granular_flag_single_written_rule(self) -> None:
267267
assert response.data["conditions"][0]["name"]
268268
assert response.data["filters"][0]["name"]
269269

270+
@with_feature("organizations:workflow-engine-issue-alert-endpoints-get")
271+
def test_deleted_dual_written_rule_returns_404(self) -> None:
272+
rule = self.create_project_rule(self.project)
273+
# DELETE schedules deletion but we intentionally do NOT run it
274+
self.get_success_response(
275+
self.organization.slug, rule.project.slug, rule.id, method="delete", status_code=202
276+
)
277+
# GET should 404 even though the scheduled deletion hasn't executed
278+
self.get_error_response(self.organization.slug, rule.project.slug, rule.id, status_code=404)
279+
270280
def test_non_existing_rule(self) -> None:
271281
self.get_error_response(self.organization.slug, self.project.slug, 12345, status_code=404)
272282

0 commit comments

Comments
 (0)