Skip to content

Commit 09f45f0

Browse files
authored
Fixed error handling for SCIM and CommandExecution APIs (#94)
## Changes - `DatabricksError` and `_make_nicer_error` were not integration tested before - this PR adds proper kwarg resolution ## Tests - [x] `make test` run locally - [x] `make fmt` applied - [x] relevant integration tests applied
1 parent c6eab45 commit 09f45f0

File tree

4 files changed

+45
-5
lines changed

4 files changed

+45
-5
lines changed

databricks/sdk/core.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -689,10 +689,10 @@ def __init__(self,
689689
scimType: str = None,
690690
error: str = None,
691691
**kwargs):
692-
if not message and error:
692+
if error:
693693
# API 1.2 has different response format, let's adapt
694694
message = error
695-
if not message and detail:
695+
if detail:
696696
# Handle SCIM error message details
697697
# @see https://tools.ietf.org/html/rfc7644#section-3.7.3
698698
if detail == "null":
@@ -758,7 +758,7 @@ def do(self, method: str, path: str, query: dict = None, body: dict = None) -> d
758758
message = self._make_sense_from_html(response.text)
759759
if not message:
760760
message = response.reason
761-
raise self._make_nicer_error(message) from None
761+
raise self._make_nicer_error(message=message) from None
762762

763763
@staticmethod
764764
def _make_sense_from_html(txt: str) -> str:
@@ -771,11 +771,13 @@ def _make_sense_from_html(txt: str) -> str:
771771
return match.group(1).strip()
772772
return txt
773773

774-
def _make_nicer_error(self, message: str, status_code: int = 200, **kwargs) -> DatabricksError:
774+
def _make_nicer_error(self, status_code: int = 200, **kwargs) -> DatabricksError:
775+
message = kwargs.get('message', 'request failed')
775776
is_http_unauthorized_or_forbidden = status_code in (401, 403)
776777
if is_http_unauthorized_or_forbidden:
777778
message = self._cfg.wrap_debug_info(message)
778-
return DatabricksError(message, **kwargs)
779+
kwargs['message'] = message
780+
return DatabricksError(**kwargs)
779781

780782
def _record_request_log(self, response: requests.Response):
781783
if not logger.isEnabledFor(logging.DEBUG):

tests/integration/test_clusters.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import logging
22
from datetime import timedelta
33

4+
import pytest
5+
6+
from databricks.sdk.core import DatabricksError
7+
48

59
def test_smallest_node_type(w):
610
node_type_id = w.clusters.select_node_type(local_disk=True)
@@ -33,3 +37,11 @@ def test_create_cluster(w, env_or_skip, random):
3337
num_workers=1,
3438
timeout=timedelta(minutes=10))
3539
logging.info(f'Created: {info}')
40+
41+
42+
def test_error_unmarshall(w, random):
43+
with pytest.raises(DatabricksError) as exc_info:
44+
w.clusters.get('__non_existing__')
45+
err = exc_info.value
46+
assert 'Cluster __non_existing__ does not exist' in str(err)
47+
assert 'INVALID_PARAMETER_VALUE' == err.error_code

tests/integration/test_commands.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import pytest
2+
3+
from databricks.sdk.core import DatabricksError
4+
5+
6+
def test_error_unmarshall(w, random):
7+
with pytest.raises(DatabricksError) as exc_info:
8+
w.command_execution.execute(cluster_id='__non_existing__')
9+
err = exc_info.value
10+
assert 'requirement failed: missing contextId' in str(err)
11+
assert err.error_code is None

tests/integration/test_groups.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import pytest
2+
3+
from databricks.sdk.core import DatabricksError
4+
5+
6+
def test_filtering_groups(w, random):
7+
all = w.groups.list(filter=f'displayName eq any-{random(12)}')
8+
found = len(list(all))
9+
assert found == 0
10+
11+
12+
def test_scim_error_unmarshall(w, random):
13+
with pytest.raises(DatabricksError) as exc_info:
14+
w.groups.list(filter=random(12))
15+
assert 'Given filter operator is not supported' in str(exc_info.value)

0 commit comments

Comments
 (0)