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.

@@ -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
@@ -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
- """refresh token time to live in minutes"""
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 restart is allowed to happen (within a five-hour window starting at
123
- start_hour). If not specified all days of the week will be used."""
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 always has the value `gcp`."""
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