Skip to content

Commit f7dd57e

Browse files
authored
Make groups integration tests less flaky (#965)
## Changes - Fix `test_env_or_skip`: Skipped & Failed needs to be imported as outcomes from `_pytest` - Parametrize `test_group_name_change` suites - Change `validate_migrate_groups` to raise `NotFound`, so flaky tests can be retried ### Tests <!-- How is this tested? Please see the checklist below and also describe any other relevant tests --> - [x] manually tested
1 parent 4ed2554 commit f7dd57e

File tree

2 files changed

+56
-101
lines changed

2 files changed

+56
-101
lines changed

tests/integration/framework/test_fixtures.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import logging
22

33
import pytest
4+
5+
# pylint: disable-next=import-private-name
6+
from _pytest.outcomes import Failed, Skipped
47
from databricks.labs.blueprint.commands import CommandExecutor
58
from databricks.sdk.service.workspace import AclPermission
69

@@ -89,7 +92,7 @@ def test_sql_backend_works(ws, wsfs_wheel):
8992

9093

9194
def test_env_or_skip(env_or_skip):
92-
with pytest.raises((pytest.Skipped, pytest.Failed)):
95+
with pytest.raises((Skipped, Failed)):
9396
env_or_skip("NO_ENV_VAR_HERE")
9497

9598

tests/integration/workspace_access/test_groups.py

Lines changed: 52 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ def test_prepare_environment_no_groups_selected(ws, make_ucx_group, sql_backend,
5050
assert ws_group.display_name in names
5151

5252

53+
# group rename is eventually consistent
54+
@retried(on=[AssertionError], timeout=timedelta(minutes=1))
55+
def check_group_renamed(ws, ws_group):
56+
assert ws.groups.get(ws_group.id).display_name == "ucx-temp-" + ws_group.display_name
57+
58+
5359
@retried(on=[NotFound], timeout=timedelta(minutes=2))
5460
def test_rename_groups(ws, make_ucx_group, sql_backend, inventory_schema):
5561
# FIXME - test_rename_groups - TimeoutError: Timed out after 0:01:00
@@ -58,7 +64,7 @@ def test_rename_groups(ws, make_ucx_group, sql_backend, inventory_schema):
5864
group_manager = GroupManager(sql_backend, ws, inventory_schema, [ws_group.display_name], "ucx-temp-")
5965
group_manager.rename_groups()
6066

61-
assert ws.groups.get(ws_group.id).display_name == "ucx-temp-" + ws_group.display_name
67+
check_group_renamed(ws, ws_group)
6268

6369

6470
@retried(on=[NotFound], timeout=timedelta(minutes=2))
@@ -87,9 +93,8 @@ def test_reflect_account_groups_on_workspace(ws, make_ucx_group, sql_backend, in
8793
assert not reflected_group.roles # Cannot create roles currently
8894
assert not reflected_group.entitlements # Entitlements aren't reflected there
8995

90-
assert (
91-
ws.groups.get(ws_group.id).display_name == "ucx-temp-" + ws_group.display_name
92-
) # At this time previous ws level groups aren't deleted
96+
check_group_renamed(ws, ws_group)
97+
# At this time previous ws level groups aren't deleted
9398

9499

95100
@retried(on=[NotFound], timeout=timedelta(minutes=2))
@@ -124,127 +129,70 @@ def test_delete_ws_groups_should_not_delete_non_reflected_acc_groups(ws, make_uc
124129
group_manager.rename_groups()
125130
group_manager.delete_original_workspace_groups()
126131

127-
assert ws.groups.get(ws_group.id).display_name == "ucx-temp-" + ws_group.display_name
132+
check_group_renamed(ws, ws_group)
128133

129134

130135
def validate_migrate_groups(group_manager: GroupManager, ws_group: Group, to_group: Group):
131-
assert group_manager.has_workspace_group(ws_group.display_name), f'missing workspace group: {ws_group.display_name}'
136+
if not group_manager.has_workspace_group(ws_group.display_name):
137+
raise NotFound(f'missing workspace group: {ws_group.display_name}')
132138
group_manager.rename_groups()
133-
assert group_manager.has_workspace_group(f"ucx-temp-{ws_group.display_name}"), 'missing temp group'
139+
if not group_manager.has_workspace_group(f"ucx-temp-{ws_group.display_name}"):
140+
raise NotFound('missing temp group')
134141
group_manager.reflect_account_groups_on_workspace()
135-
assert group_manager.has_account_group(to_group.display_name), f'missing account group: {to_group.display_name}'
136-
137-
138-
@retried(on=[NotFound], timeout=timedelta(minutes=2))
139-
def test_group_name_change_prefix(ws, sql_backend, inventory_schema, make_ucx_group, make_random):
140-
ws_display_name = f"ucx_{make_random(4)}"
141-
ws_group, accnt_group = make_ucx_group(
142-
workspace_group_name=ws_display_name, account_group_name=f"SAMPLE_{ws_display_name}"
143-
)
144-
logger.info(
145-
f"Attempting Mapping From Workspace Group {ws_group.display_name} to "
146-
f"Account Group {accnt_group.display_name}"
147-
)
148-
group_manager = GroupManager(
149-
sql_backend, ws, inventory_schema, [ws_group.display_name], "ucx-temp-", "^", "SAMPLE_"
150-
)
151-
validate_migrate_groups(group_manager, ws_group, accnt_group)
142+
if not group_manager.has_account_group(to_group.display_name):
143+
raise NotFound(f'missing account group: {to_group.display_name}')
152144

153145

154146
@retried(on=[NotFound], timeout=timedelta(minutes=2))
155-
def test_group_name_change_suffix(ws, sql_backend, inventory_schema, make_ucx_group, make_random):
156-
ws_display_name = f"ucx_{make_random(4)}"
157-
ws_group, accnt_group = make_ucx_group(
158-
workspace_group_name=ws_display_name, account_group_name=f"{ws_display_name}_SAMPLE"
159-
)
160-
logger.info(
161-
f"Attempting Mapping From Workspace Group {ws_group.display_name} to "
162-
f"Account Group {accnt_group.display_name}"
163-
)
164-
group_manager = GroupManager(
165-
sql_backend, ws, inventory_schema, [ws_group.display_name], "ucx-temp-", "$", "_SAMPLE"
166-
)
167-
validate_migrate_groups(group_manager, ws_group, accnt_group)
168-
169-
170-
@retried(on=[NotFound], timeout=timedelta(minutes=2))
171-
def test_group_name_change_substitute(ws, sql_backend, inventory_schema, make_ucx_group, make_random):
172-
random_elem = f"{make_random(4)}"
173-
ws_display_name = f"ucx_engineering_{random_elem}"
174-
acct_display_name = f"ucx_eng_{random_elem}"
175-
ws_group, accnt_group = make_ucx_group(workspace_group_name=ws_display_name, account_group_name=acct_display_name)
176-
logger.info(
177-
f"Attempting Mapping From Workspace Group {ws_group.display_name} to "
178-
f"Account Group {accnt_group.display_name}"
179-
)
180-
group_manager = GroupManager(
181-
sql_backend, ws, inventory_schema, [ws_group.display_name], "ucx-temp-", "engineering", "eng"
182-
)
183-
validate_migrate_groups(group_manager, ws_group, accnt_group)
184-
185-
186-
@retried(on=[NotFound], timeout=timedelta(minutes=2))
187-
def test_group_matching_names(ws, sql_backend, inventory_schema, make_ucx_group, make_random):
188-
rand_elem = make_random(4)
189-
ws_group, accnt_group = make_ucx_group(f"test_group_{rand_elem}", f"same_group_[{rand_elem}]")
190-
logger.info(
191-
f"Attempting Mapping From Workspace Group {ws_group.display_name} to "
192-
f"Account Group {accnt_group.display_name}"
193-
)
147+
@pytest.mark.parametrize("strategy", ["prefix", "suffix", "substitute", "matching"])
148+
def test_group_name_change(ws, sql_backend, inventory_schema, make_ucx_group, make_random, strategy):
149+
random_element = f"ucx{make_random(4)}"
150+
ws_group, account_group = None, None
151+
workspace_group_regex, workspace_group_replace, account_group_regex = None, None, None
152+
match strategy:
153+
case "prefix":
154+
ws_group, account_group = make_ucx_group(random_element, f"SAMPLE_{random_element}")
155+
workspace_group_regex, workspace_group_replace = "^", "SAMPLE_"
156+
case "suffix":
157+
ws_group, account_group = make_ucx_group(random_element, f"{random_element}_SAMPLE")
158+
workspace_group_regex, workspace_group_replace = "$", "_SAMPLE"
159+
case "substitute":
160+
ws_group, account_group = make_ucx_group(f"ucx_engineering_{random_element}", f"ucx_eng_{random_element}")
161+
workspace_group_regex, workspace_group_replace = "engineering", "eng"
162+
case "matching":
163+
ws_group, account_group = make_ucx_group(f"test_group_{random_element}", f"same_group_[{random_element}]")
164+
workspace_group_regex, account_group_regex = r"([0-9a-zA-Z]*)$", r"\[([0-9a-zA-Z]*)\]"
194165
group_manager = GroupManager(
195166
sql_backend,
196167
ws,
197168
inventory_schema,
198169
[ws_group.display_name],
199170
"ucx-temp-",
200-
workspace_group_regex=r"([0-9a-zA-Z]*)$",
201-
account_group_regex=r"\[([0-9a-zA-Z]*)\]",
171+
workspace_group_regex,
172+
workspace_group_replace,
173+
account_group_regex,
202174
)
203-
validate_migrate_groups(group_manager, ws_group, accnt_group)
204-
205-
206-
@retried(on=[NotFound], timeout=timedelta(minutes=2))
207-
def test_group_matching_names_with_diff_users(
208-
ws, sql_backend, inventory_schema, make_random, make_user, make_group, make_acc_group
209-
):
210-
rand_elem = make_random(4)
211-
workspace_group_name = f"test_group_{rand_elem}"
212-
account_group_name = f"same_group_[{rand_elem}]"
213-
user1 = make_user()
214-
user2 = make_user()
215-
members1 = [user1.id]
216-
members2 = [user2.id]
217-
ws_group = make_group(display_name=workspace_group_name, members=members1, entitlements=["allow-cluster-create"])
218-
accnt_group = make_acc_group(display_name=account_group_name, members=members2)
219-
220175
logger.info(
221176
f"Attempting Mapping From Workspace Group {ws_group.display_name} to "
222-
f"Account Group {accnt_group.display_name}"
177+
f"Account Group {account_group.display_name}"
223178
)
224-
group_manager = GroupManager(
225-
sql_backend,
226-
ws,
227-
inventory_schema,
228-
[ws_group.display_name],
229-
"ucx-temp-",
230-
workspace_group_regex=r"([0-9a-zA-Z]*)$",
231-
account_group_regex=r"\[([0-9a-zA-Z]*)\]",
232-
)
233-
234-
membership = group_manager.validate_group_membership()
235-
assert len(membership) > 0
179+
validate_migrate_groups(group_manager, ws_group, account_group)
236180

237181

238182
@retried(on=[NotFound], timeout=timedelta(minutes=2))
239-
def test_group_matching_names_with_same_users(
240-
ws, sql_backend, inventory_schema, make_random, make_user, make_group, make_acc_group
183+
@pytest.mark.parametrize("same_user", [True, False])
184+
def test_group_matching_names(
185+
ws, sql_backend, inventory_schema, make_random, make_user, make_group, make_acc_group, same_user
241186
):
242187
rand_elem = make_random(4)
243188
workspace_group_name = f"test_group_{rand_elem}"
244189
account_group_name = f"same_group_[{rand_elem}]"
245190
user1 = make_user()
246191
members1 = [user1.id]
247192
members2 = [user1.id]
193+
if not same_user:
194+
user2 = make_user()
195+
members2 = [user2.id]
248196
ws_group = make_group(display_name=workspace_group_name, members=members1, entitlements=["allow-cluster-create"])
249197
acc_group = make_acc_group(display_name=account_group_name, members=members2)
250198

@@ -257,12 +205,16 @@ def test_group_matching_names_with_same_users(
257205
inventory_schema,
258206
[ws_group.display_name],
259207
"ucx-temp-",
260-
workspace_group_regex=r"([0-9a-zA-Z]*)$",
261-
account_group_regex=r"\[([0-9a-zA-Z]*)\]",
208+
r"([0-9a-zA-Z]*)$",
209+
None,
210+
r"\[([0-9a-zA-Z]*)\]",
262211
)
263212

264213
membership = group_manager.validate_group_membership()
265-
assert len(membership) == 0
214+
if same_user:
215+
assert len(membership) == 0
216+
else:
217+
assert len(membership) > 0
266218

267219

268220
# average runtime is 100 seconds

0 commit comments

Comments
 (0)