Skip to content

Commit 2c703d2

Browse files
authored
Add property id to get service principal id (#170)
## Changes Adds a property `id` which is needed to use the created service principal in tests ### Linked issues Resolves the no-cheat in databrickslabs/ucx#4360
1 parent a193944 commit 2c703d2

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

src/databricks/labs/pytester/fixtures/iam.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ def application_id(self) -> str:
240240
assert self._service_principal.application_id is not None
241241
return self._service_principal.application_id
242242

243+
@property
244+
def id(self) -> str:
245+
assert self._service_principal.id is not None
246+
return self._service_principal.id
247+
243248
def __repr__(self):
244249
return f'RunAs({self.display_name})'
245250

@@ -339,8 +344,7 @@ def create(*, account_groups: list[str] | None = None):
339344
workspace_id = ws.get_workspace_id()
340345
service_principal = acc.service_principals.create(display_name=f'spn-{make_random()}')
341346
assert service_principal.id is not None
342-
service_principal_id = int(service_principal.id)
343-
created_secret = acc.service_principal_secrets.create(service_principal_id)
347+
created_secret = acc.service_principal_secrets.create(service_principal.id)
344348
if account_groups:
345349
group_mapping = {}
346350
for group in acc.groups.list(attributes='id,displayName'):
@@ -354,15 +358,15 @@ def create(*, account_groups: list[str] | None = None):
354358
acc.groups.patch(
355359
group_id,
356360
operations=[
357-
Patch(PatchOp.ADD, 'members', [ComplexValue(value=str(service_principal_id)).as_dict()]),
361+
Patch(PatchOp.ADD, 'members', [ComplexValue(value=str(service_principal.id)).as_dict()]),
358362
],
359363
schemas=[PatchSchema.URN_IETF_PARAMS_SCIM_API_MESSAGES_2_0_PATCH_OP],
360364
)
361365
permissions = [WorkspacePermission.USER]
362-
acc.workspace_assignment.update(workspace_id, service_principal_id, permissions=permissions)
366+
acc.workspace_assignment.update(workspace_id, int(service_principal.id), permissions=permissions)
363367
ws_as_spn = _make_workspace_client(ws, created_secret, service_principal)
364368

365-
log_account_link('account service principal', f'users/serviceprincipals/{service_principal_id}')
369+
log_account_link('account service principal', f'users/serviceprincipals/{service_principal.id}')
366370

367371
return RunAs(service_principal, ws_as_spn, env_or_skip)
368372

tests/integration/fixtures/test_iam.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ def test_new_user(make_user, ws):
77
assert home_dir.object_type == ObjectType.DIRECTORY
88

99

10-
def test_new_group(make_group, make_user, ws):
10+
def test_new_group(make_group, make_user, make_run_as, ws):
1111
user = make_user()
12-
group = make_group(members=[user.id])
12+
service_principal = make_run_as()
13+
group = make_group(members=[user.id, service_principal.id])
1314
loaded = ws.groups.get(group.id)
1415
assert group.display_name == loaded.display_name
1516
assert group.members == loaded.members

tests/unit/fixtures/test_iam.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import pytest
77

8-
from databricks.labs.pytester.fixtures.iam import make_acc_group, make_group, make_user, Group
8+
from databricks.labs.pytester.fixtures.iam import make_acc_group, make_group, make_user, make_run_as, Group
99
from databricks.labs.pytester.fixtures.unwrap import call_stateful, CallContext
1010

1111

@@ -17,6 +17,14 @@ def test_make_user_no_args() -> None:
1717
ctx['ws'].users.delete.assert_called_once()
1818

1919

20+
def test_make_run_as_no_args() -> None:
21+
ctx, run_as = call_stateful(make_run_as)
22+
assert ctx is not None
23+
assert run_as is not None
24+
ctx['acc'].service_principals.create.assert_called_once()
25+
ctx['acc'].service_principals.delete.assert_called_once()
26+
27+
2028
def _setup_groups_api(call_context: CallContext, *, client_fixture_name: str) -> CallContext:
2129
"""Minimum mocking of the specific client so that when a group is created it is also visible via the list() method.
2230
This is required because the make_group and make_acc_group fixtures double-check after creating a group to ensure

0 commit comments

Comments
 (0)