diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 9c0031211..a427d4e9b 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 6deffc0fc..9c284767f 100644 --- a/databricks/sdk/dbutils.py +++ b/databricks/sdk/dbutils.py @@ -281,10 +281,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 @@ -301,6 +308,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 638e7e9b2..1b9a97f14 100644 --- a/tests/test_dbutils.py +++ b/tests/test_dbutils.py @@ -292,6 +292,16 @@ 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 + + config.cluster_id = "test_cluster_id" + dbutils = RemoteDbUtils(config) + + dbutils.credentials.getServiceCredentialsProvider("creds") + + def test_dbutils_adds_user_agent(config): from databricks.sdk.dbutils import RemoteDbUtils