Skip to content

Commit 8c59632

Browse files
authored
Simplify migrated_group permission migration fixture (#1136)
## Changes Applied remaining feedback for #1080 ### Linked issues <!-- DOC: Link issue with a keyword: close, closes, closed, fix, fixes, fixed, resolve, resolves, resolved. See https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword --> Follow up for #1080 ### Tests <!-- How is this tested? Please see the checklist below and also describe any other relevant tests --> - [x] manually tested - [ ] verified on staging environment (screenshot attached)
1 parent 86adf16 commit 8c59632

File tree

7 files changed

+49
-63
lines changed

7 files changed

+49
-63
lines changed

src/databricks/labs/ucx/mixins/fixtures.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -649,17 +649,12 @@ def make_acc_group(acc, make_random):
649649

650650

651651
@pytest.fixture
652-
def make_migrated_group(acc, ws, make_group, make_acc_group):
652+
def migrated_group(acc, ws, make_group, make_acc_group):
653653
"""Create a pair of groups in workspace and account. Assign account group to workspace."""
654-
655-
def inner():
656-
ws_group = make_group()
657-
acc_group = make_acc_group()
658-
acc.workspace_assignment.update(ws.get_workspace_id(), acc_group.id, [iam.WorkspacePermission.USER])
659-
# need to return both, as acc_group.id is not in MigratedGroup dataclass
660-
return MigratedGroup.partial_info(ws_group, acc_group)
661-
662-
return inner
654+
ws_group = make_group()
655+
acc_group = make_acc_group()
656+
acc.workspace_assignment.update(ws.get_workspace_id(), acc_group.id, [iam.WorkspacePermission.USER])
657+
return MigratedGroup.partial_info(ws_group, acc_group)
663658

664659

665660
@pytest.fixture

src/databricks/labs/ucx/workspace_access/groups.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,28 +99,27 @@ def apply_group_permissions_experimental(self, ws: WorkspaceClient) -> bool:
9999

100100
@staticmethod
101101
def _migrate_group_permissions_paginated(ws: WorkspaceClient, migrated_group: MigratedGroup):
102-
103102
batch_size = 1000
104103
logger.info(
105104
f"Migrating permissions from workspace group {migrated_group.name_in_workspace} "
106105
f"to account group: {migrated_group.name_in_account}."
107106
)
107+
permissions_migrated = 0
108108
while True:
109109
response = ws.permission_migration.migrate_permissions(
110110
ws.get_workspace_id(),
111111
migrated_group.name_in_workspace,
112112
migrated_group.name_in_account,
113113
size=batch_size,
114114
)
115-
# response shouldn't be empty
116-
if response.permissions_migrated is None:
117-
break
118-
# no more permissions to migrate
119-
if response.permissions_migrated == 0:
115+
if not response.permissions_migrated:
120116
logger.info("No more permission to migrated.")
121-
break
122-
logger.info(f"Migrated {response.permissions_migrated} permissions.")
123-
return 1
117+
return permissions_migrated
118+
permissions_migrated += response.permissions_migrated
119+
logger.info(
120+
f"Migrated {response.permissions_migrated} permissions to "
121+
f"{migrated_group.name_in_account} account group"
122+
)
124123

125124

126125
class GroupMigrationStrategy:

tests/integration/workspace_access/test_generic.py

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@
3131
def test_instance_pools(
3232
ws: WorkspaceClient,
3333
permission_manager: PermissionManager,
34-
make_migrated_group,
34+
migrated_group,
3535
make_instance_pool,
3636
make_instance_pool_permissions,
3737
is_experimental: bool,
3838
):
39-
migrated_group = make_migrated_group()
4039
pool = make_instance_pool()
4140
make_instance_pool_permissions(
4241
object_id=pool.instance_pool_id,
@@ -67,13 +66,12 @@ def test_instance_pools(
6766
def test_clusters(
6867
ws: WorkspaceClient,
6968
permission_manager: PermissionManager,
70-
make_migrated_group,
69+
migrated_group,
7170
make_cluster,
7271
make_cluster_permissions,
7372
env_or_skip,
7473
is_experimental: bool,
7574
):
76-
migrated_group = make_migrated_group()
7775
cluster = make_cluster(instance_pool_id=env_or_skip("TEST_INSTANCE_POOL_ID"), single_node=True)
7876
make_cluster_permissions(
7977
object_id=cluster.cluster_id,
@@ -104,12 +102,11 @@ def test_clusters(
104102
def test_jobs(
105103
ws: WorkspaceClient,
106104
permission_manager: PermissionManager,
107-
make_migrated_group,
105+
migrated_group,
108106
make_job,
109107
make_job_permissions,
110108
is_experimental: bool,
111109
):
112-
migrated_group = make_migrated_group()
113110
job = make_job()
114111
make_job_permissions(
115112
object_id=job.job_id,
@@ -140,12 +137,11 @@ def test_jobs(
140137
def test_pipelines(
141138
ws: WorkspaceClient,
142139
permission_manager: PermissionManager,
143-
make_migrated_group,
140+
migrated_group,
144141
make_pipeline,
145142
make_pipeline_permissions,
146143
is_experimental: bool,
147144
):
148-
migrated_group = make_migrated_group()
149145
pipeline = make_pipeline()
150146
make_pipeline_permissions(
151147
object_id=pipeline.pipeline_id,
@@ -176,12 +172,11 @@ def test_pipelines(
176172
def test_cluster_policies(
177173
ws: WorkspaceClient,
178174
permission_manager: PermissionManager,
179-
make_migrated_group,
175+
migrated_group,
180176
make_cluster_policy,
181177
make_cluster_policy_permissions,
182178
is_experimental: bool,
183179
):
184-
migrated_group = make_migrated_group()
185180
cluster_policy = make_cluster_policy()
186181
make_cluster_policy_permissions(
187182
object_id=cluster_policy.policy_id,
@@ -212,12 +207,11 @@ def test_cluster_policies(
212207
def test_warehouses(
213208
ws: WorkspaceClient,
214209
permission_manager: PermissionManager,
215-
make_migrated_group,
210+
migrated_group,
216211
make_warehouse,
217212
make_warehouse_permissions,
218213
is_experimental: bool,
219214
):
220-
migrated_group = make_migrated_group()
221215
warehouse = make_warehouse()
222216
make_warehouse_permissions(
223217
object_id=warehouse.id,
@@ -248,12 +242,11 @@ def test_warehouses(
248242
def test_models(
249243
ws: WorkspaceClient,
250244
permission_manager: PermissionManager,
251-
make_migrated_group,
245+
migrated_group,
252246
make_model,
253247
make_registered_model_permissions, # pylint: disable=invalid-name
254248
is_experimental: bool,
255249
):
256-
migrated_group = make_migrated_group()
257250
model = make_model()
258251
make_registered_model_permissions(
259252
object_id=model.id,
@@ -284,12 +277,11 @@ def test_models(
284277
def test_experiments(
285278
ws: WorkspaceClient,
286279
permission_manager: PermissionManager,
287-
make_migrated_group,
280+
migrated_group,
288281
make_experiment,
289282
make_experiment_permissions,
290283
is_experimental: bool,
291284
):
292-
migrated_group = make_migrated_group()
293285
experiment = make_experiment()
294286
make_experiment_permissions(
295287
object_id=experiment.experiment_id,
@@ -319,12 +311,11 @@ def test_directories(
319311
sql_backend,
320312
inventory_schema,
321313
permission_manager: PermissionManager,
322-
make_migrated_group,
314+
migrated_group,
323315
make_directory,
324316
make_directory_permissions,
325317
is_experimental: bool,
326318
):
327-
migrated_group = make_migrated_group()
328319
directory = make_directory()
329320
make_directory_permissions(
330321
object_id=directory,
@@ -364,12 +355,11 @@ def test_notebooks(
364355
permission_manager: PermissionManager,
365356
sql_backend,
366357
inventory_schema,
367-
make_migrated_group,
358+
migrated_group,
368359
make_notebook,
369360
make_notebook_permissions,
370361
is_experimental: bool,
371362
):
372-
migrated_group = make_migrated_group()
373363
notebook = make_notebook()
374364
make_notebook_permissions(
375365
object_id=notebook,
@@ -407,11 +397,10 @@ def test_notebooks(
407397
def test_tokens(
408398
ws: WorkspaceClient,
409399
permission_manager: PermissionManager,
410-
make_migrated_group,
400+
migrated_group,
411401
make_authorization_permissions,
412402
is_experimental: bool,
413403
):
414-
migrated_group = make_migrated_group()
415404
make_authorization_permissions(
416405
object_id="tokens",
417406
permission_level=PermissionLevel.CAN_USE,
@@ -437,7 +426,7 @@ def test_tokens(
437426

438427

439428
@retried(on=[BadRequest], timeout=timedelta(minutes=3))
440-
def test_verify_permissions(ws: WorkspaceClient, make_group, make_migrated_group, make_job, make_job_permissions):
429+
def test_verify_permissions(ws: WorkspaceClient, make_group, make_job, make_job_permissions):
441430
group_a = make_group()
442431
job = make_job()
443432
make_job_permissions(
@@ -483,12 +472,11 @@ def test_verify_permissions(ws: WorkspaceClient, make_group, make_migrated_group
483472
def test_endpoints(
484473
ws: WorkspaceClient,
485474
permission_manager: PermissionManager,
486-
make_migrated_group,
475+
migrated_group,
487476
make_serving_endpoint,
488477
make_serving_endpoint_permissions, # pylint: disable=invalid-name
489478
is_experimental: bool,
490479
):
491-
migrated_group = make_migrated_group()
492480
endpoint = make_serving_endpoint()
493481
make_serving_endpoint_permissions(
494482
object_id=endpoint.response.id,
@@ -513,12 +501,11 @@ def test_endpoints(
513501
def test_feature_tables(
514502
ws: WorkspaceClient,
515503
permission_manager: PermissionManager,
516-
make_migrated_group,
504+
migrated_group,
517505
make_feature_table,
518506
make_feature_table_permissions,
519507
is_experimental: bool,
520508
):
521-
migrated_group = make_migrated_group()
522509
feature_table = make_feature_table()
523510
make_feature_table_permissions(
524511
object_id=feature_table["id"],
@@ -545,10 +532,9 @@ def test_feature_tables(
545532
def test_feature_store_root_page(
546533
ws: WorkspaceClient,
547534
permission_manager: PermissionManager,
548-
make_migrated_group,
535+
migrated_group,
549536
is_experimental: bool,
550537
):
551-
migrated_group = make_migrated_group()
552538
ws.permissions.update(
553539
"feature-tables",
554540
"/root",
@@ -581,10 +567,9 @@ def test_feature_store_root_page(
581567
def test_models_root_page(
582568
ws: WorkspaceClient,
583569
permission_manager: PermissionManager,
584-
make_migrated_group,
570+
migrated_group,
585571
is_experimental: bool,
586572
):
587-
migrated_group = make_migrated_group()
588573

589574
ws.permissions.update(
590575
"registered-models",

tests/integration/workspace_access/test_redash.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
def test_permissions_for_redash(
2424
ws,
2525
make_group,
26-
make_migrated_group,
26+
migrated_group,
2727
make_user,
2828
make_query,
2929
make_query_permissions,
@@ -32,7 +32,6 @@ def test_permissions_for_redash(
3232
):
3333
ws_group_temp = make_group() # simulate temp/backup group
3434
user = make_user()
35-
migrated_group = make_migrated_group()
3635

3736
query = make_query()
3837
make_query_permissions(

tests/integration/workspace_access/test_scim.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def test_some_entitlements(
2727
ws_group = make_group()
2828
acc_group = make_acc_group()
2929
acc.workspace_assignment.update(ws.get_workspace_id(), acc_group.id, [iam.WorkspacePermission.USER])
30-
migrated_group = MigratedGroup.partial_info(ws_group, acc_group)
30+
migrated_groups = MigratedGroup.partial_info(ws_group, acc_group)
3131
ws.groups.patch(
3232
ws_group.id,
3333
operations=[
@@ -45,9 +45,9 @@ def test_some_entitlements(
4545
assert "databricks-sql-access" in before
4646

4747
if use_permission_migration_api:
48-
MigrationState([migrated_group]).apply_group_permissions_experimental(ws)
48+
MigrationState([migrated_groups]).apply_group_permissions_experimental(ws)
4949
else:
50-
apply_tasks(scim_support, [migrated_group])
50+
apply_tasks(scim_support, [migrated_groups])
5151

5252
_, after = scim_support.load_for_group(acc_group.id)
5353
assert "databricks-sql-access" in after

tests/integration/workspace_access/test_secrets.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@
2323
@retried(on=[NotFound], timeout=timedelta(minutes=3))
2424
def test_permissions_for_secrets(
2525
ws: WorkspaceClient,
26-
make_migrated_group,
26+
migrated_group,
2727
make_secret_scope,
2828
make_secret_scope_acl,
2929
permission_manager: PermissionManager,
3030
use_permission_migration_api: bool,
3131
):
32-
migrated_group = make_migrated_group()
3332

3433
scope = make_secret_scope()
3534
make_secret_scope_acl(scope=scope, principal=migrated_group.name_in_workspace, permission=AclPermission.WRITE)

tests/performance/test_performance.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55
from functools import partial
66
from time import process_time
77

8+
import pytest
89
from databricks.labs.blueprint.parallel import Threads
910
from databricks.labs.lsql.backends import SqlBackend
1011
from databricks.sdk import WorkspaceClient
1112
from databricks.sdk.service import iam
1213

1314
from databricks.labs.ucx.workspace_access.base import Permissions
14-
from databricks.labs.ucx.workspace_access.groups import MigrationState
15+
from databricks.labs.ucx.workspace_access.groups import MigratedGroup, MigrationState
1516
from databricks.labs.ucx.workspace_access.manager import PermissionManager
1617

1718
logger = logging.getLogger(__name__)
@@ -27,21 +28,28 @@ class WorkspaceObject:
2728
type: str
2829

2930

31+
@pytest.fixture
32+
def migrated_group_experimental(acc, ws, make_group, make_acc_group):
33+
"""Create a pair of groups in workspace and account. Assign account group to workspace."""
34+
ws_group = make_group()
35+
acc_group = make_acc_group()
36+
acc.workspace_assignment.update(ws.get_workspace_id(), acc_group.id, [iam.WorkspacePermission.USER])
37+
return MigratedGroup.partial_info(ws_group, acc_group)
38+
39+
3040
def test_apply_group_permissions_experimental_performance(
3141
ws: WorkspaceClient,
3242
sql_backend: SqlBackend,
3343
inventory_schema,
34-
permission_manager: PermissionManager,
35-
make_migrated_group,
44+
migrated_group,
45+
migrated_group_experimental,
3646
make_experiment,
3747
make_model,
3848
make_cluster_policy,
3949
env_or_skip,
4050
):
4151
# Making sure this test can only be launched from local
42-
env_or_skip("PWD")
43-
migrated_group_experimental = make_migrated_group()
44-
migrated_group = make_migrated_group()
52+
env_or_skip("IDE_PROJECT_ROOTS")
4553
ws_objects = [
4654
WorkspaceObject(partial(make_experiment), [iam.PermissionLevel.CAN_MANAGE], "experiment_id", "experiments"),
4755
WorkspaceObject(
@@ -67,6 +75,7 @@ def test_apply_group_permissions_experimental_performance(
6775
logger.info(f"Migration using experimental API takes {process_time() - start}s")
6876

6977
start = process_time()
78+
permission_manager = PermissionManager.factory(ws, sql_backend, inventory_schema)
7079
permission_manager.apply_group_permissions(MigrationState([migrated_group]))
7180
logger.info(f"Migration using normal approach takes {process_time() - start}s")
7281

0 commit comments

Comments
 (0)