databricks-sdk 0.68.0__py3-none-any.whl → 0.70.0__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.
- databricks/sdk/__init__.py +6 -10
- databricks/sdk/config.py +62 -14
- databricks/sdk/dbutils.py +17 -0
- databricks/sdk/mixins/files.py +1155 -111
- databricks/sdk/mixins/files_utils.py +293 -0
- databricks/sdk/service/catalog.py +5 -4
- databricks/sdk/service/compute.py +10 -0
- databricks/sdk/service/dataquality.py +197 -52
- databricks/sdk/service/jobs.py +73 -38
- databricks/sdk/service/ml.py +297 -0
- databricks/sdk/service/oauth2.py +27 -1
- databricks/sdk/service/pipelines.py +2 -2
- databricks/sdk/service/provisioning.py +10 -1
- databricks/sdk/service/settings.py +2 -0
- databricks/sdk/service/sharing.py +0 -38
- databricks/sdk/service/sql.py +37 -38
- databricks/sdk/version.py +1 -1
- {databricks_sdk-0.68.0.dist-info → databricks_sdk-0.70.0.dist-info}/METADATA +1 -1
- {databricks_sdk-0.68.0.dist-info → databricks_sdk-0.70.0.dist-info}/RECORD +23 -22
- {databricks_sdk-0.68.0.dist-info → databricks_sdk-0.70.0.dist-info}/WHEEL +0 -0
- {databricks_sdk-0.68.0.dist-info → databricks_sdk-0.70.0.dist-info}/licenses/LICENSE +0 -0
- {databricks_sdk-0.68.0.dist-info → databricks_sdk-0.70.0.dist-info}/licenses/NOTICE +0 -0
- {databricks_sdk-0.68.0.dist-info → databricks_sdk-0.70.0.dist-info}/top_level.txt +0 -0
databricks/sdk/service/ml.py
CHANGED
|
@@ -1299,11 +1299,16 @@ class Feature:
|
|
|
1299
1299
|
description: Optional[str] = None
|
|
1300
1300
|
"""The description of the feature."""
|
|
1301
1301
|
|
|
1302
|
+
filter_condition: Optional[str] = None
|
|
1303
|
+
"""The filter condition applied to the source data before aggregation."""
|
|
1304
|
+
|
|
1302
1305
|
def as_dict(self) -> dict:
|
|
1303
1306
|
"""Serializes the Feature into a dictionary suitable for use as a JSON request body."""
|
|
1304
1307
|
body = {}
|
|
1305
1308
|
if self.description is not None:
|
|
1306
1309
|
body["description"] = self.description
|
|
1310
|
+
if self.filter_condition is not None:
|
|
1311
|
+
body["filter_condition"] = self.filter_condition
|
|
1307
1312
|
if self.full_name is not None:
|
|
1308
1313
|
body["full_name"] = self.full_name
|
|
1309
1314
|
if self.function:
|
|
@@ -1321,6 +1326,8 @@ class Feature:
|
|
|
1321
1326
|
body = {}
|
|
1322
1327
|
if self.description is not None:
|
|
1323
1328
|
body["description"] = self.description
|
|
1329
|
+
if self.filter_condition is not None:
|
|
1330
|
+
body["filter_condition"] = self.filter_condition
|
|
1324
1331
|
if self.full_name is not None:
|
|
1325
1332
|
body["full_name"] = self.full_name
|
|
1326
1333
|
if self.function:
|
|
@@ -1338,6 +1345,7 @@ class Feature:
|
|
|
1338
1345
|
"""Deserializes the Feature from a dictionary."""
|
|
1339
1346
|
return cls(
|
|
1340
1347
|
description=d.get("description", None),
|
|
1348
|
+
filter_condition=d.get("filter_condition", None),
|
|
1341
1349
|
full_name=d.get("full_name", None),
|
|
1342
1350
|
function=_from_dict(d, "function", Function),
|
|
1343
1351
|
inputs=d.get("inputs", None),
|
|
@@ -2419,6 +2427,41 @@ class ListFeaturesResponse:
|
|
|
2419
2427
|
return cls(features=_repeated_dict(d, "features", Feature), next_page_token=d.get("next_page_token", None))
|
|
2420
2428
|
|
|
2421
2429
|
|
|
2430
|
+
@dataclass
|
|
2431
|
+
class ListMaterializedFeaturesResponse:
|
|
2432
|
+
materialized_features: Optional[List[MaterializedFeature]] = None
|
|
2433
|
+
"""List of materialized features."""
|
|
2434
|
+
|
|
2435
|
+
next_page_token: Optional[str] = None
|
|
2436
|
+
"""Pagination token to request the next page of results for this query."""
|
|
2437
|
+
|
|
2438
|
+
def as_dict(self) -> dict:
|
|
2439
|
+
"""Serializes the ListMaterializedFeaturesResponse into a dictionary suitable for use as a JSON request body."""
|
|
2440
|
+
body = {}
|
|
2441
|
+
if self.materialized_features:
|
|
2442
|
+
body["materialized_features"] = [v.as_dict() for v in self.materialized_features]
|
|
2443
|
+
if self.next_page_token is not None:
|
|
2444
|
+
body["next_page_token"] = self.next_page_token
|
|
2445
|
+
return body
|
|
2446
|
+
|
|
2447
|
+
def as_shallow_dict(self) -> dict:
|
|
2448
|
+
"""Serializes the ListMaterializedFeaturesResponse into a shallow dictionary of its immediate attributes."""
|
|
2449
|
+
body = {}
|
|
2450
|
+
if self.materialized_features:
|
|
2451
|
+
body["materialized_features"] = self.materialized_features
|
|
2452
|
+
if self.next_page_token is not None:
|
|
2453
|
+
body["next_page_token"] = self.next_page_token
|
|
2454
|
+
return body
|
|
2455
|
+
|
|
2456
|
+
@classmethod
|
|
2457
|
+
def from_dict(cls, d: Dict[str, Any]) -> ListMaterializedFeaturesResponse:
|
|
2458
|
+
"""Deserializes the ListMaterializedFeaturesResponse from a dictionary."""
|
|
2459
|
+
return cls(
|
|
2460
|
+
materialized_features=_repeated_dict(d, "materialized_features", MaterializedFeature),
|
|
2461
|
+
next_page_token=d.get("next_page_token", None),
|
|
2462
|
+
)
|
|
2463
|
+
|
|
2464
|
+
|
|
2422
2465
|
@dataclass
|
|
2423
2466
|
class ListModelsResponse:
|
|
2424
2467
|
next_page_token: Optional[str] = None
|
|
@@ -2937,6 +2980,90 @@ class LoggedModelTag:
|
|
|
2937
2980
|
return cls(key=d.get("key", None), value=d.get("value", None))
|
|
2938
2981
|
|
|
2939
2982
|
|
|
2983
|
+
@dataclass
|
|
2984
|
+
class MaterializedFeature:
|
|
2985
|
+
"""A materialized feature represents a feature that is continuously computed and stored."""
|
|
2986
|
+
|
|
2987
|
+
feature_name: str
|
|
2988
|
+
"""The full name of the feature in Unity Catalog."""
|
|
2989
|
+
|
|
2990
|
+
offline_store_config: OfflineStoreConfig
|
|
2991
|
+
|
|
2992
|
+
online_store_config: OnlineStore
|
|
2993
|
+
|
|
2994
|
+
last_materialization_time: Optional[str] = None
|
|
2995
|
+
"""The timestamp when the pipeline last ran and updated the materialized feature values. If the
|
|
2996
|
+
pipeline has not run yet, this field will be null."""
|
|
2997
|
+
|
|
2998
|
+
materialized_feature_id: Optional[str] = None
|
|
2999
|
+
"""Unique identifier for the materialized feature."""
|
|
3000
|
+
|
|
3001
|
+
pipeline_schedule_state: Optional[MaterializedFeaturePipelineScheduleState] = None
|
|
3002
|
+
"""The schedule state of the materialization pipeline."""
|
|
3003
|
+
|
|
3004
|
+
table_name: Optional[str] = None
|
|
3005
|
+
"""The fully qualified Unity Catalog path to the table containing the materialized feature (Delta
|
|
3006
|
+
table or Lakebase table). Output only."""
|
|
3007
|
+
|
|
3008
|
+
def as_dict(self) -> dict:
|
|
3009
|
+
"""Serializes the MaterializedFeature into a dictionary suitable for use as a JSON request body."""
|
|
3010
|
+
body = {}
|
|
3011
|
+
if self.feature_name is not None:
|
|
3012
|
+
body["feature_name"] = self.feature_name
|
|
3013
|
+
if self.last_materialization_time is not None:
|
|
3014
|
+
body["last_materialization_time"] = self.last_materialization_time
|
|
3015
|
+
if self.materialized_feature_id is not None:
|
|
3016
|
+
body["materialized_feature_id"] = self.materialized_feature_id
|
|
3017
|
+
if self.offline_store_config:
|
|
3018
|
+
body["offline_store_config"] = self.offline_store_config.as_dict()
|
|
3019
|
+
if self.online_store_config:
|
|
3020
|
+
body["online_store_config"] = self.online_store_config.as_dict()
|
|
3021
|
+
if self.pipeline_schedule_state is not None:
|
|
3022
|
+
body["pipeline_schedule_state"] = self.pipeline_schedule_state.value
|
|
3023
|
+
if self.table_name is not None:
|
|
3024
|
+
body["table_name"] = self.table_name
|
|
3025
|
+
return body
|
|
3026
|
+
|
|
3027
|
+
def as_shallow_dict(self) -> dict:
|
|
3028
|
+
"""Serializes the MaterializedFeature into a shallow dictionary of its immediate attributes."""
|
|
3029
|
+
body = {}
|
|
3030
|
+
if self.feature_name is not None:
|
|
3031
|
+
body["feature_name"] = self.feature_name
|
|
3032
|
+
if self.last_materialization_time is not None:
|
|
3033
|
+
body["last_materialization_time"] = self.last_materialization_time
|
|
3034
|
+
if self.materialized_feature_id is not None:
|
|
3035
|
+
body["materialized_feature_id"] = self.materialized_feature_id
|
|
3036
|
+
if self.offline_store_config:
|
|
3037
|
+
body["offline_store_config"] = self.offline_store_config
|
|
3038
|
+
if self.online_store_config:
|
|
3039
|
+
body["online_store_config"] = self.online_store_config
|
|
3040
|
+
if self.pipeline_schedule_state is not None:
|
|
3041
|
+
body["pipeline_schedule_state"] = self.pipeline_schedule_state
|
|
3042
|
+
if self.table_name is not None:
|
|
3043
|
+
body["table_name"] = self.table_name
|
|
3044
|
+
return body
|
|
3045
|
+
|
|
3046
|
+
@classmethod
|
|
3047
|
+
def from_dict(cls, d: Dict[str, Any]) -> MaterializedFeature:
|
|
3048
|
+
"""Deserializes the MaterializedFeature from a dictionary."""
|
|
3049
|
+
return cls(
|
|
3050
|
+
feature_name=d.get("feature_name", None),
|
|
3051
|
+
last_materialization_time=d.get("last_materialization_time", None),
|
|
3052
|
+
materialized_feature_id=d.get("materialized_feature_id", None),
|
|
3053
|
+
offline_store_config=_from_dict(d, "offline_store_config", OfflineStoreConfig),
|
|
3054
|
+
online_store_config=_from_dict(d, "online_store_config", OnlineStore),
|
|
3055
|
+
pipeline_schedule_state=_enum(d, "pipeline_schedule_state", MaterializedFeaturePipelineScheduleState),
|
|
3056
|
+
table_name=d.get("table_name", None),
|
|
3057
|
+
)
|
|
3058
|
+
|
|
3059
|
+
|
|
3060
|
+
class MaterializedFeaturePipelineScheduleState(Enum):
|
|
3061
|
+
|
|
3062
|
+
ACTIVE = "ACTIVE"
|
|
3063
|
+
PAUSED = "PAUSED"
|
|
3064
|
+
SNAPSHOT = "SNAPSHOT"
|
|
3065
|
+
|
|
3066
|
+
|
|
2940
3067
|
@dataclass
|
|
2941
3068
|
class Metric:
|
|
2942
3069
|
"""Metric associated with a run, represented as a key-value pair."""
|
|
@@ -3613,6 +3740,52 @@ class ModelVersionTag:
|
|
|
3613
3740
|
return cls(key=d.get("key", None), value=d.get("value", None))
|
|
3614
3741
|
|
|
3615
3742
|
|
|
3743
|
+
@dataclass
|
|
3744
|
+
class OfflineStoreConfig:
|
|
3745
|
+
"""Configuration for offline store destination."""
|
|
3746
|
+
|
|
3747
|
+
catalog_name: str
|
|
3748
|
+
"""The Unity Catalog catalog name."""
|
|
3749
|
+
|
|
3750
|
+
schema_name: str
|
|
3751
|
+
"""The Unity Catalog schema name."""
|
|
3752
|
+
|
|
3753
|
+
table_name_prefix: str
|
|
3754
|
+
"""Prefix for Unity Catalog table name. The materialized feature will be stored in a table with
|
|
3755
|
+
this prefix and a generated postfix."""
|
|
3756
|
+
|
|
3757
|
+
def as_dict(self) -> dict:
|
|
3758
|
+
"""Serializes the OfflineStoreConfig into a dictionary suitable for use as a JSON request body."""
|
|
3759
|
+
body = {}
|
|
3760
|
+
if self.catalog_name is not None:
|
|
3761
|
+
body["catalog_name"] = self.catalog_name
|
|
3762
|
+
if self.schema_name is not None:
|
|
3763
|
+
body["schema_name"] = self.schema_name
|
|
3764
|
+
if self.table_name_prefix is not None:
|
|
3765
|
+
body["table_name_prefix"] = self.table_name_prefix
|
|
3766
|
+
return body
|
|
3767
|
+
|
|
3768
|
+
def as_shallow_dict(self) -> dict:
|
|
3769
|
+
"""Serializes the OfflineStoreConfig into a shallow dictionary of its immediate attributes."""
|
|
3770
|
+
body = {}
|
|
3771
|
+
if self.catalog_name is not None:
|
|
3772
|
+
body["catalog_name"] = self.catalog_name
|
|
3773
|
+
if self.schema_name is not None:
|
|
3774
|
+
body["schema_name"] = self.schema_name
|
|
3775
|
+
if self.table_name_prefix is not None:
|
|
3776
|
+
body["table_name_prefix"] = self.table_name_prefix
|
|
3777
|
+
return body
|
|
3778
|
+
|
|
3779
|
+
@classmethod
|
|
3780
|
+
def from_dict(cls, d: Dict[str, Any]) -> OfflineStoreConfig:
|
|
3781
|
+
"""Deserializes the OfflineStoreConfig from a dictionary."""
|
|
3782
|
+
return cls(
|
|
3783
|
+
catalog_name=d.get("catalog_name", None),
|
|
3784
|
+
schema_name=d.get("schema_name", None),
|
|
3785
|
+
table_name_prefix=d.get("table_name_prefix", None),
|
|
3786
|
+
)
|
|
3787
|
+
|
|
3788
|
+
|
|
3616
3789
|
@dataclass
|
|
3617
3790
|
class OnlineStore:
|
|
3618
3791
|
"""An OnlineStore is a logical database instance that stores and serves features online."""
|
|
@@ -6563,6 +6736,23 @@ class FeatureEngineeringAPI:
|
|
|
6563
6736
|
res = self._api.do("POST", "/api/2.0/feature-engineering/features", body=body, headers=headers)
|
|
6564
6737
|
return Feature.from_dict(res)
|
|
6565
6738
|
|
|
6739
|
+
def create_materialized_feature(self, materialized_feature: MaterializedFeature) -> MaterializedFeature:
|
|
6740
|
+
"""Create a materialized feature.
|
|
6741
|
+
|
|
6742
|
+
:param materialized_feature: :class:`MaterializedFeature`
|
|
6743
|
+
The materialized feature to create.
|
|
6744
|
+
|
|
6745
|
+
:returns: :class:`MaterializedFeature`
|
|
6746
|
+
"""
|
|
6747
|
+
body = materialized_feature.as_dict()
|
|
6748
|
+
headers = {
|
|
6749
|
+
"Accept": "application/json",
|
|
6750
|
+
"Content-Type": "application/json",
|
|
6751
|
+
}
|
|
6752
|
+
|
|
6753
|
+
res = self._api.do("POST", "/api/2.0/feature-engineering/materialized-features", body=body, headers=headers)
|
|
6754
|
+
return MaterializedFeature.from_dict(res)
|
|
6755
|
+
|
|
6566
6756
|
def delete_feature(self, full_name: str):
|
|
6567
6757
|
"""Delete a Feature.
|
|
6568
6758
|
|
|
@@ -6578,6 +6768,23 @@ class FeatureEngineeringAPI:
|
|
|
6578
6768
|
|
|
6579
6769
|
self._api.do("DELETE", f"/api/2.0/feature-engineering/features/{full_name}", headers=headers)
|
|
6580
6770
|
|
|
6771
|
+
def delete_materialized_feature(self, materialized_feature_id: str):
|
|
6772
|
+
"""Delete a materialized feature.
|
|
6773
|
+
|
|
6774
|
+
:param materialized_feature_id: str
|
|
6775
|
+
The ID of the materialized feature to delete.
|
|
6776
|
+
|
|
6777
|
+
|
|
6778
|
+
"""
|
|
6779
|
+
|
|
6780
|
+
headers = {
|
|
6781
|
+
"Accept": "application/json",
|
|
6782
|
+
}
|
|
6783
|
+
|
|
6784
|
+
self._api.do(
|
|
6785
|
+
"DELETE", f"/api/2.0/feature-engineering/materialized-features/{materialized_feature_id}", headers=headers
|
|
6786
|
+
)
|
|
6787
|
+
|
|
6581
6788
|
def get_feature(self, full_name: str) -> Feature:
|
|
6582
6789
|
"""Get a Feature.
|
|
6583
6790
|
|
|
@@ -6594,6 +6801,24 @@ class FeatureEngineeringAPI:
|
|
|
6594
6801
|
res = self._api.do("GET", f"/api/2.0/feature-engineering/features/{full_name}", headers=headers)
|
|
6595
6802
|
return Feature.from_dict(res)
|
|
6596
6803
|
|
|
6804
|
+
def get_materialized_feature(self, materialized_feature_id: str) -> MaterializedFeature:
|
|
6805
|
+
"""Get a materialized feature.
|
|
6806
|
+
|
|
6807
|
+
:param materialized_feature_id: str
|
|
6808
|
+
The ID of the materialized feature.
|
|
6809
|
+
|
|
6810
|
+
:returns: :class:`MaterializedFeature`
|
|
6811
|
+
"""
|
|
6812
|
+
|
|
6813
|
+
headers = {
|
|
6814
|
+
"Accept": "application/json",
|
|
6815
|
+
}
|
|
6816
|
+
|
|
6817
|
+
res = self._api.do(
|
|
6818
|
+
"GET", f"/api/2.0/feature-engineering/materialized-features/{materialized_feature_id}", headers=headers
|
|
6819
|
+
)
|
|
6820
|
+
return MaterializedFeature.from_dict(res)
|
|
6821
|
+
|
|
6597
6822
|
def list_features(self, *, page_size: Optional[int] = None, page_token: Optional[str] = None) -> Iterator[Feature]:
|
|
6598
6823
|
"""List Features.
|
|
6599
6824
|
|
|
@@ -6623,6 +6848,45 @@ class FeatureEngineeringAPI:
|
|
|
6623
6848
|
return
|
|
6624
6849
|
query["page_token"] = json["next_page_token"]
|
|
6625
6850
|
|
|
6851
|
+
def list_materialized_features(
|
|
6852
|
+
self, *, feature_name: Optional[str] = None, page_size: Optional[int] = None, page_token: Optional[str] = None
|
|
6853
|
+
) -> Iterator[MaterializedFeature]:
|
|
6854
|
+
"""List materialized features.
|
|
6855
|
+
|
|
6856
|
+
:param feature_name: str (optional)
|
|
6857
|
+
Filter by feature name. If specified, only materialized features materialized from this feature will
|
|
6858
|
+
be returned.
|
|
6859
|
+
:param page_size: int (optional)
|
|
6860
|
+
The maximum number of results to return. Defaults to 100 if not specified. Cannot be greater than
|
|
6861
|
+
1000.
|
|
6862
|
+
:param page_token: str (optional)
|
|
6863
|
+
Pagination token to go to the next page based on a previous query.
|
|
6864
|
+
|
|
6865
|
+
:returns: Iterator over :class:`MaterializedFeature`
|
|
6866
|
+
"""
|
|
6867
|
+
|
|
6868
|
+
query = {}
|
|
6869
|
+
if feature_name is not None:
|
|
6870
|
+
query["feature_name"] = feature_name
|
|
6871
|
+
if page_size is not None:
|
|
6872
|
+
query["page_size"] = page_size
|
|
6873
|
+
if page_token is not None:
|
|
6874
|
+
query["page_token"] = page_token
|
|
6875
|
+
headers = {
|
|
6876
|
+
"Accept": "application/json",
|
|
6877
|
+
}
|
|
6878
|
+
|
|
6879
|
+
while True:
|
|
6880
|
+
json = self._api.do(
|
|
6881
|
+
"GET", "/api/2.0/feature-engineering/materialized-features", query=query, headers=headers
|
|
6882
|
+
)
|
|
6883
|
+
if "materialized_features" in json:
|
|
6884
|
+
for v in json["materialized_features"]:
|
|
6885
|
+
yield MaterializedFeature.from_dict(v)
|
|
6886
|
+
if "next_page_token" not in json or not json["next_page_token"]:
|
|
6887
|
+
return
|
|
6888
|
+
query["page_token"] = json["next_page_token"]
|
|
6889
|
+
|
|
6626
6890
|
def update_feature(self, full_name: str, feature: Feature, update_mask: str) -> Feature:
|
|
6627
6891
|
"""Update a Feature.
|
|
6628
6892
|
|
|
@@ -6649,6 +6913,39 @@ class FeatureEngineeringAPI:
|
|
|
6649
6913
|
)
|
|
6650
6914
|
return Feature.from_dict(res)
|
|
6651
6915
|
|
|
6916
|
+
def update_materialized_feature(
|
|
6917
|
+
self, materialized_feature_id: str, materialized_feature: MaterializedFeature, update_mask: str
|
|
6918
|
+
) -> MaterializedFeature:
|
|
6919
|
+
"""Update a materialized feature (pause/resume).
|
|
6920
|
+
|
|
6921
|
+
:param materialized_feature_id: str
|
|
6922
|
+
Unique identifier for the materialized feature.
|
|
6923
|
+
:param materialized_feature: :class:`MaterializedFeature`
|
|
6924
|
+
The materialized feature to update.
|
|
6925
|
+
:param update_mask: str
|
|
6926
|
+
Provide the materialization feature fields which should be updated. Currently, only the
|
|
6927
|
+
pipeline_state field can be updated.
|
|
6928
|
+
|
|
6929
|
+
:returns: :class:`MaterializedFeature`
|
|
6930
|
+
"""
|
|
6931
|
+
body = materialized_feature.as_dict()
|
|
6932
|
+
query = {}
|
|
6933
|
+
if update_mask is not None:
|
|
6934
|
+
query["update_mask"] = update_mask
|
|
6935
|
+
headers = {
|
|
6936
|
+
"Accept": "application/json",
|
|
6937
|
+
"Content-Type": "application/json",
|
|
6938
|
+
}
|
|
6939
|
+
|
|
6940
|
+
res = self._api.do(
|
|
6941
|
+
"PATCH",
|
|
6942
|
+
f"/api/2.0/feature-engineering/materialized-features/{materialized_feature_id}",
|
|
6943
|
+
query=query,
|
|
6944
|
+
body=body,
|
|
6945
|
+
headers=headers,
|
|
6946
|
+
)
|
|
6947
|
+
return MaterializedFeature.from_dict(res)
|
|
6948
|
+
|
|
6652
6949
|
|
|
6653
6950
|
class FeatureStoreAPI:
|
|
6654
6951
|
"""A feature store is a centralized repository that enables data scientists to find and share features. Using
|
databricks/sdk/service/oauth2.py
CHANGED
|
@@ -863,17 +863,37 @@ class SecretInfo:
|
|
|
863
863
|
|
|
864
864
|
@dataclass
|
|
865
865
|
class TokenAccessPolicy:
|
|
866
|
+
absolute_session_lifetime_in_minutes: Optional[int] = None
|
|
867
|
+
"""Absolute OAuth session TTL in minutes. Effective only when the single-use refresh token feature
|
|
868
|
+
is enabled. This is the absolute TTL of all refresh tokens issued in one OAuth session. When a
|
|
869
|
+
new refresh token is issued during refresh token rotation, it will inherit the same absolute TTL
|
|
870
|
+
as the old refresh token. In other words, this represents the maximum amount of time a user can
|
|
871
|
+
stay logged in without re-authenticating."""
|
|
872
|
+
|
|
866
873
|
access_token_ttl_in_minutes: Optional[int] = None
|
|
867
874
|
"""access token time to live in minutes"""
|
|
868
875
|
|
|
876
|
+
enable_single_use_refresh_tokens: Optional[bool] = None
|
|
877
|
+
"""Whether to enable single-use refresh tokens (refresh token rotation). If this feature is
|
|
878
|
+
enabled, upon successfully getting a new access token using a refresh token, Databricks will
|
|
879
|
+
issue a new refresh token along with the access token in the response and invalidate the old
|
|
880
|
+
refresh token. The client should use the new refresh token to get access tokens in future
|
|
881
|
+
requests."""
|
|
882
|
+
|
|
869
883
|
refresh_token_ttl_in_minutes: Optional[int] = None
|
|
870
|
-
"""
|
|
884
|
+
"""Refresh token time to live in minutes. When single-use refresh tokens are enabled, this
|
|
885
|
+
represents the TTL of an individual refresh token. If the refresh token is used before it
|
|
886
|
+
expires, a new one is issued with a renewed individual TTL."""
|
|
871
887
|
|
|
872
888
|
def as_dict(self) -> dict:
|
|
873
889
|
"""Serializes the TokenAccessPolicy into a dictionary suitable for use as a JSON request body."""
|
|
874
890
|
body = {}
|
|
891
|
+
if self.absolute_session_lifetime_in_minutes is not None:
|
|
892
|
+
body["absolute_session_lifetime_in_minutes"] = self.absolute_session_lifetime_in_minutes
|
|
875
893
|
if self.access_token_ttl_in_minutes is not None:
|
|
876
894
|
body["access_token_ttl_in_minutes"] = self.access_token_ttl_in_minutes
|
|
895
|
+
if self.enable_single_use_refresh_tokens is not None:
|
|
896
|
+
body["enable_single_use_refresh_tokens"] = self.enable_single_use_refresh_tokens
|
|
877
897
|
if self.refresh_token_ttl_in_minutes is not None:
|
|
878
898
|
body["refresh_token_ttl_in_minutes"] = self.refresh_token_ttl_in_minutes
|
|
879
899
|
return body
|
|
@@ -881,8 +901,12 @@ class TokenAccessPolicy:
|
|
|
881
901
|
def as_shallow_dict(self) -> dict:
|
|
882
902
|
"""Serializes the TokenAccessPolicy into a shallow dictionary of its immediate attributes."""
|
|
883
903
|
body = {}
|
|
904
|
+
if self.absolute_session_lifetime_in_minutes is not None:
|
|
905
|
+
body["absolute_session_lifetime_in_minutes"] = self.absolute_session_lifetime_in_minutes
|
|
884
906
|
if self.access_token_ttl_in_minutes is not None:
|
|
885
907
|
body["access_token_ttl_in_minutes"] = self.access_token_ttl_in_minutes
|
|
908
|
+
if self.enable_single_use_refresh_tokens is not None:
|
|
909
|
+
body["enable_single_use_refresh_tokens"] = self.enable_single_use_refresh_tokens
|
|
886
910
|
if self.refresh_token_ttl_in_minutes is not None:
|
|
887
911
|
body["refresh_token_ttl_in_minutes"] = self.refresh_token_ttl_in_minutes
|
|
888
912
|
return body
|
|
@@ -891,7 +915,9 @@ class TokenAccessPolicy:
|
|
|
891
915
|
def from_dict(cls, d: Dict[str, Any]) -> TokenAccessPolicy:
|
|
892
916
|
"""Deserializes the TokenAccessPolicy from a dictionary."""
|
|
893
917
|
return cls(
|
|
918
|
+
absolute_session_lifetime_in_minutes=d.get("absolute_session_lifetime_in_minutes", None),
|
|
894
919
|
access_token_ttl_in_minutes=d.get("access_token_ttl_in_minutes", None),
|
|
920
|
+
enable_single_use_refresh_tokens=d.get("enable_single_use_refresh_tokens", None),
|
|
895
921
|
refresh_token_ttl_in_minutes=d.get("refresh_token_ttl_in_minutes", None),
|
|
896
922
|
)
|
|
897
923
|
|
|
@@ -119,8 +119,8 @@ class DataPlaneId:
|
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
class DayOfWeek(Enum):
|
|
122
|
-
"""Days of week in which the
|
|
123
|
-
|
|
122
|
+
"""Days of week in which the window is allowed to happen. If not specified all days of the week
|
|
123
|
+
will be used."""
|
|
124
124
|
|
|
125
125
|
FRIDAY = "FRIDAY"
|
|
126
126
|
MONDAY = "MONDAY"
|
|
@@ -1436,7 +1436,7 @@ class Workspace:
|
|
|
1436
1436
|
azure_workspace_info: Optional[AzureWorkspaceInfo] = None
|
|
1437
1437
|
|
|
1438
1438
|
cloud: Optional[str] = None
|
|
1439
|
-
"""The cloud name. This field
|
|
1439
|
+
"""The cloud name. This field can have values like `azure`, `gcp`."""
|
|
1440
1440
|
|
|
1441
1441
|
cloud_resource_container: Optional[CloudResourceContainer] = None
|
|
1442
1442
|
|
|
@@ -2487,6 +2487,7 @@ class WorkspacesAPI:
|
|
|
2487
2487
|
gke_config: Optional[GkeConfig] = None,
|
|
2488
2488
|
location: Optional[str] = None,
|
|
2489
2489
|
managed_services_customer_managed_key_id: Optional[str] = None,
|
|
2490
|
+
network_connectivity_config_id: Optional[str] = None,
|
|
2490
2491
|
network_id: Optional[str] = None,
|
|
2491
2492
|
pricing_tier: Optional[PricingTier] = None,
|
|
2492
2493
|
private_access_settings_id: Optional[str] = None,
|
|
@@ -2565,6 +2566,10 @@ class WorkspacesAPI:
|
|
|
2565
2566
|
The ID of the workspace's managed services encryption key configuration object. This is used to help
|
|
2566
2567
|
protect and control access to the workspace's notebooks, secrets, Databricks SQL queries, and query
|
|
2567
2568
|
history. The provided key configuration object property use_cases must contain MANAGED_SERVICES.
|
|
2569
|
+
:param network_connectivity_config_id: str (optional)
|
|
2570
|
+
The object ID of network connectivity config. Once assigned, the workspace serverless compute
|
|
2571
|
+
resources use the same set of stable IP CIDR blocks and optional private link to access your
|
|
2572
|
+
resources.
|
|
2568
2573
|
:param network_id: str (optional)
|
|
2569
2574
|
The ID of the workspace's network configuration object. To use AWS PrivateLink, this field is
|
|
2570
2575
|
required.
|
|
@@ -2613,6 +2618,8 @@ class WorkspacesAPI:
|
|
|
2613
2618
|
body["location"] = location
|
|
2614
2619
|
if managed_services_customer_managed_key_id is not None:
|
|
2615
2620
|
body["managed_services_customer_managed_key_id"] = managed_services_customer_managed_key_id
|
|
2621
|
+
if network_connectivity_config_id is not None:
|
|
2622
|
+
body["network_connectivity_config_id"] = network_connectivity_config_id
|
|
2616
2623
|
if network_id is not None:
|
|
2617
2624
|
body["network_id"] = network_id
|
|
2618
2625
|
if pricing_tier is not None:
|
|
@@ -2653,6 +2660,7 @@ class WorkspacesAPI:
|
|
|
2653
2660
|
gke_config: Optional[GkeConfig] = None,
|
|
2654
2661
|
location: Optional[str] = None,
|
|
2655
2662
|
managed_services_customer_managed_key_id: Optional[str] = None,
|
|
2663
|
+
network_connectivity_config_id: Optional[str] = None,
|
|
2656
2664
|
network_id: Optional[str] = None,
|
|
2657
2665
|
pricing_tier: Optional[PricingTier] = None,
|
|
2658
2666
|
private_access_settings_id: Optional[str] = None,
|
|
@@ -2673,6 +2681,7 @@ class WorkspacesAPI:
|
|
|
2673
2681
|
gke_config=gke_config,
|
|
2674
2682
|
location=location,
|
|
2675
2683
|
managed_services_customer_managed_key_id=managed_services_customer_managed_key_id,
|
|
2684
|
+
network_connectivity_config_id=network_connectivity_config_id,
|
|
2676
2685
|
network_id=network_id,
|
|
2677
2686
|
pricing_tier=pricing_tier,
|
|
2678
2687
|
private_access_settings_id=private_access_settings_id,
|
|
@@ -4183,6 +4183,8 @@ class NccPrivateEndpointRule:
|
|
|
4183
4183
|
|
|
4184
4184
|
class NccPrivateEndpointRulePrivateLinkConnectionState(Enum):
|
|
4185
4185
|
|
|
4186
|
+
CREATE_FAILED = "CREATE_FAILED"
|
|
4187
|
+
CREATING = "CREATING"
|
|
4186
4188
|
DISCONNECTED = "DISCONNECTED"
|
|
4187
4189
|
ESTABLISHED = "ESTABLISHED"
|
|
4188
4190
|
EXPIRED = "EXPIRED"
|
|
@@ -2987,44 +2987,6 @@ class RecipientFederationPoliciesAPI:
|
|
|
2987
2987
|
return
|
|
2988
2988
|
query["page_token"] = json["next_page_token"]
|
|
2989
2989
|
|
|
2990
|
-
def update(
|
|
2991
|
-
self, recipient_name: str, name: str, policy: FederationPolicy, *, update_mask: Optional[str] = None
|
|
2992
|
-
) -> FederationPolicy:
|
|
2993
|
-
"""Updates an existing federation policy for an OIDC_RECIPIENT. The caller must be the owner of the
|
|
2994
|
-
recipient.
|
|
2995
|
-
|
|
2996
|
-
:param recipient_name: str
|
|
2997
|
-
Name of the recipient. This is the name of the recipient for which the policy is being updated.
|
|
2998
|
-
:param name: str
|
|
2999
|
-
Name of the policy. This is the name of the current name of the policy.
|
|
3000
|
-
:param policy: :class:`FederationPolicy`
|
|
3001
|
-
:param update_mask: str (optional)
|
|
3002
|
-
The field mask specifies which fields of the policy to update. To specify multiple fields in the
|
|
3003
|
-
field mask, use comma as the separator (no space). The special value '*' indicates that all fields
|
|
3004
|
-
should be updated (full replacement). If unspecified, all fields that are set in the policy provided
|
|
3005
|
-
in the update request will overwrite the corresponding fields in the existing policy. Example value:
|
|
3006
|
-
'comment,oidc_policy.audiences'.
|
|
3007
|
-
|
|
3008
|
-
:returns: :class:`FederationPolicy`
|
|
3009
|
-
"""
|
|
3010
|
-
body = policy.as_dict()
|
|
3011
|
-
query = {}
|
|
3012
|
-
if update_mask is not None:
|
|
3013
|
-
query["update_mask"] = update_mask
|
|
3014
|
-
headers = {
|
|
3015
|
-
"Accept": "application/json",
|
|
3016
|
-
"Content-Type": "application/json",
|
|
3017
|
-
}
|
|
3018
|
-
|
|
3019
|
-
res = self._api.do(
|
|
3020
|
-
"PATCH",
|
|
3021
|
-
f"/api/2.0/data-sharing/recipients/{recipient_name}/federation-policies/{name}",
|
|
3022
|
-
query=query,
|
|
3023
|
-
body=body,
|
|
3024
|
-
headers=headers,
|
|
3025
|
-
)
|
|
3026
|
-
return FederationPolicy.from_dict(res)
|
|
3027
|
-
|
|
3028
2990
|
|
|
3029
2991
|
class RecipientsAPI:
|
|
3030
2992
|
"""A recipient is an object you create using :method:recipients/create to represent an organization which you
|