Skip to content

Commit

Permalink
fix(versioning): prevent task from deleting all unrelated feature sta…
Browse files Browse the repository at this point in the history
…tes / feature segments (#3955)
  • Loading branch information
matthewelwell authored May 15, 2024
1 parent aae116b commit 0ed5148
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 5 deletions.
10 changes: 5 additions & 5 deletions api/features/versioning/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ def disable_v2_versioning(environment_id: int) -> None:
latest_feature_state_ids = [fs.id for fs in latest_feature_states]

# delete any feature states and feature segments associated with older versions
FeatureState.objects.filter(identity_id__isnull=True).exclude(
id__in=latest_feature_state_ids
).delete()
FeatureSegment.objects.exclude(
FeatureState.objects.filter(
identity_id__isnull=True, environment=environment
).exclude(id__in=latest_feature_state_ids).delete()
FeatureSegment.objects.filter(environment=environment).exclude(
feature_states__id__in=latest_feature_state_ids
).delete()

Expand All @@ -60,7 +60,7 @@ def disable_v2_versioning(environment_id: int) -> None:
version=1, live_from=timezone.now(), environment_feature_version=None
)
FeatureSegment.objects.filter(
feature_states__id__in=latest_feature_state_ids
environment=environment, feature_states__id__in=latest_feature_state_ids
).update(environment_feature_version=None)

EnvironmentFeatureVersion.objects.filter(environment=environment).delete()
Expand Down
20 changes: 20 additions & 0 deletions api/tests/unit/features/versioning/test_unit_versioning_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from features.versioning.versioning_service import (
get_environment_flags_queryset,
)
from projects.models import Project
from segments.models import Segment
from users.models import FFAdminUser
from webhooks.webhooks import WebhookEventType
Expand All @@ -37,6 +38,7 @@ def test_enable_v2_versioning(

def test_disable_v2_versioning(
environment_v2_versioning: Environment,
project: Project,
feature: Feature,
segment: Segment,
staff_user: FFAdminUser,
Expand Down Expand Up @@ -85,6 +87,21 @@ def test_disable_v2_versioning(
environment=environment_v2_versioning,
)

# Finally, let's create another environment and confirm its
# feature states are unaffected.
unaffected_environment = Environment.objects.create(
name="Unaffected environment", project=project
)
FeatureState.objects.create(
feature=feature,
environment=unaffected_environment,
feature_segment=FeatureSegment.objects.create(
segment=segment,
feature=feature,
environment=unaffected_environment,
),
)

# When
disable_v2_versioning(environment_v2_versioning.id)
environment_v2_versioning.refresh_from_db()
Expand Down Expand Up @@ -114,6 +131,9 @@ def test_disable_v2_versioning(
is True
)

assert unaffected_environment.feature_states.count() == 2
assert unaffected_environment.feature_segments.count() == 1


def test_trigger_update_version_webhooks(
environment_v2_versioning: Environment, feature: Feature, mocker: MockerFixture
Expand Down

0 comments on commit 0ed5148

Please sign in to comment.