1+ from databricks .labs .blueprint .commands import CommandExecutor
2+
13from databricks .labs .ucx .framework .crawlers import SchemaDeployer
24from databricks .labs .ucx .hive_metastore .grants import Grant
35
@@ -9,3 +11,166 @@ def test_deploys_database(sql_backend, inventory_schema):
911 deployer .deploy_schema ()
1012 deployer .deploy_table ("grants" , Grant )
1113 deployer .deploy_view ("grant_detail" , "queries/views/grant_detail.sql" )
14+
15+
16+ def test_runtime_backend_incorrect_schema_and_table_handled (ws , wsfs_wheel , make_random ):
17+ commands = CommandExecutor (ws .clusters , ws .command_execution , lambda : ws .config .cluster_id )
18+
19+ commands .install_notebook_library (f"/Workspace{ wsfs_wheel } " )
20+ query_response_incorrect_schema_execute = commands .run (
21+ f"""
22+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
23+ from databricks.sdk.errors import NotFound
24+ backend = RuntimeBackend()
25+ try:
26+ backend.execute("USE { make_random ()} ")
27+ return "FAILED"
28+ except NotFound as e:
29+ return "PASSED"
30+ """
31+ )
32+ assert query_response_incorrect_schema_execute == "PASSED"
33+
34+ query_response_incorrect_table_execute = commands .run (
35+ f"""
36+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
37+ from databricks.sdk.errors import NotFound
38+ backend = RuntimeBackend()
39+ try:
40+ backend.execute("SELECT * FROM default.{ make_random ()} ")
41+ return "FAILED"
42+ except NotFound as e:
43+ return "PASSED"
44+ """
45+ )
46+ assert query_response_incorrect_table_execute == "PASSED"
47+
48+ query_response_incorrect_schema_fetch = commands .run (
49+ f"""
50+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
51+ from databricks.sdk.errors import NotFound
52+ backend = RuntimeBackend()
53+ try:
54+ query_response = backend.fetch("DESCRIBE { make_random ()} ")
55+ return "FAILED"
56+ except NotFound as e:
57+ return "PASSED"
58+ """
59+ )
60+ assert query_response_incorrect_schema_fetch == "PASSED"
61+
62+ query_response_incorrect_table_fetch = commands .run (
63+ f"""
64+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
65+ from databricks.sdk.errors import NotFound
66+ backend = RuntimeBackend()
67+ try:
68+ query_response = backend.fetch("SELECT * FROM default.{ make_random ()} ")
69+ return "FAILED"
70+ except NotFound as e:
71+ return "PASSED"
72+ """
73+ )
74+ assert query_response_incorrect_table_fetch == "PASSED"
75+
76+
77+ def test_runtime_backend_incorrect_syntax_handled (ws , wsfs_wheel ):
78+ commands = CommandExecutor (ws .clusters , ws .command_execution , lambda : ws .config .cluster_id )
79+
80+ commands .install_notebook_library (f"/Workspace{ wsfs_wheel } " )
81+ query_response_incorrect_syntax_execute = commands .run (
82+ """
83+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
84+ from databricks.sdk.errors import BadRequest
85+ backend = RuntimeBackend()
86+ try:
87+ backend.execute("SHWO DTABASES")
88+ return "FAILED"
89+ except BadRequest:
90+ return "PASSED"
91+ """
92+ )
93+ assert query_response_incorrect_syntax_execute == "PASSED"
94+
95+ query_response_incorrect_syntax_fetch = commands .run (
96+ """
97+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
98+ from databricks.sdk.errors import BadRequest
99+ backend = RuntimeBackend()
100+ try:
101+ query_response = backend.fetch("SHWO DTABASES")
102+ return "FAILED"
103+ except BadRequest:
104+ return "PASSED"
105+ """
106+ )
107+ assert query_response_incorrect_syntax_fetch == "PASSED"
108+
109+
110+ def test_runtime_backend_permission_denied_handled (ws , wsfs_wheel ):
111+ commands = CommandExecutor (ws .clusters , ws .command_execution , lambda : ws .config .cluster_id )
112+
113+ commands .install_notebook_library (f"/Workspace{ wsfs_wheel } " )
114+ query_response_permission_denied_execute = commands .run (
115+ """
116+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
117+ from databricks.sdk.errors import PermissionDenied
118+ backend = RuntimeBackend()
119+ try:
120+ current_user = backend.fetch("SELECT current_user()")
121+ backend.execute(f"GRANT CREATE EXTERNAL LOCATION ON METASTORE TO {current_user}")
122+ return "FAILED"
123+ except PermissionDenied:
124+ return "PASSED"
125+ """
126+ )
127+ assert query_response_permission_denied_execute == "PASSED"
128+
129+ query_response_permission_denied_fetch = commands .run (
130+ """
131+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
132+ from databricks.sdk.errors import PermissionDenied
133+ backend = RuntimeBackend()
134+ try:
135+ current_user = backend.fetch(f"SELECT current_user()")
136+ grants = backend.fetch(f"GRANT CREATE EXTERNAL LOCATION ON METASTORE TO {current_user}")
137+ return "FAILED"
138+ except PermissionDenied:
139+ return "PASSED"
140+ """
141+ )
142+ assert query_response_permission_denied_fetch == "PASSED"
143+
144+
145+ def test_runtime_backend_unknown_error_handled (ws , wsfs_wheel ):
146+ commands = CommandExecutor (ws .clusters , ws .command_execution , lambda : ws .config .cluster_id )
147+
148+ commands .install_notebook_library (f"/Workspace{ wsfs_wheel } " )
149+
150+ query_response_unknown_execute = commands .run (
151+ """
152+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
153+ from databricks.sdk.errors import Unknown
154+ backend = RuntimeBackend()
155+ try:
156+ backend.execute("SHOW GRANTS ON METASTORE")
157+ return "FAILED"
158+ except Unknown:
159+ return "PASSED"
160+ """
161+ )
162+ assert query_response_unknown_execute == "PASSED"
163+
164+ query_response_unknown_fetch = commands .run (
165+ """
166+ from databricks.labs.ucx.framework.crawlers import RuntimeBackend
167+ from databricks.sdk.errors import Unknown
168+ backend = RuntimeBackend()
169+ try:
170+ grants = backend.fetch("SHOW GRANTS ON METASTORE")
171+ return "FAILED"
172+ except Unknown:
173+ return "PASSED"
174+ """
175+ )
176+ assert query_response_unknown_fetch == "PASSED"
0 commit comments