Skip to content

Commit 0ac7c58

Browse files
authored
Migrate instance pool to the new fixture framework (#161)
1 parent 34321fc commit 0ac7c58

File tree

3 files changed

+48
-65
lines changed

3 files changed

+48
-65
lines changed

src/databricks/labs/ucx/inventory/permissions.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,27 @@ def apply_group_permissions(self, migration_state: GroupMigrationState, destinat
299299

300300
self._apply_permissions_in_parallel(requests=permission_payloads)
301301
logger.info(f"All permissions were applied for {destination} groups")
302+
303+
def verify_applied_permissions(
304+
self,
305+
object_type: str,
306+
object_id: str,
307+
migration_state: GroupMigrationState,
308+
target: Literal["backup", "account"],
309+
):
310+
op = self._ws.permissions.get(object_type, object_id)
311+
for info in migration_state.groups:
312+
src_permissions = sorted(
313+
[_ for _ in op.access_control_list if _.group_name == info.workspace.display_name],
314+
key=lambda p: p.group_name,
315+
)
316+
dst_permissions = sorted(
317+
[_ for _ in op.access_control_list if _.group_name == getattr(info, target).display_name],
318+
key=lambda p: p.group_name,
319+
)
320+
assert len(dst_permissions) == len(
321+
src_permissions
322+
), f"Target permissions were not applied correctly for {object_type}/{object_id}"
323+
assert [t.all_permissions for t in dst_permissions] == [
324+
s.all_permissions for s in src_permissions
325+
], f"Target permissions were not applied correctly for {object_type}/{object_id}"

tests/integration/conftest.py

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
import pytest
1010
from databricks.sdk import AccountClient, WorkspaceClient
1111
from databricks.sdk.core import Config, DatabricksError
12-
from databricks.sdk.service.compute import (
13-
ClusterDetails,
14-
CreateInstancePoolResponse,
15-
CreatePolicyResponse,
16-
)
12+
from databricks.sdk.service.compute import ClusterDetails, CreatePolicyResponse
1713
from databricks.sdk.service.iam import AccessControlRequest, PermissionLevel
1814
from databricks.sdk.service.jobs import CreateResponse
1915
from databricks.sdk.service.ml import CreateExperimentResponse, ModelDatabricks
@@ -273,31 +269,6 @@ def instance_profiles(env: EnvironmentInfo, ws: WorkspaceClient) -> list[Instanc
273269
logger.debug("Test instance profiles deleted")
274270

275271

276-
@pytest.fixture
277-
def instance_pools(env: EnvironmentInfo, ws: WorkspaceClient) -> list[CreateInstancePoolResponse]:
278-
logger.debug("Creating test instance pools")
279-
280-
test_instance_pools: list[CreateInstancePoolResponse] = [
281-
ws.instance_pools.create(instance_pool_name=f"{env.test_uid}-test-{i}", node_type_id="i3.xlarge")
282-
for i in range(NUM_TEST_INSTANCE_POOLS)
283-
]
284-
285-
_set_random_permissions(
286-
test_instance_pools,
287-
"instance_pool_id",
288-
RequestObjectType.INSTANCE_POOLS,
289-
env,
290-
ws,
291-
permission_levels=[PermissionLevel.CAN_ATTACH_TO, PermissionLevel.CAN_MANAGE],
292-
)
293-
294-
yield test_instance_pools
295-
296-
logger.debug("Deleting test instance pools")
297-
executables = [partial(ws.instance_pools.delete, p.instance_pool_id) for p in test_instance_pools]
298-
Threader(executables).run()
299-
300-
301272
@pytest.fixture
302273
def pipelines(env: EnvironmentInfo, ws: WorkspaceClient) -> list[CreatePipelineResponse]:
303274
logger.debug("Creating test DLT pipelines")
@@ -580,7 +551,7 @@ def workspace_objects(ws: WorkspaceClient, env: EnvironmentInfo) -> WorkspaceObj
580551

581552
ws.permissions.set(
582553
request_object_type=RequestObjectType.DIRECTORIES,
583-
request_object_id=object_info._object_id,
554+
request_object_id=object_info.object_id,
584555
access_control_list=[
585556
AccessControlRequest(group_name=ws_group.display_name, permission_level=PermissionLevel.CAN_MANAGE)
586557
],
@@ -599,7 +570,7 @@ def workspace_objects(ws: WorkspaceClient, env: EnvironmentInfo) -> WorkspaceObj
599570
notebooks.append(_nb_obj)
600571
ws.permissions.set(
601572
request_object_type=RequestObjectType.NOTEBOOKS,
602-
request_object_id=_nb_obj._object_id,
573+
request_object_id=_nb_obj.object_id,
603574
access_control_list=[
604575
AccessControlRequest(group_name=random_group.display_name, permission_level=PermissionLevel.CAN_EDIT)
605576
],
@@ -609,7 +580,7 @@ def workspace_objects(ws: WorkspaceClient, env: EnvironmentInfo) -> WorkspaceObj
609580
root_dir=ObjectInfo(
610581
path=f"/{env.test_uid}",
611582
object_type=ObjectType.DIRECTORY,
612-
object_id=ws.workspace.get_status(f"/{env.test_uid}")._object_id,
583+
object_id=ws.workspace.get_status(f"/{env.test_uid}").object_id,
613584
),
614585
directories=base_dirs,
615586
notebooks=notebooks,
@@ -623,7 +594,6 @@ def workspace_objects(ws: WorkspaceClient, env: EnvironmentInfo) -> WorkspaceObj
623594
@pytest.fixture
624595
def verifiable_objects(
625596
clusters,
626-
instance_pools,
627597
cluster_policies,
628598
pipelines,
629599
jobs,
@@ -639,7 +609,6 @@ def verifiable_objects(
639609
(secret_scopes, "secret_scopes", None),
640610
(tokens, "tokens", RequestObjectType.AUTHORIZATION),
641611
(clusters, "cluster_id", RequestObjectType.CLUSTERS),
642-
(instance_pools, "instance_pool_id", RequestObjectType.INSTANCE_POOLS),
643612
(cluster_policies, "policy_id", RequestObjectType.CLUSTER_POLICIES),
644613
(pipelines, "pipeline_id", RequestObjectType.PIPELINES),
645614
(jobs, "job_id", RequestObjectType.JOBS),

tests/integration/test_e2e.py

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import logging
2+
import random
23
from typing import Literal
34

45
import pytest
56
from databricks.sdk import WorkspaceClient
67
from databricks.sdk.service.iam import (
78
AccessControlRequest,
89
AccessControlResponse,
9-
ObjectPermissions,
1010
Permission,
11+
PermissionLevel,
1112
)
1213
from databricks.sdk.service.workspace import SecretScope
1314
from pyspark.errors import AnalysisException
@@ -18,6 +19,7 @@
1819
InventoryConfig,
1920
InventoryTable,
2021
MigrationConfig,
22+
TaclConfig,
2123
)
2224
from databricks.labs.ucx.inventory.types import RequestObjectType
2325
from databricks.labs.ucx.providers.groups_info import GroupMigrationState
@@ -116,35 +118,12 @@ def _verify_group_permissions(
116118
assert [p.all_permissions for p in sorted_ws] == [p.all_permissions for p in sorted_target]
117119
else:
118120
for _object in objects:
119-
_object_permissions: ObjectPermissions = ws.permissions.get(
120-
request_object_type, getattr(_object, id_attribute)
121+
toolkit.permissions_manager.verify_applied_permissions(
122+
request_object_type,
123+
getattr(_object, id_attribute),
124+
toolkit.group_manager.migration_groups_provider,
125+
target,
121126
)
122-
for migration_info in toolkit.group_manager.migration_groups_provider.groups:
123-
target_permissions = sorted(
124-
[
125-
p
126-
for p in _object_permissions.access_control_list
127-
if p.group_name == getattr(migration_info, target).display_name
128-
],
129-
key=lambda p: p.group_name,
130-
)
131-
132-
source_permissions = sorted(
133-
[
134-
p
135-
for p in _object_permissions.access_control_list
136-
if p.group_name == migration_info.workspace.display_name
137-
],
138-
key=lambda p: p.group_name,
139-
)
140-
141-
assert len(target_permissions) == len(
142-
source_permissions
143-
), f"Target permissions were not applied correctly for object {_object}"
144-
145-
assert [t.all_permissions for t in target_permissions] == [
146-
s.all_permissions for s in source_permissions
147-
], f"Target permissions were not applied correctly for object {_object}"
148127

149128

150129
def _verify_roles_and_entitlements(
@@ -168,14 +147,25 @@ def test_e2e(
168147
inventory_table: InventoryTable,
169148
ws: WorkspaceClient,
170149
verifiable_objects: list[tuple[list, str, RequestObjectType | None]],
150+
make_instance_pool,
151+
make_instance_pool_permissions,
171152
):
172153
logger.debug(f"Test environment: {env.test_uid}")
154+
ws_group = env.groups[0][0]
155+
156+
pool = make_instance_pool()
157+
make_instance_pool_permissions(
158+
object_id=pool.instance_pool_id,
159+
permission_level=random.choice([PermissionLevel.CAN_ATTACH_TO, PermissionLevel.CAN_MANAGE]),
160+
group_name=ws_group.display_name,
161+
)
162+
verifiable_objects.append(([pool], "instance_pool_id", RequestObjectType.INSTANCE_POOLS))
173163

174164
config = MigrationConfig(
175165
connect=ConnectConfig.from_databricks_config(ws.config),
176-
with_table_acls=False,
177166
inventory=InventoryConfig(table=inventory_table),
178167
groups=GroupsConfig(selected=[g[0].display_name for g in env.groups]),
168+
tacl=TaclConfig(auto=True),
179169
log_level="DEBUG",
180170
)
181171
toolkit = GroupMigrationToolkit(config)

0 commit comments

Comments
 (0)