From 91e803526fa9e7da84387c71821835a3ca942b05 Mon Sep 17 00:00:00 2001 From: "databricks-ci-ghec-2[bot]" <184307802+databricks-ci-ghec-2[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 03:11:30 +0000 Subject: [PATCH] Release databricks-sdk-py --- .codegen/_last_sha | 2 +- CHANGELOG.md | 15 ++- databricks/sdk/service/catalog.py | 43 +++++++ databricks/sdk/service/iamv2.py | 141 +++++++++++++++------- databricks/sdk/service/oauth2.py | 10 ++ databricks/sdk/service/pipelines.py | 8 ++ databricks/sdk/service/postgres.py | 13 +- databricks/sdk/service/serving.py | 20 +++ databricks/sdk/version.py | 2 +- docs/account/iamv2/iam_v2.rst | 35 ++++-- docs/dbdataclasses/catalog.rst | 4 + docs/dbdataclasses/serving.rst | 16 +++ docs/workspace/iamv2/workspace_iam_v2.rst | 32 +++-- docs/workspace/postgres/postgres.rst | 13 +- 14 files changed, 273 insertions(+), 81 deletions(-) mode change 100755 => 100644 docs/dbdataclasses/serving.rst diff --git a/.codegen/_last_sha b/.codegen/_last_sha index 94c543ad5..9cf5921aa 100644 --- a/.codegen/_last_sha +++ b/.codegen/_last_sha @@ -1 +1 @@ -93e58accdc05c77daf91820fd9a3de908d616e24 \ No newline at end of file +e33237fd02ef1766c7e1e8c3fac879b98fadba1a \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 98b460b9d..342423f9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,26 @@ # Version changelog +## Release v0.129.0 (2026-08-14) + +### API Changes +* Add `agent_type` field for `databricks.sdk.service.dashboards.GenieConversationSummary`. +* Add `group_id` field for `databricks.sdk.service.iamv2.DirectGroupMember`. +* Add `effective_serverless_compute_id` field for `databricks.sdk.service.jobs.RunTask`. +* Add `pipeline_channel` field for `databricks.sdk.service.postgres.NewPipelineSpec`. +* Add `text_attachment_purpose_answer` enum value for `databricks.sdk.service.dashboards.TextAttachmentPurpose`. +* [Breaking] Add pagination for [AccountIamV2API.list_direct_group_members](https://databricks-sdk-py.readthedocs.io/en/latest/account/iamv2/account_iam_v2.html#databricks.sdk.service.iamv2.AccountIamV2API.list_direct_group_members) method. +* [Breaking] Add pagination for [AccountIamV2API.list_workspace_assignment_details](https://databricks-sdk-py.readthedocs.io/en/latest/account/iamv2/account_iam_v2.html#databricks.sdk.service.iamv2.AccountIamV2API.list_workspace_assignment_details) method. +* [Breaking] Add pagination for [WorkspaceIamV2API.list_direct_group_members_proxy](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/iamv2/workspace_iam_v2.html#databricks.sdk.service.iamv2.WorkspaceIamV2API.list_direct_group_members_proxy) method. +* [Breaking] Add pagination for [WorkspaceIamV2API.list_workspace_assignment_details_proxy](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/iamv2/workspace_iam_v2.html#databricks.sdk.service.iamv2.WorkspaceIamV2API.list_workspace_assignment_details_proxy) method. + ## Release v0.128.0 (2026-08-13) ### API Changes * Add `create_direct_group_member()`, `create_group()`, `create_service_principal()`, `create_user()`, `create_workspace_assignment()`, `delete_direct_group_member()`, `delete_group()`, `delete_service_principal()`, `delete_user()`, `delete_workspace_assignment()`, `get_direct_group_member()`, `get_group()`, `get_service_principal()`, `get_user()`, `get_workspace_assignment()`, `list_direct_group_members()`, `list_groups()`, `list_service_principals()`, `list_transitive_parent_groups()`, `list_users()`, `list_workspace_assignments()`, `update_group()`, `update_service_principal()`, `update_user()` and `update_workspace_assignment()` methods for [a.account_iam_v2](https://databricks-sdk-py.readthedocs.io/en/latest/account/iamv2/account_iam_v2.html) account-level service. * Add `create_direct_group_member_proxy()`, `create_group_proxy()`, `create_service_principal_proxy()`, `create_user_proxy()`, `create_workspace_assignment_proxy()`, `delete_direct_group_member_proxy()`, `delete_group_proxy()`, `delete_service_principal_proxy()`, `delete_user_proxy()`, `delete_workspace_assignment_proxy()`, `get_direct_group_member_proxy()`, `get_group_proxy()`, `get_service_principal_proxy()`, `get_user_proxy()`, `get_workspace_assignment_proxy()`, `get_workspace_identity_detail()`, `list_direct_group_members_proxy()`, `list_groups_proxy()`, `list_service_principals_proxy()`, `list_transitive_parent_groups_proxy()`, `list_users_proxy()`, `list_workspace_assignments_proxy()`, `update_group_proxy()`, `update_service_principal_proxy()`, `update_user_proxy()`, `update_workspace_assignment_proxy()` and `update_workspace_identity_detail()` methods for [w.workspace_iam_v2](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/iamv2/workspace_iam_v2.html) workspace-level service. * Add `create_time` and `update_time` fields for `databricks.sdk.service.dashboards.GenieSpace`. -* [Breaking] Change `new_cluster` field for `databricks.sdk.service.jobs.JobCluster` to no longer be required. * Change `new_cluster` field for `databricks.sdk.service.jobs.JobCluster` to no longer be required. +* [Breaking] Change `new_cluster` field for `databricks.sdk.service.jobs.JobCluster` to no longer be required. ## Release v0.127.0 (2026-08-12) diff --git a/databricks/sdk/service/catalog.py b/databricks/sdk/service/catalog.py index 4020c7cc0..b670c05b2 100644 --- a/databricks/sdk/service/catalog.py +++ b/databricks/sdk/service/catalog.py @@ -6397,6 +6397,40 @@ def from_dict(cls, d: Dict[str, Any]) -> GetWorkspaceBindingsResponse: ) +@dataclass +class GovernedTagReference: + """A governed tag referenced by a policy condition.""" + + tag_key: str + """The governed tag key.""" + + tag_value: Optional[str] = None + """The governed tag value, when the policy references a specific value.""" + + def as_dict(self) -> dict: + """Serializes the GovernedTagReference into a dictionary suitable for use as a JSON request body.""" + body = {} + if self.tag_key is not None: + body["tag_key"] = self.tag_key + if self.tag_value is not None: + body["tag_value"] = self.tag_value + return body + + def as_shallow_dict(self) -> dict: + """Serializes the GovernedTagReference into a shallow dictionary of its immediate attributes.""" + body = {} + if self.tag_key is not None: + body["tag_key"] = self.tag_key + if self.tag_value is not None: + body["tag_value"] = self.tag_value + return body + + @classmethod + def from_dict(cls, d: Dict[str, Any]) -> GovernedTagReference: + """Deserializes the GovernedTagReference from a dictionary.""" + return cls(tag_key=d.get("tag_key", None), tag_value=d.get("tag_value", None)) + + @dataclass class GrantOptions: privileges: List[str] @@ -11175,6 +11209,10 @@ class PolicyInfo: except_principals: Optional[List[str]] = None """Optional list of user or group names that should be excluded from the policy.""" + governed_tags: Optional[List[GovernedTagReference]] = None + """Governed tag keys and values referenced by this policy's conditions and function arguments. + Output only.""" + grant: Optional[GrantOptions] = None """Options for grant policies. Valid only if ``policy_type`` is ``POLICY_TYPE_GRANT``. Required on create and optional on update. When specified on update, the new options will replace the @@ -11237,6 +11275,8 @@ def as_dict(self) -> dict: body["except_principals"] = [v for v in self.except_principals] if self.for_securable_type is not None: body["for_securable_type"] = self.for_securable_type.value + if self.governed_tags: + body["governed_tags"] = [v.as_dict() for v in self.governed_tags] if self.grant: body["grant"] = self.grant.as_dict() if self.id is not None: @@ -11282,6 +11322,8 @@ def as_shallow_dict(self) -> dict: body["except_principals"] = self.except_principals if self.for_securable_type is not None: body["for_securable_type"] = self.for_securable_type + if self.governed_tags: + body["governed_tags"] = self.governed_tags if self.grant: body["grant"] = self.grant if self.id is not None: @@ -11321,6 +11363,7 @@ def from_dict(cls, d: Dict[str, Any]) -> PolicyInfo: deny=_from_dict(d, "deny", DenyOptions), except_principals=d.get("except_principals", None), for_securable_type=_enum(d, "for_securable_type", SecurableType), + governed_tags=_repeated_dict(d, "governed_tags", GovernedTagReference), grant=_from_dict(d, "grant", GrantOptions), id=d.get("id", None), match_columns=_repeated_dict(d, "match_columns", MatchColumn), diff --git a/databricks/sdk/service/iamv2.py b/databricks/sdk/service/iamv2.py index 6ff805ca7..035fb3741 100644 --- a/databricks/sdk/service/iamv2.py +++ b/databricks/sdk/service/iamv2.py @@ -149,6 +149,9 @@ class DirectGroupMember: external_id: Optional[str] = None """The external ID of the principal in Databricks.""" + group_id: Optional[int] = None + """The internal ID of the group this member belongs to.""" + membership_source: Optional[GroupMembershipSource] = None """The source of group membership (internal or from identity provider).""" @@ -162,6 +165,8 @@ def as_dict(self) -> dict: body["display_name"] = self.display_name if self.external_id is not None: body["external_id"] = self.external_id + if self.group_id is not None: + body["group_id"] = self.group_id if self.membership_source is not None: body["membership_source"] = self.membership_source.value if self.principal_id is not None: @@ -177,6 +182,8 @@ def as_shallow_dict(self) -> dict: body["display_name"] = self.display_name if self.external_id is not None: body["external_id"] = self.external_id + if self.group_id is not None: + body["group_id"] = self.group_id if self.membership_source is not None: body["membership_source"] = self.membership_source if self.principal_id is not None: @@ -191,6 +198,7 @@ def from_dict(cls, d: Dict[str, Any]) -> DirectGroupMember: return cls( display_name=d.get("display_name", None), external_id=d.get("external_id", None), + group_id=d.get("group_id", None), membership_source=_enum(d, "membership_source", GroupMembershipSource), principal_id=d.get("principal_id", None), principal_type=_enum(d, "principal_type", PrincipalType), @@ -1340,7 +1348,7 @@ class WorkspaceAssignment: """The type of the principal (user/service principal/group) that is assigned.""" workspace_id: Optional[int] = None - """The workspace ID where the principal is assigned""" + """The workspace ID where the principal is assigned.""" def as_dict(self) -> dict: """Serializes the WorkspaceAssignment into a dictionary suitable for use as a JSON request body.""" @@ -1430,7 +1438,7 @@ class WorkspaceAssignmentDetail: principal_type: Optional[PrincipalType] = None workspace_id: Optional[int] = None - """The workspace ID where the principal is assigned""" + """The workspace ID where the principal is assigned.""" def as_dict(self) -> dict: """Serializes the WorkspaceAssignmentDetail into a dictionary suitable for use as a JSON request body.""" @@ -1647,8 +1655,9 @@ def create_group(self, group: Group) -> Group: that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalGroup resource to sync - groups from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveGroup; to read an existing external + identity, use the ExternalGroup resource. :param group: :class:`Group` Required. Group to be created in @@ -1673,8 +1682,9 @@ def create_service_principal(self, service_principal: ServicePrincipal) -> Servi A local service principal is one that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalServicePrincipal - resource to sync service principals from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveServicePrincipal; to read an existing + external identity, use the ExternalServicePrincipal resource. :param service_principal: :class:`ServicePrincipal` Required. Service principal to be created in @@ -1699,8 +1709,9 @@ def create_user(self, user: User) -> User: is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalUser resource to sync - users from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveUser; to read an existing external + identity, use the ExternalUser resource. :param user: :class:`User` Required. User to be created in @@ -2252,7 +2263,7 @@ def list_attribute_control_entries( def list_direct_group_members( self, group_id: int, *, page_size: Optional[int] = None, page_token: Optional[str] = None - ) -> ListDirectGroupMembersResponse: + ) -> Iterator[DirectGroupMember]: """Lists provisioned direct members of a group with their membership source (internal or from identity provider). @@ -2265,7 +2276,7 @@ def list_direct_group_members( A page token, received from a previous ListDirectGroupMembers call. Provide this to retrieve the subsequent page. - :returns: :class:`ListDirectGroupMembersResponse` + :returns: Iterator over :class:`DirectGroupMember` """ query = {} @@ -2277,13 +2288,19 @@ def list_direct_group_members( "Accept": "application/json", } - res = self._api.do( - "GET", - f"/api/2.0/identity/accounts/{self._api.account_id}/groups/{group_id}/direct-members", - query=query, - headers=headers, - ) - return ListDirectGroupMembersResponse.from_dict(res) + while True: + json = self._api.do( + "GET", + f"/api/2.0/identity/accounts/{self._api.account_id}/groups/{group_id}/direct-members", + query=query, + headers=headers, + ) + if "direct_group_members" in json: + for v in json["direct_group_members"]: + yield DirectGroupMember.from_dict(v) + if "next_page_token" not in json or not json["next_page_token"]: + return + query["page_token"] = json["next_page_token"] def list_groups( self, *, filter: Optional[str] = None, page_size: Optional[int] = None, page_token: Optional[str] = None @@ -2485,7 +2502,7 @@ def list_workspace_access_details( def list_workspace_assignment_details( self, workspace_id: int, *, page_size: Optional[int] = None, page_token: Optional[str] = None - ) -> ListWorkspaceAssignmentDetailsResponse: + ) -> Iterator[WorkspaceAssignmentDetail]: """Lists workspace assignment details for a workspace. The response omits the per-principal entitlement fields (``entitlements`` and ``effective_entitlements``). To read the entitlements for a single principal, get that principal's assignment detail. @@ -2499,7 +2516,7 @@ def list_workspace_assignment_details( A page token, received from a previous ListWorkspaceAssignmentDetails call. Provide this to retrieve the subsequent page. - :returns: :class:`ListWorkspaceAssignmentDetailsResponse` + :returns: Iterator over :class:`WorkspaceAssignmentDetail` """ query = {} @@ -2511,13 +2528,19 @@ def list_workspace_assignment_details( "Accept": "application/json", } - res = self._api.do( - "GET", - f"/api/2.0/identity/accounts/{self._api.account_id}/workspaces/{workspace_id}/workspace-assignment-details", - query=query, - headers=headers, - ) - return ListWorkspaceAssignmentDetailsResponse.from_dict(res) + while True: + json = self._api.do( + "GET", + f"/api/2.0/identity/accounts/{self._api.account_id}/workspaces/{workspace_id}/workspace-assignment-details", + query=query, + headers=headers, + ) + if "workspace_assignment_details" in json: + for v in json["workspace_assignment_details"]: + yield WorkspaceAssignmentDetail.from_dict(v) + if "next_page_token" not in json or not json["next_page_token"]: + return + query["page_token"] = json["next_page_token"] def list_workspace_assignments( self, workspace_id: int, *, page_size: Optional[int] = None, page_token: Optional[str] = None @@ -2669,6 +2692,9 @@ def update_group(self, group_id: str, group: Group, update_mask: str) -> Group: """Updates an existing group in the Databricks account. Only the fields named in the update mask are modified. Returns the updated Group resource. + When AIM is enabled and the group is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. + :param group_id: str Required. Internal ID of the group in Databricks. :param group: :class:`Group` @@ -2703,6 +2729,9 @@ def update_service_principal( """Updates an existing service principal in the Databricks account. Only the fields named in the update mask are modified. Returns the updated ServicePrincipal resource. + When AIM is enabled and the service principal is an external identity (its external_id is set), only + external_id can be updated; its other fields are sourced from your identity provider. + :param service_principal_id: str Required. Internal ID of the service principal in Databricks. :param service_principal: :class:`ServicePrincipal` @@ -2734,8 +2763,10 @@ def update_service_principal( def update_user(self, user_id: str, user: User, update_mask: str) -> User: """Updates an existing user in the Databricks account and returns the updated user. Only the fields named in the update mask are modified. The updatable fields are fullName.givenName, fullName.familyName, - status, and externalId. The behavior is the same whether or not Account Identity Management (AIM) is - enabled. + status, and externalId. + + When AIM is enabled and the user is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. :param user_id: str Required. Internal ID of the user in Databricks. @@ -2882,8 +2913,9 @@ def create_group_proxy(self, group: Group) -> Group: created group. A local group is one that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalGroup resource to sync - groups from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveGroup; to read an existing external + identity, use the ExternalGroup resource. :param group: :class:`Group` Required. Group to be created in @@ -2911,8 +2943,9 @@ def create_service_principal_proxy(self, service_principal: ServicePrincipal) -> customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalServicePrincipal - resource to sync service principals from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveServicePrincipal; to read an existing + external identity, use the ExternalServicePrincipal resource. :param service_principal: :class:`ServicePrincipal` Required. Service principal to be created in @@ -2939,8 +2972,9 @@ def create_user_proxy(self, user: User) -> User: created user. A local user is one that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalUser resource to sync - users from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveUser; to read an existing external + identity, use the ExternalUser resource. :param user: :class:`User` Required. User to be created in @@ -3391,7 +3425,7 @@ def get_workspace_identity_detail(self, principal_id: int) -> WorkspaceIdentityD def list_direct_group_members_proxy( self, group_id: int, *, page_size: Optional[int] = None, page_token: Optional[str] = None - ) -> ListDirectGroupMembersResponse: + ) -> Iterator[DirectGroupMember]: """Lists provisioned direct members of a group with their membership source (internal or from identity provider). @@ -3403,7 +3437,7 @@ def list_direct_group_members_proxy( :param page_token: str (optional) A page token from a previous list call. Provide this to retrieve the subsequent page. - :returns: :class:`ListDirectGroupMembersResponse` + :returns: Iterator over :class:`DirectGroupMember` """ query = {} @@ -3419,8 +3453,16 @@ def list_direct_group_members_proxy( if cfg.workspace_id: headers["X-Databricks-Workspace-Id"] = cfg.workspace_id - res = self._api.do("GET", f"/api/2.0/identity/groups/{group_id}/direct-members", query=query, headers=headers) - return ListDirectGroupMembersResponse.from_dict(res) + while True: + json = self._api.do( + "GET", f"/api/2.0/identity/groups/{group_id}/direct-members", query=query, headers=headers + ) + if "direct_group_members" in json: + for v in json["direct_group_members"]: + yield DirectGroupMember.from_dict(v) + if "next_page_token" not in json or not json["next_page_token"]: + return + query["page_token"] = json["next_page_token"] def list_groups_proxy( self, *, filter: Optional[str] = None, page_size: Optional[int] = None, page_token: Optional[str] = None @@ -3623,7 +3665,7 @@ def list_workspace_access_details_local( def list_workspace_assignment_details_proxy( self, *, page_size: Optional[int] = None, page_token: Optional[str] = None - ) -> ListWorkspaceAssignmentDetailsResponse: + ) -> Iterator[WorkspaceAssignmentDetail]: """Lists workspace assignment details for the calling workspace. The response omits the per-principal entitlement fields (``entitlements`` and ``effective_entitlements``). To read the entitlements for a single principal, get that principal's assignment detail. @@ -3634,7 +3676,7 @@ def list_workspace_assignment_details_proxy( :param page_token: str (optional) A page token from a previous list call. Provide this to retrieve the subsequent page. - :returns: :class:`ListWorkspaceAssignmentDetailsResponse` + :returns: Iterator over :class:`WorkspaceAssignmentDetail` """ query = {} @@ -3650,8 +3692,14 @@ def list_workspace_assignment_details_proxy( if cfg.workspace_id: headers["X-Databricks-Workspace-Id"] = cfg.workspace_id - res = self._api.do("GET", "/api/2.0/identity/workspace-assignment-details", query=query, headers=headers) - return ListWorkspaceAssignmentDetailsResponse.from_dict(res) + while True: + json = self._api.do("GET", "/api/2.0/identity/workspace-assignment-details", query=query, headers=headers) + if "workspace_assignment_details" in json: + for v in json["workspace_assignment_details"]: + yield WorkspaceAssignmentDetail.from_dict(v) + if "next_page_token" not in json or not json["next_page_token"]: + return + query["page_token"] = json["next_page_token"] def list_workspace_assignments_proxy( self, *, page_size: Optional[int] = None, page_token: Optional[str] = None @@ -3768,6 +3816,9 @@ def update_group_proxy(self, group_id: str, group: Group, update_mask: str) -> G """Updates an existing group in the Databricks account that parents the calling workspace. Only the fields named in the update mask are modified. Returns the updated Group resource. + When AIM is enabled and the group is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. + :param group_id: str Required. Internal ID of the group in Databricks. :param group: :class:`Group` @@ -3800,6 +3851,9 @@ def update_service_principal_proxy( """Updates an existing service principal in the Databricks account that parents the calling workspace. Only the fields named in the update mask are modified. Returns the updated ServicePrincipal resource. + When AIM is enabled and the service principal is an external identity (its external_id is set), only + external_id can be updated; its other fields are sourced from your identity provider. + :param service_principal_id: str Required. Internal ID of the service principal in Databricks. :param service_principal: :class:`ServicePrincipal` @@ -3837,6 +3891,9 @@ def update_user_proxy(self, user_id: str, user: User, update_mask: str) -> User: updated user. Only the fields named in the update mask are modified. The updatable fields are fullName.givenName, fullName.familyName, status, and externalId. + When AIM is enabled and the user is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. + :param user_id: str Required. Internal ID of the user in Databricks. :param user: :class:`User` diff --git a/databricks/sdk/service/oauth2.py b/databricks/sdk/service/oauth2.py index aa922f676..69da087bf 100644 --- a/databricks/sdk/service/oauth2.py +++ b/databricks/sdk/service/oauth2.py @@ -334,6 +334,11 @@ class GetCustomAppIntegrationOutput: integration_id: Optional[str] = None """ID of this custom app""" + is_agent: Optional[bool] = None + """When true, the custom OAuth app integration is backed by an AI agent service principal instead + of a standard application service principal. Mirrors the is_agent input on create; the server + derives it from the presence of the internal OAuthClientApp.agent message.""" + name: Optional[str] = None """The display name of the custom OAuth app""" @@ -367,6 +372,8 @@ def as_dict(self) -> dict: body["creator_username"] = self.creator_username if self.integration_id is not None: body["integration_id"] = self.integration_id + if self.is_agent is not None: + body["is_agent"] = self.is_agent if self.name is not None: body["name"] = self.name if self.principal_id is not None: @@ -396,6 +403,8 @@ def as_shallow_dict(self) -> dict: body["creator_username"] = self.creator_username if self.integration_id is not None: body["integration_id"] = self.integration_id + if self.is_agent is not None: + body["is_agent"] = self.is_agent if self.name is not None: body["name"] = self.name if self.principal_id is not None: @@ -420,6 +429,7 @@ def from_dict(cls, d: Dict[str, Any]) -> GetCustomAppIntegrationOutput: created_by=d.get("created_by", None), creator_username=d.get("creator_username", None), integration_id=d.get("integration_id", None), + is_agent=d.get("is_agent", None), name=d.get("name", None), principal_id=d.get("principal_id", None), redirect_urls=d.get("redirect_urls", None), diff --git a/databricks/sdk/service/pipelines.py b/databricks/sdk/service/pipelines.py index a73a139bb..757c966e7 100644 --- a/databricks/sdk/service/pipelines.py +++ b/databricks/sdk/service/pipelines.py @@ -1254,6 +1254,9 @@ class GetPipelineResponse: effective_publishing_mode: Optional[PublishingMode] = None """Publishing mode of the pipeline""" + effective_serverless_compute_id: Optional[str] = None + """Serverless compute ID resolved for the pipeline.""" + effective_usage_policy_id: Optional[str] = None """Serverless usage policy ID of the pipeline.""" @@ -1305,6 +1308,8 @@ def as_dict(self) -> dict: body["effective_environment_version"] = self.effective_environment_version if self.effective_publishing_mode is not None: body["effective_publishing_mode"] = self.effective_publishing_mode.value + if self.effective_serverless_compute_id is not None: + body["effective_serverless_compute_id"] = self.effective_serverless_compute_id if self.effective_usage_policy_id is not None: body["effective_usage_policy_id"] = self.effective_usage_policy_id if self.health is not None: @@ -1344,6 +1349,8 @@ def as_shallow_dict(self) -> dict: body["effective_environment_version"] = self.effective_environment_version if self.effective_publishing_mode is not None: body["effective_publishing_mode"] = self.effective_publishing_mode + if self.effective_serverless_compute_id is not None: + body["effective_serverless_compute_id"] = self.effective_serverless_compute_id if self.effective_usage_policy_id is not None: body["effective_usage_policy_id"] = self.effective_usage_policy_id if self.health is not None: @@ -1378,6 +1385,7 @@ def from_dict(cls, d: Dict[str, Any]) -> GetPipelineResponse: effective_budget_policy_id=d.get("effective_budget_policy_id", None), effective_environment_version=d.get("effective_environment_version", None), effective_publishing_mode=_enum(d, "effective_publishing_mode", PublishingMode), + effective_serverless_compute_id=d.get("effective_serverless_compute_id", None), effective_usage_policy_id=d.get("effective_usage_policy_id", None), health=_enum(d, "health", GetPipelineResponseHealth), last_modified=d.get("last_modified", None), diff --git a/databricks/sdk/service/postgres.py b/databricks/sdk/service/postgres.py index 16e37b905..0d12c6d26 100644 --- a/databricks/sdk/service/postgres.py +++ b/databricks/sdk/service/postgres.py @@ -7492,7 +7492,7 @@ def update_branch(self, name: str, branch: Branch, update_mask: FieldMask) -> Up The branch's ``name`` field is used to identify the branch to update. Format: projects/{project_id}/branches/{branch_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` """ @@ -7522,7 +7522,7 @@ def update_data_api(self, name: str, data_api: DataApi, update_mask: FieldMask) :param data_api: :class:`DataApi` The Data API configuration to update. The data_api's ``name`` field identifies the resource. :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` """ @@ -7556,7 +7556,7 @@ def update_database(self, name: str, database: Database, update_mask: FieldMask) The database's ``name`` field is used to identify the database to update. Format: projects/{project_id}/branches/{branch_id}/databases/{database_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` """ @@ -7591,7 +7591,7 @@ def update_endpoint(self, name: str, endpoint: Endpoint, update_mask: FieldMask) The endpoint's ``name`` field is used to identify the endpoint to update. Format: projects/{project_id}/branches/{branch_id}/endpoints/{endpoint_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` """ @@ -7624,7 +7624,7 @@ def update_project(self, name: str, project: Project, update_mask: FieldMask) -> The project's ``name`` field is used to identify the project to update. Format: projects/{project_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` """ @@ -7708,8 +7708,7 @@ def update_role(self, name: str, role: Role, update_mask: FieldMask) -> UpdateRo The role's ``name`` field is used to identify the role to update. Format: projects/{project_id}/branches/{branch_id}/roles/{role_id} :param update_mask: FieldMask - The list of fields to update in Postgres Role. If unspecified, all fields will be updated when - possible. + The list of fields to update. :returns: :class:`Operation` """ diff --git a/databricks/sdk/service/serving.py b/databricks/sdk/service/serving.py index 548d84548..b594fc15d 100644 --- a/databricks/sdk/service/serving.py +++ b/databricks/sdk/service/serving.py @@ -22,6 +22,7 @@ _enum, _from_dict, _repeated_dict, + _repeated_enum, _timestamp, Wait, ) @@ -4203,6 +4204,10 @@ class ServingModelWorkloadType(Enum): @dataclass class TelemetryConfig: + enabled_telemetry_features: Optional[List[TelemetryFeature]] = None + """The telemetry signals to enable for this endpoint. If empty or omitted, all signals are enabled; + otherwise only the listed signals are enabled.""" + inference_table_config: Optional[TelemetryInferenceTableConfig] = None """Configuration for inference table payload logging, including sampling.""" @@ -4217,6 +4222,8 @@ class TelemetryConfig: def as_dict(self) -> dict: """Serializes the TelemetryConfig into a dictionary suitable for use as a JSON request body.""" body = {} + if self.enabled_telemetry_features: + body["enabled_telemetry_features"] = [v.value for v in self.enabled_telemetry_features] if self.inference_table_config: body["inference_table_config"] = self.inference_table_config.as_dict() if self.table_names: @@ -4228,6 +4235,8 @@ def as_dict(self) -> dict: def as_shallow_dict(self) -> dict: """Serializes the TelemetryConfig into a shallow dictionary of its immediate attributes.""" body = {} + if self.enabled_telemetry_features: + body["enabled_telemetry_features"] = self.enabled_telemetry_features if self.inference_table_config: body["inference_table_config"] = self.inference_table_config if self.table_names: @@ -4240,12 +4249,23 @@ def as_shallow_dict(self) -> dict: def from_dict(cls, d: Dict[str, Any]) -> TelemetryConfig: """Deserializes the TelemetryConfig from a dictionary.""" return cls( + enabled_telemetry_features=_repeated_enum(d, "enabled_telemetry_features", TelemetryFeature), inference_table_config=_from_dict(d, "inference_table_config", TelemetryInferenceTableConfig), table_names=_from_dict(d, "table_names", UnityCatalogTableNames), telemetry_profile_id=d.get("telemetry_profile_id", None), ) +class TelemetryFeature(Enum): + """A telemetry signal that a serving endpoint can export to Unity Catalog. Use these values to + select which signals the endpoint exports.""" + + TELEMETRY_FEATURE_INFERENCE_TABLE = "TELEMETRY_FEATURE_INFERENCE_TABLE" + TELEMETRY_FEATURE_LOGS = "TELEMETRY_FEATURE_LOGS" + TELEMETRY_FEATURE_METRICS = "TELEMETRY_FEATURE_METRICS" + TELEMETRY_FEATURE_TRACES = "TELEMETRY_FEATURE_TRACES" + + @dataclass class TelemetryInferenceTableConfig: """Inference table payload logging configuration""" diff --git a/databricks/sdk/version.py b/databricks/sdk/version.py index cdd2cc38b..afa4717b9 100644 --- a/databricks/sdk/version.py +++ b/databricks/sdk/version.py @@ -1 +1 @@ -__version__ = "0.128.0" +__version__ = "0.129.0" diff --git a/docs/account/iamv2/iam_v2.rst b/docs/account/iamv2/iam_v2.rst index 993b50bee..b0c5a278c 100644 --- a/docs/account/iamv2/iam_v2.rst +++ b/docs/account/iamv2/iam_v2.rst @@ -54,8 +54,9 @@ that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalGroup resource to sync - groups from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveGroup; to read an existing external + identity, use the ExternalGroup resource. :param group: :class:`Group` Required. Group to be created in @@ -69,8 +70,9 @@ A local service principal is one that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalServicePrincipal - resource to sync service principals from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveServicePrincipal; to read an existing + external identity, use the ExternalServicePrincipal resource. :param service_principal: :class:`ServicePrincipal` Required. Service principal to be created in @@ -84,8 +86,9 @@ is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalUser resource to sync - users from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveUser; to read an existing external + identity, use the ExternalUser resource. :param user: :class:`User` Required. User to be created in @@ -398,7 +401,7 @@ :returns: :class:`ListAttributeControlEntriesResponse` - .. py:method:: list_direct_group_members(group_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> ListDirectGroupMembersResponse + .. py:method:: list_direct_group_members(group_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> Iterator[DirectGroupMember] Lists provisioned direct members of a group with their membership source (internal or from identity provider). @@ -412,7 +415,7 @@ A page token, received from a previous ListDirectGroupMembers call. Provide this to retrieve the subsequent page. - :returns: :class:`ListDirectGroupMembersResponse` + :returns: Iterator over :class:`DirectGroupMember` .. py:method:: list_groups( [, filter: Optional[str], page_size: Optional[int], page_token: Optional[str]]) -> Iterator[Group] @@ -499,7 +502,7 @@ :returns: Iterator over :class:`WorkspaceAccessDetail` - .. py:method:: list_workspace_assignment_details(workspace_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> ListWorkspaceAssignmentDetailsResponse + .. py:method:: list_workspace_assignment_details(workspace_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> Iterator[WorkspaceAssignmentDetail] Lists workspace assignment details for a workspace. The response omits the per-principal entitlement fields (``entitlements`` and ``effective_entitlements``). To read the entitlements for a single @@ -514,7 +517,7 @@ A page token, received from a previous ListWorkspaceAssignmentDetails call. Provide this to retrieve the subsequent page. - :returns: :class:`ListWorkspaceAssignmentDetailsResponse` + :returns: Iterator over :class:`WorkspaceAssignmentDetail` .. py:method:: list_workspace_assignments(workspace_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> ListWorkspaceAssignmentsResponse @@ -592,6 +595,9 @@ Updates an existing group in the Databricks account. Only the fields named in the update mask are modified. Returns the updated Group resource. + When AIM is enabled and the group is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. + :param group_id: str Required. Internal ID of the group in Databricks. :param group: :class:`Group` @@ -607,6 +613,9 @@ Updates an existing service principal in the Databricks account. Only the fields named in the update mask are modified. Returns the updated ServicePrincipal resource. + When AIM is enabled and the service principal is an external identity (its external_id is set), only + external_id can be updated; its other fields are sourced from your identity provider. + :param service_principal_id: str Required. Internal ID of the service principal in Databricks. :param service_principal: :class:`ServicePrincipal` @@ -621,8 +630,10 @@ Updates an existing user in the Databricks account and returns the updated user. Only the fields named in the update mask are modified. The updatable fields are fullName.givenName, fullName.familyName, - status, and externalId. The behavior is the same whether or not Account Identity Management (AIM) is - enabled. + status, and externalId. + + When AIM is enabled and the user is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. :param user_id: str Required. Internal ID of the user in Databricks. diff --git a/docs/dbdataclasses/catalog.rst b/docs/dbdataclasses/catalog.rst index 1c4faace1..02e626801 100644 --- a/docs/dbdataclasses/catalog.rst +++ b/docs/dbdataclasses/catalog.rst @@ -1180,6 +1180,10 @@ These dataclasses are used in the SDK to represent API requests and responses fo :members: :undoc-members: +.. autoclass:: GovernedTagReference + :members: + :undoc-members: + .. autoclass:: GrantOptions :members: :undoc-members: diff --git a/docs/dbdataclasses/serving.rst b/docs/dbdataclasses/serving.rst old mode 100755 new mode 100644 index 29fd7de8a..d943fa361 --- a/docs/dbdataclasses/serving.rst +++ b/docs/dbdataclasses/serving.rst @@ -586,6 +586,22 @@ These dataclasses are used in the SDK to represent API requests and responses fo :members: :undoc-members: +.. py:class:: TelemetryFeature + + A telemetry signal that a serving endpoint can export to Unity Catalog. Use these values to select which signals the endpoint exports. + + .. py:attribute:: TELEMETRY_FEATURE_INFERENCE_TABLE + :value: "TELEMETRY_FEATURE_INFERENCE_TABLE" + + .. py:attribute:: TELEMETRY_FEATURE_LOGS + :value: "TELEMETRY_FEATURE_LOGS" + + .. py:attribute:: TELEMETRY_FEATURE_METRICS + :value: "TELEMETRY_FEATURE_METRICS" + + .. py:attribute:: TELEMETRY_FEATURE_TRACES + :value: "TELEMETRY_FEATURE_TRACES" + .. autoclass:: TelemetryInferenceTableConfig :members: :undoc-members: diff --git a/docs/workspace/iamv2/workspace_iam_v2.rst b/docs/workspace/iamv2/workspace_iam_v2.rst index eb07fde76..2a02d3447 100644 --- a/docs/workspace/iamv2/workspace_iam_v2.rst +++ b/docs/workspace/iamv2/workspace_iam_v2.rst @@ -24,8 +24,9 @@ created group. A local group is one that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalGroup resource to sync - groups from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveGroup; to read an existing external + identity, use the ExternalGroup resource. :param group: :class:`Group` Required. Group to be created in @@ -40,8 +41,9 @@ customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalServicePrincipal - resource to sync service principals from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveServicePrincipal; to read an existing + external identity, use the ExternalServicePrincipal resource. :param service_principal: :class:`ServicePrincipal` Required. Service principal to be created in @@ -55,8 +57,9 @@ created user. A local user is one that is not synced from the customer's identity provider, and can be created whether or not Account Identity Management (AIM) is enabled. - When AIM is enabled, supplying an external ID returns an error. Use the ExternalUser resource to sync - users from the identity provider instead. + When AIM is enabled, supplying an external ID returns an error. To provision the identity from your + identity provider, resolve it by its external ID with ResolveUser; to read an existing external + identity, use the ExternalUser resource. :param user: :class:`User` Required. User to be created in @@ -292,7 +295,7 @@ :returns: :class:`WorkspaceIdentityDetail` - .. py:method:: list_direct_group_members_proxy(group_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> ListDirectGroupMembersResponse + .. py:method:: list_direct_group_members_proxy(group_id: int [, page_size: Optional[int], page_token: Optional[str]]) -> Iterator[DirectGroupMember] Lists provisioned direct members of a group with their membership source (internal or from identity provider). @@ -305,7 +308,7 @@ :param page_token: str (optional) A page token from a previous list call. Provide this to retrieve the subsequent page. - :returns: :class:`ListDirectGroupMembersResponse` + :returns: Iterator over :class:`DirectGroupMember` .. py:method:: list_groups_proxy( [, filter: Optional[str], page_size: Optional[int], page_token: Optional[str]]) -> Iterator[Group] @@ -390,7 +393,7 @@ :returns: Iterator over :class:`WorkspaceAccessDetail` - .. py:method:: list_workspace_assignment_details_proxy( [, page_size: Optional[int], page_token: Optional[str]]) -> ListWorkspaceAssignmentDetailsResponse + .. py:method:: list_workspace_assignment_details_proxy( [, page_size: Optional[int], page_token: Optional[str]]) -> Iterator[WorkspaceAssignmentDetail] Lists workspace assignment details for the calling workspace. The response omits the per-principal entitlement fields (``entitlements`` and ``effective_entitlements``). To read the entitlements for a @@ -402,7 +405,7 @@ :param page_token: str (optional) A page token from a previous list call. Provide this to retrieve the subsequent page. - :returns: :class:`ListWorkspaceAssignmentDetailsResponse` + :returns: Iterator over :class:`WorkspaceAssignmentDetail` .. py:method:: list_workspace_assignments_proxy( [, page_size: Optional[int], page_token: Optional[str]]) -> ListWorkspaceAssignmentsResponse @@ -460,6 +463,9 @@ Updates an existing group in the Databricks account that parents the calling workspace. Only the fields named in the update mask are modified. Returns the updated Group resource. + When AIM is enabled and the group is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. + :param group_id: str Required. Internal ID of the group in Databricks. :param group: :class:`Group` @@ -475,6 +481,9 @@ Updates an existing service principal in the Databricks account that parents the calling workspace. Only the fields named in the update mask are modified. Returns the updated ServicePrincipal resource. + When AIM is enabled and the service principal is an external identity (its external_id is set), only + external_id can be updated; its other fields are sourced from your identity provider. + :param service_principal_id: str Required. Internal ID of the service principal in Databricks. :param service_principal: :class:`ServicePrincipal` @@ -491,6 +500,9 @@ updated user. Only the fields named in the update mask are modified. The updatable fields are fullName.givenName, fullName.familyName, status, and externalId. + When AIM is enabled and the user is an external identity (its external_id is set), only external_id + can be updated; its other fields are sourced from your identity provider. + :param user_id: str Required. Internal ID of the user in Databricks. :param user: :class:`User` diff --git a/docs/workspace/postgres/postgres.rst b/docs/workspace/postgres/postgres.rst index 049259df8..e6640996d 100644 --- a/docs/workspace/postgres/postgres.rst +++ b/docs/workspace/postgres/postgres.rst @@ -886,7 +886,7 @@ The branch's ``name`` field is used to identify the branch to update. Format: projects/{project_id}/branches/{branch_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` @@ -900,7 +900,7 @@ :param data_api: :class:`DataApi` The Data API configuration to update. The data_api's ``name`` field identifies the resource. :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` @@ -918,7 +918,7 @@ The database's ``name`` field is used to identify the database to update. Format: projects/{project_id}/branches/{branch_id}/databases/{database_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` @@ -937,7 +937,7 @@ The endpoint's ``name`` field is used to identify the endpoint to update. Format: projects/{project_id}/branches/{branch_id}/endpoints/{endpoint_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` @@ -954,7 +954,7 @@ The project's ``name`` field is used to identify the project to update. Format: projects/{project_id} :param update_mask: FieldMask - The list of fields to update. If unspecified, all fields will be updated when possible. + The list of fields to update. :returns: :class:`Operation` @@ -995,8 +995,7 @@ The role's ``name`` field is used to identify the role to update. Format: projects/{project_id}/branches/{branch_id}/roles/{role_id} :param update_mask: FieldMask - The list of fields to update in Postgres Role. If unspecified, all fields will be updated when - possible. + The list of fields to update. :returns: :class:`Operation`