|
1 | 1 | import logging |
| 2 | +from datetime import timedelta |
2 | 3 |
|
3 | 4 | from databricks.sdk import WorkspaceClient |
| 5 | +from databricks.sdk.retries import retried |
4 | 6 | from databricks.sdk.service.iam import PermissionLevel |
5 | 7 |
|
6 | 8 | from databricks.labs.ucx.config import GroupsConfig |
7 | 9 | from databricks.labs.ucx.hive_metastore import GrantsCrawler, TablesCrawler |
| 10 | +from databricks.labs.ucx.hive_metastore.grants import Grant |
8 | 11 | from databricks.labs.ucx.workspace_access.generic import ( |
9 | | - GenericPermissionsSupport, Listing, |
| 12 | + GenericPermissionsSupport, |
| 13 | + Listing, |
10 | 14 | ) |
11 | 15 | from databricks.labs.ucx.workspace_access.groups import GroupManager |
12 | 16 | from databricks.labs.ucx.workspace_access.manager import PermissionManager |
| 17 | +from databricks.labs.ucx.workspace_access.tacl import TableAclSupport |
13 | 18 |
|
14 | 19 | logger = logging.getLogger(__name__) |
15 | 20 |
|
@@ -89,47 +94,82 @@ def test_replace_workspace_groups_with_account_groups( |
89 | 94 | generic_permissions = GenericPermissionsSupport( |
90 | 95 | ws, [Listing(ws.cluster_policies.list, "policy_id", "cluster-policies")] |
91 | 96 | ) |
92 | | - permission_manager = PermissionManager(sql_backend, inventory_schema, [generic_permissions]) |
93 | 97 | tables = TablesCrawler(sql_backend, inventory_schema) |
94 | 98 | grants = GrantsCrawler(tables) |
| 99 | + tacl = TableAclSupport(grants, sql_backend) |
| 100 | + permission_manager = PermissionManager(sql_backend, inventory_schema, [generic_permissions, tacl]) |
95 | 101 |
|
96 | 102 | permission_manager.inventorize_permissions() |
97 | 103 |
|
| 104 | + dummy_grants = list(permission_manager.load_all_for("TABLE", dummy_table.full_name, Grant)) |
| 105 | + assert 2 == len(dummy_grants) |
| 106 | + |
98 | 107 | table_permissions = grants.for_table_info(dummy_table) |
99 | | - print(table_permissions) |
| 108 | + assert ws_group.display_name in table_permissions |
| 109 | + assert "SELECT" in table_permissions[ws_group.display_name] |
100 | 110 |
|
101 | 111 | permission_manager.apply_group_permissions(group_manager.migration_state, destination="backup") |
102 | 112 |
|
| 113 | + @retried(on=[AssertionError], timeout=timedelta(seconds=30)) |
| 114 | + def check_table_permissions_for_backup_group(): |
| 115 | + table_permissions = grants.for_table_info(dummy_table) |
| 116 | + assert group_info.workspace.display_name in table_permissions |
| 117 | + assert group_info.backup.display_name in table_permissions |
| 118 | + assert "SELECT" in table_permissions[group_info.workspace.display_name] |
| 119 | + assert "SELECT" in table_permissions[group_info.backup.display_name] |
| 120 | + |
| 121 | + check_table_permissions_for_backup_group() |
| 122 | + |
103 | 123 | policy_permissions = generic_permissions.load_as_dict("cluster-policies", cluster_policy.policy_id) |
104 | 124 | assert PermissionLevel.CAN_USE == policy_permissions[group_info.workspace.display_name] |
105 | 125 | assert PermissionLevel.CAN_USE == policy_permissions[group_info.backup.display_name] |
106 | 126 |
|
107 | 127 | group_manager.replace_workspace_groups_with_account_groups() |
108 | 128 |
|
109 | | - table_permissions = grants.for_table_info(dummy_table) |
110 | | - print(table_permissions) |
| 129 | + @retried(on=[AssertionError], timeout=timedelta(seconds=30)) |
| 130 | + def check_table_permissions_for_account_group(): |
| 131 | + table_permissions = grants.for_table_info(dummy_table) |
| 132 | + assert group_info.account.display_name in table_permissions |
| 133 | + assert group_info.backup.display_name in table_permissions |
| 134 | + assert "SELECT" in table_permissions[group_info.backup.display_name] |
| 135 | + |
| 136 | + check_table_permissions_for_account_group() |
111 | 137 |
|
112 | 138 | policy_permissions = generic_permissions.load_as_dict("cluster-policies", cluster_policy.policy_id) |
113 | 139 | assert group_info.workspace.display_name not in policy_permissions |
114 | 140 | assert PermissionLevel.CAN_USE == policy_permissions[group_info.backup.display_name] |
115 | 141 |
|
116 | 142 | permission_manager.apply_group_permissions(group_manager.migration_state, destination="account") |
117 | 143 |
|
118 | | - table_permissions = grants.for_table_info(dummy_table) |
119 | | - print(table_permissions) |
| 144 | + @retried(on=[AssertionError], timeout=timedelta(seconds=30)) |
| 145 | + def check_table_permissions_for_account_group(): |
| 146 | + table_permissions = grants.for_table_info(dummy_table) |
| 147 | + assert group_info.account.display_name in table_permissions |
| 148 | + assert group_info.backup.display_name in table_permissions |
| 149 | + assert "SELECT" in table_permissions[group_info.backup.display_name] |
| 150 | + assert "SELECT" in table_permissions[group_info.account.display_name] |
| 151 | + |
| 152 | + check_table_permissions_for_account_group() |
120 | 153 |
|
121 | 154 | policy_permissions = generic_permissions.load_as_dict("cluster-policies", cluster_policy.policy_id) |
122 | 155 | assert PermissionLevel.CAN_USE == policy_permissions[group_info.account.display_name] |
123 | 156 | assert PermissionLevel.CAN_USE == policy_permissions[group_info.backup.display_name] |
124 | 157 |
|
125 | | - # TODO: check hive grants as well |
126 | | - |
127 | 158 | for _info in group_manager.migration_state.groups: |
128 | 159 | ws.groups.delete(_info.backup.id) |
129 | 160 |
|
130 | 161 | policy_permissions = generic_permissions.load_as_dict("cluster-policies", cluster_policy.policy_id) |
131 | 162 | assert group_info.backup.display_name not in policy_permissions |
132 | 163 |
|
| 164 | + @retried(on=[AssertionError], timeout=timedelta(seconds=30)) |
| 165 | + def check_table_permissions_after_backup_delete(): |
| 166 | + table_permissions = grants.for_table_info(dummy_table) |
| 167 | + assert group_info.backup.display_name not in table_permissions |
| 168 | + assert group_info.account.display_name in table_permissions |
| 169 | + assert "SELECT" in table_permissions[group_info.account.display_name] |
| 170 | + |
| 171 | + check_table_permissions_after_backup_delete() |
| 172 | + |
133 | 173 |
|
134 | 174 | def test_group_listing(ws: WorkspaceClient, make_ucx_group): |
135 | 175 | ws_group, acc_group = make_ucx_group() |
|
0 commit comments