databricks-sdk 0.32.2__py3-none-any.whl → 0.32.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of databricks-sdk might be problematic. Click here for more details.

@@ -9,14 +9,15 @@ import pathlib
9
9
  import platform
10
10
  import subprocess
11
11
  import sys
12
+ import time
12
13
  from datetime import datetime
13
- from typing import Callable, Dict, List, Optional, Union
14
+ from typing import Callable, Dict, List, Optional, Tuple, Union
14
15
 
15
- import google.auth
16
+ import google.auth # type: ignore
16
17
  import requests
17
- from google.auth import impersonated_credentials
18
- from google.auth.transport.requests import Request
19
- from google.oauth2 import service_account
18
+ from google.auth import impersonated_credentials # type: ignore
19
+ from google.auth.transport.requests import Request # type: ignore
20
+ from google.oauth2 import service_account # type: ignore
20
21
 
21
22
  from .azure import add_sp_management_token, add_workspace_id_header
22
23
  from .oauth import (ClientCredentials, OAuthClient, Refreshable, Token,
@@ -698,6 +699,90 @@ def metadata_service(cfg: 'Config') -> Optional[CredentialsProvider]:
698
699
  return inner
699
700
 
700
701
 
702
+ # This Code is derived from Mlflow DatabricksModelServingConfigProvider
703
+ # https://github.com/mlflow/mlflow/blob/1219e3ef1aac7d337a618a352cd859b336cf5c81/mlflow/legacy_databricks_cli/configure/provider.py#L332
704
+ class ModelServingAuthProvider():
705
+ _MODEL_DEPENDENCY_OAUTH_TOKEN_FILE_PATH = "/var/credentials-secret/model-dependencies-oauth-token"
706
+
707
+ def __init__(self):
708
+ self.expiry_time = -1
709
+ self.current_token = None
710
+ self.refresh_duration = 300 # 300 Seconds
711
+
712
+ def should_fetch_model_serving_environment_oauth(self) -> bool:
713
+ """
714
+ Check whether this is the model serving environment
715
+ Additionally check if the oauth token file path exists
716
+ """
717
+
718
+ is_in_model_serving_env = (os.environ.get("IS_IN_DB_MODEL_SERVING_ENV")
719
+ or os.environ.get("IS_IN_DATABRICKS_MODEL_SERVING_ENV") or "false")
720
+ return (is_in_model_serving_env == "true"
721
+ and os.path.isfile(self._MODEL_DEPENDENCY_OAUTH_TOKEN_FILE_PATH))
722
+
723
+ def get_model_dependency_oauth_token(self, should_retry=True) -> str:
724
+ # Use Cached value if it is valid
725
+ if self.current_token is not None and self.expiry_time > time.time():
726
+ return self.current_token
727
+
728
+ try:
729
+ with open(self._MODEL_DEPENDENCY_OAUTH_TOKEN_FILE_PATH) as f:
730
+ oauth_dict = json.load(f)
731
+ self.current_token = oauth_dict["OAUTH_TOKEN"][0]["oauthTokenValue"]
732
+ self.expiry_time = time.time() + self.refresh_duration
733
+ except Exception as e:
734
+ # sleep and retry in case of any race conditions with OAuth refreshing
735
+ if should_retry:
736
+ logger.warning("Unable to read oauth token on first attmept in Model Serving Environment",
737
+ exc_info=e)
738
+ time.sleep(0.5)
739
+ return self.get_model_dependency_oauth_token(should_retry=False)
740
+ else:
741
+ raise RuntimeError(
742
+ "Unable to read OAuth credentials from the file mounted in Databricks Model Serving"
743
+ ) from e
744
+ return self.current_token
745
+
746
+ def get_databricks_host_token(self) -> Optional[Tuple[str, str]]:
747
+ if not self.should_fetch_model_serving_environment_oauth():
748
+ return None
749
+
750
+ # read from DB_MODEL_SERVING_HOST_ENV_VAR if available otherwise MODEL_SERVING_HOST_ENV_VAR
751
+ host = os.environ.get("DATABRICKS_MODEL_SERVING_HOST_URL") or os.environ.get(
752
+ "DB_MODEL_SERVING_HOST_URL")
753
+ token = self.get_model_dependency_oauth_token()
754
+
755
+ return (host, token)
756
+
757
+
758
+ @credentials_strategy('model-serving', [])
759
+ def model_serving_auth(cfg: 'Config') -> Optional[CredentialsProvider]:
760
+ try:
761
+ model_serving_auth_provider = ModelServingAuthProvider()
762
+ if not model_serving_auth_provider.should_fetch_model_serving_environment_oauth():
763
+ logger.debug("model-serving: Not in Databricks Model Serving, skipping")
764
+ return None
765
+ host, token = model_serving_auth_provider.get_databricks_host_token()
766
+ if token is None:
767
+ raise ValueError(
768
+ "Got malformed auth (empty token) when fetching auth implicitly available in Model Serving Environment. Please contact Databricks support"
769
+ )
770
+ if cfg.host is None:
771
+ cfg.host = host
772
+ except Exception as e:
773
+ logger.warning("Unable to get auth from Databricks Model Serving Environment", exc_info=e)
774
+ return None
775
+
776
+ logger.info("Using Databricks Model Serving Authentication")
777
+
778
+ def inner() -> Dict[str, str]:
779
+ # Call here again to get the refreshed token
780
+ _, token = model_serving_auth_provider.get_databricks_host_token()
781
+ return {"Authorization": f"Bearer {token}"}
782
+
783
+ return inner
784
+
785
+
701
786
  class DefaultCredentials:
702
787
  """ Select the first applicable credential provider from the chain """
703
788
 
@@ -706,7 +791,7 @@ class DefaultCredentials:
706
791
  self._auth_providers = [
707
792
  pat_auth, basic_auth, metadata_service, oauth_service_principal, azure_service_principal,
708
793
  github_oidc_azure, azure_cli, external_browser, databricks_cli, runtime_native_auth,
709
- google_credentials, google_id
794
+ google_credentials, google_id, model_serving_auth
710
795
  ]
711
796
 
712
797
  def auth_type(self) -> str:
databricks/sdk/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.32.2'
1
+ __version__ = '0.32.3'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: databricks-sdk
3
- Version: 0.32.2
3
+ Version: 0.32.3
4
4
  Summary: Databricks SDK for Python (Beta)
5
5
  Home-page: https://databricks-sdk-py.readthedocs.io
6
6
  Author: Serge Smertin
@@ -6,7 +6,7 @@ databricks/sdk/casing.py,sha256=NKYPrfPbQjM7lU4hhNQK3z1jb_VEA29BfH4FEdby2tg,1137
6
6
  databricks/sdk/clock.py,sha256=Ivlow0r_TkXcTJ8UXkxSA0czKrY0GvwHAeOvjPkJnAQ,1360
7
7
  databricks/sdk/config.py,sha256=UaD-UcgvvohbrDmvbQgUt-KFd8FP1w3iWvaocsoIz9k,21169
8
8
  databricks/sdk/core.py,sha256=PL3RdTMEOtcy4KPt6TKuL6ylm8RaHBXiqGbYwjRu5Gk,14679
9
- databricks/sdk/credentials_provider.py,sha256=8AEDLUgQfCLA5ODVGYsS_70N61a9yYv7137G8wDilsY,30781
9
+ databricks/sdk/credentials_provider.py,sha256=H_eHS2uMf8avNHCfES6xxS9ybSY5_6Ipt-MxA8bKOVo,34720
10
10
  databricks/sdk/data_plane.py,sha256=Er2z2fT-KVupJKzGozGGZ-jCQ3AmDWq-DZppahIK6tU,2591
11
11
  databricks/sdk/dbutils.py,sha256=HFCuB-el6SFKhF8qRfJxYANtyLTm-VG9GtQuQgZXFkM,15741
12
12
  databricks/sdk/environments.py,sha256=5KoVuVfF-ZX17rua1sH3EJCCtniVrREXBXsMNDEV-UU,4293
@@ -14,7 +14,7 @@ databricks/sdk/oauth.py,sha256=KzcJPYLL3JL6RDvf_Q8SDAaF9xSaoYNCRD4rYInZDuo,18319
14
14
  databricks/sdk/py.typed,sha256=pSvaHpbY1UPNEXyVFUjlgBhjPFZMmVC_UNrPC7eMOHI,74
15
15
  databricks/sdk/retries.py,sha256=WgLh12bwdBc6fCQlaig3kKu18cVhPzFDGsspvq629Ew,2454
16
16
  databricks/sdk/useragent.py,sha256=I2-VnJSE6cg9QV4GXkoQSkHsEB3bDvRGgkawbBNl4G0,5540
17
- databricks/sdk/version.py,sha256=mteW834a5f5Gxn1SNzRvKxq9Y4nN1qsJoM5ubib79tI,23
17
+ databricks/sdk/version.py,sha256=lcjcbT3Cv9Zt--ZYcNwIJDgsWDwjGtgW49gCMxzU3XE,23
18
18
  databricks/sdk/_widgets/__init__.py,sha256=Qm3JB8LmdPgEn_-VgxKkodTO4gn6OdaDPwsYcDmeIRI,2667
19
19
  databricks/sdk/_widgets/default_widgets_utils.py,sha256=Rk59AFzVYVpOektB_yC_7j-vSt5OdtZA85IlG0kw0xA,1202
20
20
  databricks/sdk/_widgets/ipywidgets_utils.py,sha256=P-AyGeahPiX3S59mxpAMgffi4gyJ0irEOY7Ekkn9nQ0,2850
@@ -57,9 +57,9 @@ databricks/sdk/service/sharing.py,sha256=kalJYd0v1SwuGhlCaq4l2ZhzNlev9OwNbCXFIOK
57
57
  databricks/sdk/service/sql.py,sha256=RaXIYMDtHbhvB7gtSMyvQsqiO_E0cMz5NXeTsrqtPVk,334558
58
58
  databricks/sdk/service/vectorsearch.py,sha256=a5Y4vrS_oAJJqa69XwKMANhGuZi5glS0PSXBXz1bKGU,62961
59
59
  databricks/sdk/service/workspace.py,sha256=FKLf5esRmfFstIXo7HQg6HQCzQ2svrb6ulr8yzZ7-8U,101182
60
- databricks_sdk-0.32.2.dist-info/LICENSE,sha256=afBgTZo-JsYqj4VOjnejBetMuHKcFR30YobDdpVFkqY,11411
61
- databricks_sdk-0.32.2.dist-info/METADATA,sha256=MDIMnh2mylfaS-wyBerMRQvfRuBPl08p7mWbKu8stPk,37967
62
- databricks_sdk-0.32.2.dist-info/NOTICE,sha256=Qnc0m8JjZNTDV80y0h1aJGvsr4GqM63m1nr2VTypg6E,963
63
- databricks_sdk-0.32.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
64
- databricks_sdk-0.32.2.dist-info/top_level.txt,sha256=7kRdatoSgU0EUurRQJ_3F1Nv4EOSHWAr6ng25tJOJKU,11
65
- databricks_sdk-0.32.2.dist-info/RECORD,,
60
+ databricks_sdk-0.32.3.dist-info/LICENSE,sha256=afBgTZo-JsYqj4VOjnejBetMuHKcFR30YobDdpVFkqY,11411
61
+ databricks_sdk-0.32.3.dist-info/METADATA,sha256=dJZB_OYTTrlvOV4QB9YzKWQIdsI_SgZRYvLIk0NETTw,37967
62
+ databricks_sdk-0.32.3.dist-info/NOTICE,sha256=Qnc0m8JjZNTDV80y0h1aJGvsr4GqM63m1nr2VTypg6E,963
63
+ databricks_sdk-0.32.3.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
64
+ databricks_sdk-0.32.3.dist-info/top_level.txt,sha256=7kRdatoSgU0EUurRQJ_3F1Nv4EOSHWAr6ng25tJOJKU,11
65
+ databricks_sdk-0.32.3.dist-info/RECORD,,