Skip to content

Commit 0bc1448

Browse files
authored
Handle exceptions with no error_code attribute while crawling permissions (#2079)
Avoid `AttributeError` error when exceptions without an `error_code` attribute are caught during the assessment job crawling permissions. ### Linked issues Resolves #2078 ### Tests - [ ] manually tested - [ x] added unit tests - [ ] added integration tests - [ ] verified on staging environment (screenshot attached)
1 parent cd6ad77 commit 0bc1448

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ def inventorize_permissions(self):
3232
items, errors = Threads.gather("crawl permissions", crawler_tasks)
3333
acute_errors = []
3434
for error in errors:
35-
if error.error_code not in self.ERRORS_TO_IGNORE:
36-
logger.error(f"Error while crawling permissions: {error}")
37-
acute_errors.append(error)
35+
if hasattr(error, 'error_code') and error.error_code in self.ERRORS_TO_IGNORE:
36+
logger.info(f"Error while crawling permissions: {error}. Skipping")
3837
continue
39-
logger.info(f"Error while crawling permissions: {error}. Skipping")
38+
logger.error(f"Error while crawling permissions: {error}")
39+
acute_errors.append(error)
4040
if len(acute_errors) > 0:
4141
raise ManyError(acute_errors)
4242
logger.info(f"Total crawled permissions: {len(items)}")

tests/unit/workspace_access/test_manager.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from databricks.sdk.errors import DatabricksError
99
from databricks.sdk.service import iam
1010

11+
from databricks.labs.blueprint.parallel import ManyError
1112
from databricks.labs.ucx.workspace_access.base import AclSupport
1213
from databricks.labs.ucx.workspace_access.groups import MigratedGroup, MigrationState
1314
from databricks.labs.ucx.workspace_access.manager import PermissionManager, Permissions
@@ -107,6 +108,25 @@ def raise_error():
107108
)
108109

109110

111+
def test_manager_inventorize_fail_with_error(mock_backend, mocker):
112+
def raise_error():
113+
raise DatabricksError(
114+
"Fail the job",
115+
error_code="NO_SKIP",
116+
)
117+
118+
def raise_error_no_code():
119+
raise TimeoutError
120+
121+
some_crawler = mocker.Mock()
122+
some_crawler.get_crawler_tasks = lambda: [lambda: Permissions("a", "b", "c"), raise_error, raise_error_no_code]
123+
permission_manager = PermissionManager(mock_backend, "test_database", [some_crawler])
124+
125+
with pytest.raises(ManyError) as expected_err:
126+
permission_manager.inventorize_permissions()
127+
assert len(expected_err.value.errs) == 2
128+
129+
110130
def test_manager_apply(mocker):
111131
sql_backend = MockBackend(
112132
rows={

0 commit comments

Comments
 (0)