|
| 1 | +import logging |
1 | 2 | import io
|
2 | 3 | import json
|
3 | 4 | from unittest.mock import create_autospec
|
|
6 | 7 | from databricks.labs.blueprint.installation import Installation, MockInstallation
|
7 | 8 | from databricks.labs.blueprint.tui import MockPrompts
|
8 | 9 | from databricks.sdk import AccountClient, WorkspaceClient
|
9 |
| -from databricks.sdk.errors import NotFound, ResourceConflict |
| 10 | +from databricks.sdk.errors import NotFound, PermissionDenied, ResourceConflict |
10 | 11 | from databricks.sdk.service import iam
|
11 | 12 | from databricks.sdk.service.iam import ComplexValue, Group, ResourceMeta, User
|
12 | 13 | from databricks.sdk.service.provisioning import Workspace
|
@@ -494,3 +495,57 @@ def get_workspace_client(workspace) -> WorkspaceClient:
|
494 | 495 | acc.config.auth_type = "databricks-cli"
|
495 | 496 | account_workspaces = AccountWorkspaces(acc)
|
496 | 497 | assert len(account_workspaces.get_accessible_workspaces()) == 1
|
| 498 | + |
| 499 | + |
| 500 | +def test_account_workspaces_can_administer_when_user_in_admins_group() -> None: |
| 501 | + acc = create_autospec(AccountClient) |
| 502 | + ws = create_autospec(WorkspaceClient) |
| 503 | + acc.get_workspace_client.return_value = ws |
| 504 | + ws.current_user.me.return_value = User(user_name="test", groups=[ComplexValue(display="admins")]) |
| 505 | + account_workspaces = AccountWorkspaces(acc) |
| 506 | + workspace = Workspace(deployment_name="test") |
| 507 | + |
| 508 | + assert account_workspaces.can_administer(workspace) |
| 509 | + |
| 510 | + |
| 511 | +@pytest.mark.parametrize("groups", [[ComplexValue(display="not-admins")], None]) |
| 512 | +def test_account_workspaces_cannot_administer_when_user_not_in_admins_group(caplog, groups) -> None: |
| 513 | + acc = create_autospec(AccountClient) |
| 514 | + ws = create_autospec(WorkspaceClient) |
| 515 | + acc.get_workspace_client.return_value = ws |
| 516 | + ws.current_user.me.return_value = User(user_name="test", groups=groups) |
| 517 | + account_workspaces = AccountWorkspaces(acc) |
| 518 | + workspace = Workspace(deployment_name="test") |
| 519 | + |
| 520 | + with caplog.at_level(logging.WARNING, logger="databricks.labs.ucx.account.workspaces"): |
| 521 | + can_administer = account_workspaces.can_administer(workspace) |
| 522 | + assert not can_administer |
| 523 | + assert "User 'test' is not a workspace admin: test" in caplog.messages |
| 524 | + |
| 525 | + |
| 526 | +def test_account_workspaces_can_administer_handles_not_found_error_for_get_workspace_client(caplog) -> None: |
| 527 | + acc = create_autospec(AccountClient) |
| 528 | + acc.get_workspace_client.side_effect = NotFound |
| 529 | + account_workspaces = AccountWorkspaces(acc) |
| 530 | + workspace = Workspace(deployment_name="test") |
| 531 | + |
| 532 | + with caplog.at_level(logging.WARNING, logger="databricks.labs.ucx.account.workspaces"): |
| 533 | + can_administer = account_workspaces.can_administer(workspace) |
| 534 | + assert not can_administer |
| 535 | + assert "User cannot access workspace: test" in caplog.messages |
| 536 | + |
| 537 | + |
| 538 | +def test_account_workspaces_can_administer_handles_permission_denied_error_for_current_user(caplog) -> None: |
| 539 | + acc = create_autospec(AccountClient) |
| 540 | + ws = create_autospec(WorkspaceClient) |
| 541 | + acc.get_workspace_client.return_value = ws |
| 542 | + ws.current_user.me.side_effect = PermissionDenied( |
| 543 | + "This API is disabled for users without the databricks-sql-access or workspace-access entitlements" |
| 544 | + ) |
| 545 | + account_workspaces = AccountWorkspaces(acc) |
| 546 | + workspace = Workspace(deployment_name="test") |
| 547 | + |
| 548 | + with caplog.at_level(logging.WARNING, logger="databricks.labs.ucx.account.workspaces"): |
| 549 | + can_administer = account_workspaces.can_administer(workspace) |
| 550 | + assert not can_administer |
| 551 | + assert "User cannot access workspace: test" in caplog.messages |
0 commit comments