From 92bc4a44756b1193c3b5045a621fe914a46c80d7 Mon Sep 17 00:00:00 2001 From: Felipe Taiarol Date: Tue, 30 Sep 2025 17:44:58 +0200 Subject: [PATCH 1/2] Improving the error message of dbutils.credentials.getServiceCredentialsProvider This method is not supported by the SDK DBUtils. --- NEXT_CHANGELOG.md | 1 + databricks/sdk/dbutils.py | 17 +++++++++++++++++ tests/test_dbutils.py | 10 ++++++++++ 3 files changed, 28 insertions(+) diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index b4585a98d..ee179c5dd 100644 --- a/NEXT_CHANGELOG.md +++ b/NEXT_CHANGELOG.md @@ -5,6 +5,7 @@ ### New Features and Improvements ### Bug Fixes +- Improving the error message that is shown when the unsupported `dbutils.credentials.getServiceCredentialsProvider` method is used. This method can only be used inside of a notebook. ### Documentation diff --git a/databricks/sdk/dbutils.py b/databricks/sdk/dbutils.py index af5ebb821..072931dc3 100644 --- a/databricks/sdk/dbutils.py +++ b/databricks/sdk/dbutils.py @@ -277,10 +277,17 @@ def get_local_notebook_path(): return value +def not_supported_method_err_msg(methodName): + return f"Method '{methodName}' is not supported in the SDK version of DBUtils" + + class _OverrideProxyUtil: @classmethod def new(cls, path: str): + if path in cls.not_supported_override_paths: + raise ValueError(cls.not_supported_override_paths[path]) + if len(cls.__get_matching_overrides(path)) > 0: return _OverrideProxyUtil(path) return None @@ -297,6 +304,16 @@ def __init__(self, name: str): "notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get()": get_local_notebook_path, } + # These paths work the same as 'proxy_override_paths' but instead of using a local implementation we raise an exception. + not_supported_override_paths = { + # The object returned by 'credentials.getServiceCredentialProvider()' can't be serialized to JSON. + # Without this override, the command would fail with an error 'TypeError: Object of type Session is not JSON serializable'. + # We override it to show a better error message + "credentials.getServiceCredentialsProvider": not_supported_method_err_msg( + "credentials.getServiceCredentialsProvider" + ), + } + @classmethod def __get_matching_overrides(cls, path: str): return [x for x in cls.proxy_override_paths.keys() if x.startswith(path)] diff --git a/tests/test_dbutils.py b/tests/test_dbutils.py index 9cd3d32fd..603386190 100644 --- a/tests/test_dbutils.py +++ b/tests/test_dbutils.py @@ -290,3 +290,13 @@ def test_dbutils_proxy_overrides(dbutils, mocker, restorable_env): return_value="test_cluster_id", ) assert dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get() == "test_source_file" + + +@raises("Method 'credentials.getServiceCredentialsProvider' is not supported in the SDK version of DBUtils") +def test_dbutils_credentials_get_service_credential_provider(config, mocker): + from databricks.sdk.dbutils import RemoteDbUtils + + config.cluster_id = "test_cluster_id" + dbutils = RemoteDbUtils(config) + + dbutils.credentials.getServiceCredentialsProvider("creds") From be16d301fba5fd5841dbd9d265963fe206ccfee8 Mon Sep 17 00:00:00 2001 From: Felipe Taiarol Date: Mon, 20 Oct 2025 12:02:08 +0000 Subject: [PATCH 2/2] Formatter --- tests/test_dbutils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_dbutils.py b/tests/test_dbutils.py index 6e946653f..1b9a97f14 100644 --- a/tests/test_dbutils.py +++ b/tests/test_dbutils.py @@ -291,6 +291,7 @@ def test_dbutils_proxy_overrides(dbutils, mocker, restorable_env): ) assert dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get() == "test_source_file" + @raises("Method 'credentials.getServiceCredentialsProvider' is not supported in the SDK version of DBUtils") def test_dbutils_credentials_get_service_credential_provider(config, mocker): from databricks.sdk.dbutils import RemoteDbUtils @@ -300,6 +301,7 @@ def test_dbutils_credentials_get_service_credential_provider(config, mocker): dbutils.credentials.getServiceCredentialsProvider("creds") + def test_dbutils_adds_user_agent(config): from databricks.sdk.dbutils import RemoteDbUtils