Skip to content

Commit f6819f2

Browse files
authored
Verify metastore exists in current workspace (#735)
1 parent bba54e5 commit f6819f2

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

labs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,4 @@ commands:
6565
description: Table to revert (if left blank all tables in the schema will be reverted). Requires schema parameter to be specified.)
6666
- name: delete_managed
6767
description: Revert and delete managed tables
68+

src/databricks/labs/ucx/runtime.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from databricks.labs.ucx.workspace_access.generic import WorkspaceListing
2323
from databricks.labs.ucx.workspace_access.groups import GroupManager
2424
from databricks.labs.ucx.workspace_access.manager import PermissionManager
25+
from databricks.labs.ucx.workspace_access.verification import VerifyHasMetastore
2526

2627
logger = logging.getLogger(__name__)
2728

@@ -250,6 +251,10 @@ def rename_workspace_local_groups(cfg: WorkspaceConfig):
250251
"""Renames workspace local groups by adding `ucx-renamed-` prefix."""
251252
sql_backend = RuntimeBackend()
252253
ws = WorkspaceClient(config=cfg.to_databricks_config())
254+
verify_has_metastore = VerifyHasMetastore(ws)
255+
if verify_has_metastore.verify_metastore():
256+
logger.info("Metastore exists in the workspace")
257+
253258
group_manager = GroupManager(
254259
sql_backend,
255260
ws,

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import logging
12
from typing import Literal
23

34
from databricks.sdk import WorkspaceClient
5+
from databricks.sdk.errors import PermissionDenied
46

57
from databricks.labs.ucx.workspace_access.groups import MigrationState
68
from databricks.labs.ucx.workspace_access.secrets import SecretScopesSupport
@@ -79,3 +81,36 @@ def verify_roles_and_entitlements(self, migration_state: MigrationState, target:
7981

8082
assert base_group_info.roles == target_group_info.roles
8183
assert base_group_info.entitlements == target_group_info.entitlements
84+
85+
86+
class VerifyHasMetastore:
87+
def __init__(self, ws: WorkspaceClient):
88+
self.metastore_id: str | None = None
89+
self.default_catalog_name: str | None = None
90+
self.workspace_id: int | None = None
91+
self._ws = ws
92+
93+
def verify_metastore(self):
94+
"""
95+
Verifies if a metastore exists for a metastore
96+
:param :
97+
:return:
98+
"""
99+
100+
try:
101+
current_metastore = self._ws.metastores.current()
102+
if current_metastore:
103+
self.default_catalog_name = current_metastore.default_catalog_name
104+
self.metastore_id = current_metastore.metastore_id
105+
self.workspace_id = current_metastore.workspace_id
106+
return True
107+
else:
108+
raise MetastoreNotFoundError
109+
except PermissionDenied:
110+
logger.error("Permission Denied while trying to access metastore")
111+
112+
113+
class MetastoreNotFoundError(Exception):
114+
def __init__(self, message="Metastore not found in the workspace"):
115+
self.message = message
116+
super().__init__(self.message)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import pytest
2+
from databricks.sdk.errors import PermissionDenied
3+
from databricks.sdk.service.catalog import MetastoreAssignment
4+
5+
from databricks.labs.ucx.workspace_access.verification import (
6+
MetastoreNotFoundError,
7+
VerifyHasMetastore,
8+
)
9+
10+
11+
def test_validate_metastore_exists(mocker):
12+
ws = mocker.patch("databricks.sdk.WorkspaceClient.__init__")
13+
ws.metastores = mocker.patch("databricks.sdk.WorkspaceClient.metastores")
14+
ws.metastores.current = lambda: MetastoreAssignment(
15+
metastore_id="21fwef-b2345-sdas-2343-sddsvv332", workspace_id=1234567890, default_catalog_name="hive_metastore"
16+
)
17+
verify_metastore_obj = VerifyHasMetastore(ws)
18+
19+
assert verify_metastore_obj.verify_metastore() is True
20+
21+
assert verify_metastore_obj.metastore_id == "21fwef-b2345-sdas-2343-sddsvv332"
22+
assert verify_metastore_obj.default_catalog_name == "hive_metastore"
23+
assert verify_metastore_obj.workspace_id == 1234567890
24+
25+
26+
def test_validate_no_metastore_exists(mocker):
27+
ws = mocker.patch("databricks.sdk.WorkspaceClient.__init__")
28+
ws.metastores = mocker.patch("databricks.sdk.WorkspaceClient.metastores")
29+
ws.metastores.current = mocker.patch(
30+
"databricks.sdk.service.catalog.MetastoreAssignment.__init__", return_value=None
31+
)
32+
ws.metastores.current.return_value = None
33+
ws.return_value = None
34+
35+
verify_metastore_obj = VerifyHasMetastore(ws)
36+
37+
with pytest.raises(MetastoreNotFoundError, match="Metastore not found in the workspace"):
38+
verify_metastore_obj.verify_metastore()
39+
40+
41+
def test_permission_denied_error(mocker):
42+
ws = mocker.patch("databricks.sdk.WorkspaceClient.__init__")
43+
ws.metastores = mocker.patch("databricks.sdk.WorkspaceClient.metastores")
44+
ws.metastores.current.side_effect = PermissionDenied()
45+
ws.metastores.current.return_value = None
46+
ws.return_value = None
47+
48+
verify_metastore_obj = VerifyHasMetastore(ws)
49+
50+
assert verify_metastore_obj.verify_metastore() is None

0 commit comments

Comments
 (0)