Skip to content

Commit 6b73235

Browse files
committed
Add ability to skip identity overrides when migrating to environments_v2
1 parent fe21496 commit 6b73235

File tree

4 files changed

+62
-17
lines changed

4 files changed

+62
-17
lines changed

api/environments/dynamodb/services.py

+17-13
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
logger = logging.getLogger(__name__)
1818

1919

20-
def migrate_environments_to_v2(project_id: int) -> IdentityOverridesV2Changeset | None:
20+
def migrate_environments_to_v2(
21+
project_id: int,
22+
skip_identity_overrides: bool,
23+
) -> IdentityOverridesV2Changeset | None:
2124
dynamo_wrapper_v2 = DynamoEnvironmentV2Wrapper()
2225
identity_wrapper = DynamoIdentityWrapper()
2326

@@ -27,19 +30,20 @@ def migrate_environments_to_v2(project_id: int) -> IdentityOverridesV2Changeset
2730
logger.info("Migrating environments to v2 for project %d", project_id)
2831

2932
environments_to_migrate = Environment.objects.filter(project_id=project_id)
30-
identity_overrides_to_migrate = _iter_paginated_overrides(
31-
identity_wrapper=identity_wrapper,
32-
environments=environments_to_migrate,
33-
)
3433

35-
changeset = IdentityOverridesV2Changeset(
36-
to_put=list(identity_overrides_to_migrate), to_delete=[]
37-
)
38-
logger.info(
39-
"Retrieved %d identity overrides to migrate for project %d",
40-
len(changeset.to_put),
41-
project_id,
42-
)
34+
changeset = IdentityOverridesV2Changeset(to_put=[], to_delete=[])
35+
if not skip_identity_overrides:
36+
changeset.to_put = [
37+
*_iter_paginated_overrides(
38+
identity_wrapper=identity_wrapper,
39+
environments=environments_to_migrate,
40+
)
41+
]
42+
logger.info(
43+
"Retrieved %d identity overrides to migrate for project %d",
44+
len(changeset.to_put),
45+
project_id,
46+
)
4347

4448
dynamo_wrapper_v2.write_environments(environments_to_migrate)
4549
dynamo_wrapper_v2.update_identity_overrides(changeset)

api/projects/tasks.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ def migrate_project_environments_to_v2(project_id: int) -> None:
1717

1818
with transaction.atomic():
1919
project = Project.objects.select_for_update().get(id=project_id)
20-
if migrate_environments_to_v2(project_id=project_id):
20+
if migrate_environments_to_v2(
21+
project_id=project_id,
22+
skip_identity_overrides=True,
23+
):
2124
project.identity_overrides_v2_migration_status = (
2225
IdentityOverridesV2MigrationStatus.COMPLETE
2326
)

api/tests/unit/environments/dynamodb/test_unit_services.py

+38-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ def test_migrate_environments_to_v2__environment_with_overrides__writes_expected
4848
)
4949

5050
# When
51-
migrate_environments_to_v2(project_id=environment.project_id)
51+
migrate_environments_to_v2(
52+
project_id=environment.project_id,
53+
skip_identity_overrides=False,
54+
)
5255

5356
# Then
5457
results = flagsmith_environments_v2_table.scan()["Items"]
@@ -73,8 +76,41 @@ def test_migrate_environments_to_v2__wrapper_disabled__does_not_write(
7376
)
7477

7578
# When
76-
migrate_environments_to_v2(project_id=mocker.Mock())
79+
migrate_environments_to_v2(
80+
project_id=mocker.Mock(),
81+
skip_identity_overrides=False,
82+
)
7783

7884
# Then
7985
mocked_dynamodb_identity_wrapper.return_value.assert_not_called()
8086
mocked_dynamodb_v2_wrapper.return_value.assert_not_called()
87+
88+
89+
def test_migrate_environments_to_v2__project_skip_identity_overrides_true__only_writes_environment(
90+
environment: Environment,
91+
identity: Identity,
92+
identity_featurestate: FeatureState,
93+
dynamodb_identity_wrapper: DynamoIdentityWrapper,
94+
dynamodb_wrapper_v2: DynamoEnvironmentV2Wrapper,
95+
flagsmith_environments_v2_table: Table,
96+
) -> None:
97+
# Given
98+
engine_identity = map_identity_to_engine(identity, with_overrides=True)
99+
dynamodb_identity_wrapper.put_item(
100+
map_engine_identity_to_identity_document(engine_identity)
101+
)
102+
103+
expected_environment_document = map_environment_to_environment_v2_document(
104+
environment
105+
)
106+
107+
# When
108+
migrate_environments_to_v2(
109+
project_id=environment.project_id,
110+
skip_identity_overrides=True,
111+
)
112+
113+
# Then
114+
results = flagsmith_environments_v2_table.scan()["Items"]
115+
assert len(results) == 1
116+
assert results[0] == expected_environment_document

api/tests/unit/projects/test_unit_projects_tasks.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def test_migrate_project_environments_to_v2__calls_expected(
6161
project_v2_migration_in_progress.refresh_from_db()
6262
mocked_migrate_environments_to_v2.assert_called_once_with(
6363
project_id=project_v2_migration_in_progress.id,
64+
skip_identity_overrides=False,
6465
)
6566
assert (
6667
project_v2_migration_in_progress.identity_overrides_v2_migration_status
@@ -91,7 +92,8 @@ def test_migrate_project_environments_to_v2__expected_status_on_error(
9192

9293
# Then
9394
mocked_migrate_environments_to_v2.assert_called_once_with(
94-
project_id=project_v2_migration_in_progress.id
95+
project_id=project_v2_migration_in_progress.id,
96+
skip_identity_overrides=False,
9597
)
9698
assert project_v2_migration_in_progress.identity_overrides_v2_migration_status == (
9799
IdentityOverridesV2MigrationStatus.IN_PROGRESS

0 commit comments

Comments
 (0)