From 034be22b1934bb09446a84e5fa4526222e4d0071 Mon Sep 17 00:00:00 2001 From: Google APIs Date: Thu, 18 Jun 2026 23:21:44 -0700 Subject: [PATCH] feat: Add support for recursive folder and team folder deletions feat: Add long-running operations for asynchronous repository deletion feat: Add Developer Connect integration for Git repository authentication feat: Add effective default branch field and granular access token error status for repositories feat: Add directory metadata views to retrieve file sizes and modification timestamps docs: Clarify field usage guidelines and default values in API reference documentation PiperOrigin-RevId: 934748098 --- google/cloud/dataform/v1beta1/dataform.proto | 333 ++++++++++++++++-- .../v1beta1/dataform_grpc_service_config.json | 4 +- .../dataform/v1beta1/dataform_v1beta1.yaml | 20 +- 3 files changed, 321 insertions(+), 36 deletions(-) diff --git a/google/cloud/dataform/v1beta1/dataform.proto b/google/cloud/dataform/v1beta1/dataform.proto index 7a0944a2df..14f1b37c7a 100644 --- a/google/cloud/dataform/v1beta1/dataform.proto +++ b/google/cloud/dataform/v1beta1/dataform.proto @@ -52,6 +52,14 @@ option (google.api.resource_definition) = { type: "aiplatform.googleapis.com/NotebookRuntimeTemplate" pattern: "projects/{project}/locations/{location}/notebookRuntimeTemplates/{notebook_runtime_template}" }; +option (google.api.resource_definition) = { + type: "dataplex.googleapis.com/EntryLink" + pattern: "projects/{project}/locations/{location}/entryGroups/{entry_group}/entryLinks/{entry_link}" +}; +option (google.api.resource_definition) = { + type: "developerconnect.googleapis.com/GitRepositoryLink" + pattern: "projects/{project}/locations/{location}/connections/{connection}/gitRepositoryLinks/{git_repository_link}" +}; // Dataform is a service to develop, create, document, test, and update curated // tables in BigQuery. @@ -96,6 +104,21 @@ service Dataform { option (google.api.method_signature) = "name"; } + // Deletes a TeamFolder with its contents (Folders, Repositories, Workspaces, + // ReleaseConfigs, and WorkflowConfigs). + rpc DeleteTeamFolderTree(DeleteTeamFolderTreeRequest) + returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1beta1/{name=projects/*/locations/*/teamFolders/*}:deleteTree" + body: "*" + }; + option (google.api.method_signature) = "name,force"; + option (google.longrunning.operation_info) = { + response_type: "google.protobuf.Empty" + metadata_type: "DeleteFolderTreeMetadata" + }; + } + // Returns the contents of a given TeamFolder. rpc QueryTeamFolderContents(QueryTeamFolderContentsRequest) returns (QueryTeamFolderContentsResponse) { @@ -148,6 +171,21 @@ service Dataform { option (google.api.method_signature) = "name"; } + // Deletes a Folder with its contents (Folders, Repositories, Workspaces, + // ReleaseConfigs, and WorkflowConfigs). + rpc DeleteFolderTree(DeleteFolderTreeRequest) + returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1beta1/{name=projects/*/locations/*/folders/*}:deleteTree" + body: "*" + }; + option (google.api.method_signature) = "name,force"; + option (google.longrunning.operation_info) = { + response_type: "google.protobuf.Empty" + metadata_type: "DeleteFolderTreeMetadata" + }; + } + // Returns the contents of a given Folder. rpc QueryFolderContents(QueryFolderContentsRequest) returns (QueryFolderContentsResponse) { @@ -233,6 +271,20 @@ service Dataform { option (google.api.method_signature) = "name"; } + // Deletes a single repository asynchronously. + rpc DeleteRepositoryLongRunning(DeleteRepositoryLongRunningRequest) + returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1beta1/{name=projects/*/locations/*/repositories/*}:deleteLongRunning" + body: "*" + }; + option (google.api.method_signature) = "name,force"; + option (google.longrunning.operation_info) = { + response_type: "DeleteRepositoryLongRunningResponse" + metadata_type: "DeleteRepositoryLongRunningMetadata" + }; + } + // Moves a Repository to a new location. rpc MoveRepository(MoveRepositoryRequest) returns (google.longrunning.Operation) { @@ -758,6 +810,19 @@ service Dataform { } } +// Represents the level of detail to return for directory contents. +enum DirectoryContentsView { + // The default unset value. Defaults to DIRECTORY_CONTENTS_VIEW_BASIC. + DIRECTORY_CONTENTS_VIEW_UNSPECIFIED = 0; + + // Includes only the file or directory name. This is the default behavior. + DIRECTORY_CONTENTS_VIEW_BASIC = 1; + + // Includes all metadata for each file or directory. Currently not supported + // by CMEK-protected workspaces. + DIRECTORY_CONTENTS_VIEW_METADATA = 2; +} + // Describes encryption state of a resource. message DataEncryptionState { // Required. The KMS key version name with which data of a resource is @@ -817,8 +882,15 @@ message Repository { // Required. The Git remote's URL. string url = 1 [(google.api.field_behavior) = REQUIRED]; - // Required. The Git remote's default branch name. - string default_branch = 2 [(google.api.field_behavior) = REQUIRED]; + // Optional. The Git remote's default branch name. + // If not set, `main` will be used. + string default_branch = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Output only. The Git remote's effective default branch name. + // This is the default branch name of the Git remote if it is set, + // otherwise it is `main`. + string effective_default_branch = 9 + [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. The name of the Secret Manager secret version to use as an // authentication token for Git operations. Must be in the format @@ -834,6 +906,16 @@ message Repository { SshAuthenticationConfig ssh_authentication_config = 5 [(google.api.field_behavior) = OPTIONAL]; + // Optional. Resource name for the `GitRepositoryLink` used for machine + // credentials. Must be in the format + // `projects/*/locations/*/connections/*/gitRepositoryLinks/*` + optional string git_repository_link = 7 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { + type: "developerconnect.googleapis.com/GitRepositoryLink" + } + ]; + // Output only. Deprecated: The field does not contain any token status // information. Instead use // https://cloud.google.com/dataform/reference/rest/v1beta1/projects.locations.repositories/computeAccessTokenStatus @@ -1079,6 +1161,29 @@ message DeleteRepositoryRequest { bool force = 2 [(google.api.field_behavior) = OPTIONAL]; } +// `DeleteRepositoryLongRunning` response message. +message DeleteRepositoryLongRunningResponse {} + +// `DeleteRepositoryLongRunning` request message. +message DeleteRepositoryLongRunningRequest { + // Required. The repository's name. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "dataform.googleapis.com/Repository" + } + ]; + + // Optional. If set to true, child resources of this repository (compilation + // results and workflow invocations) will also be deleted. Otherwise, the + // request will only succeed if the repository has no child resources. + // + // **Note:** *This flag doesn't support deletion of workspaces, release + // configs or workflow configs. If any of such resources exists in the + // repository, the request will fail.* + bool force = 2 [(google.api.field_behavior) = OPTIONAL]; +} + // `CommitRepositoryChanges` request message. message CommitRepositoryChangesRequest { // Represents a single file operation to the repository. @@ -1282,6 +1387,9 @@ message ComputeRepositoryAccessTokenStatusResponse { // The token was used successfully to authenticate against the Git remote. VALID = 3; + + // The token is not accessible due to permission issues. + PERMISSION_DENIED = 4; } // Indicates the status of the Git access token. @@ -1641,6 +1749,12 @@ message QueryDirectoryContentsRequest { // `QueryDirectoryContents`, with the exception of `page_size`, must match the // call that provided the page token. string page_token = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Specifies the metadata to return for each directory entry. + // If unspecified, the default is `DIRECTORY_CONTENTS_VIEW_BASIC`. + // Currently the `DIRECTORY_CONTENTS_VIEW_METADATA` view is not supported by + // CMEK-protected workspaces. + DirectoryContentsView view = 5 [(google.api.field_behavior) = OPTIONAL]; } // `QueryDirectoryContents` response message. @@ -1657,12 +1771,28 @@ message QueryDirectoryContentsResponse { message DirectoryEntry { // The entry's contents. oneof entry { - // A file in the directory. + // A file in the directory. The path is returned including the full + // folder structure from the root. string file = 1; - // A child directory in the directory. + // A child directory in the directory. The path is returned including + // the full folder structure from the root. string directory = 2; } + + // Entry with metadata. + FilesystemEntryMetadata metadata = 3; +} + +// Represents metadata for a single entry in a filesystem. +message FilesystemEntryMetadata { + // Output only. Provides the size of the entry in bytes. For directories, this + // will be 0. + int64 size_bytes = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. Represents the time of the last modification of the entry. + google.protobuf.Timestamp update_time = 2 + [(google.api.field_behavior) = OUTPUT_ONLY]; } // Configuration containing file search request parameters. @@ -3118,9 +3248,10 @@ message WorkflowInvocationAction { // Output only. The code contents of a Notebook to be run. string contents = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; - // Output only. The ID of the Vertex job that executed the notebook in - // contents and also the ID used for the outputs created in Google Cloud - // Storage buckets. Only set once the job has started to run. + // Output only. The ID of the Gemini Enterprise Agent Platform job that + // executed the notebook in contents and also the ID used for the outputs + // created in Google Cloud Storage buckets. Only set once the job has + // started to run. string job_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } @@ -3371,8 +3502,8 @@ message Folder { // Optional. The containing Folder resource name. This should take // the format: projects/{project}/locations/{location}/folders/{folder}, // projects/{project}/locations/{location}/teamFolders/{teamFolder}, or just - // projects/{project}/locations/{location} if this is a root Folder. This - // field can only be updated through MoveFolder. + // "" if this is a root Folder. This field can only be updated through + // MoveFolder. string containing_folder = 3 [(google.api.field_behavior) = OPTIONAL]; // Output only. The resource name of the TeamFolder that this Folder is @@ -3415,9 +3546,11 @@ message CreateFolderRequest { // Required. The Folder to create. Folder folder = 2 [(google.api.field_behavior) = REQUIRED]; + // Deprecated: This field is not used. The resource name is generated + // automatically. // The ID to use for the Folder, which will become the final component of // the Folder's resource name. - string folder_id = 3; + string folder_id = 3 [deprecated = true]; } // `MoveFolder` request message. @@ -3466,9 +3599,91 @@ message DeleteFolderRequest { ]; } +// `DeleteFolderTree` request message. +message DeleteFolderTreeRequest { + // Required. The Folder's name. + // Format: projects/{project}/locations/{location}/folders/{folder} + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "dataform.googleapis.com/Folder" } + ]; + + // Optional. If `false` (default): The operation will fail if any + // Repository within the folder hierarchy has associated Release Configs or + // Workflow Configs. + // + // If `true`: The operation will attempt to delete everything, including any + // Release Configs and Workflow Configs linked to Repositories within the + // folder hierarchy. This permanently removes schedules and resources. + bool force = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// `DeleteTeamFolderTree` request message. +message DeleteTeamFolderTreeRequest { + // Required. The TeamFolder's name. + // Format: projects/{project}/locations/{location}/teamFolders/{team_folder} + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "dataform.googleapis.com/TeamFolder" + } + ]; + + // Optional. If `false` (default): The operation will fail if any + // Repository within the folder hierarchy has associated Release Configs or + // Workflow Configs. + // + // If `true`: The operation will attempt to delete everything, including any + // Release Configs and Workflow Configs linked to Repositories within the + // folder hierarchy. This permanently removes schedules and resources. + bool force = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Contains metadata about the progress of the DeleteFolderTree Long-running +// operations. +message DeleteFolderTreeMetadata { + // Different states of the DeleteFolderTree operation. + enum State { + // The state is unspecified. + STATE_UNSPECIFIED = 0; + + // The operation was initialized and recorded by the server, but not yet + // started. + INITIALIZED = 1; + + // The operation is in progress. + IN_PROGRESS = 2; + + // The operation has completed successfully. + SUCCEEDED = 3; + + // The operation has failed. + FAILED = 4; + } + + // Output only. The time the operation was created. + google.protobuf.Timestamp create_time = 1 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The time the operation finished running. + google.protobuf.Timestamp end_time = 2 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. Resource name of the target of the operation. + // Format: projects/{project}/locations/{location}/folders/{folder} or + // projects/{project}/locations/{location}/teamFolders/{team_folder} + string target = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The state of the operation. + State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. Percent complete of the operation [0, 100]. + int32 percent_complete = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; +} + // `QueryFolderContents` request message. message QueryFolderContentsRequest { - // Required. Name of the folder whose contents to list. + // Required. Resource name of the Folder to list contents for. // Format: projects/*/locations/*/folders/* string folder = 1 [ (google.api.field_behavior) = REQUIRED, @@ -3493,15 +3708,17 @@ message QueryFolderContentsRequest { // order. Supported keywords: display_name (default), create_time, // last_modified_time. // Examples: - // - `orderBy="display_name"` - // - `orderBy="display_name desc"` + // + // * `orderBy="display_name"` + // * `orderBy="display_name desc"` string order_by = 4 [(google.api.field_behavior) = OPTIONAL]; // Optional. Optional filtering for the returned list. Filtering is currently // only supported on the `display_name` field. // // Example: - // - `filter="display_name="MyFolder""` + // + // * `filter="display_name="MyFolder""` string filter = 5 [(google.api.field_behavior) = OPTIONAL]; } @@ -3529,7 +3746,7 @@ message QueryFolderContentsResponse { // `QueryUserRootContents` request message. message QueryUserRootContentsRequest { - // Required. Location of the user root folder whose contents to list. + // Required. Location of the user root folder to list contents for. // Format: projects/*/locations/* string location = 1 [ (google.api.field_behavior) = REQUIRED, @@ -3555,15 +3772,17 @@ message QueryUserRootContentsRequest { // Will order Folders before Repositories, and then by `order_by` in ascending // order. Supported keywords: display_name (default), created_at, // last_modified_at. Examples: - // - `orderBy="display_name"` - // - `orderBy="display_name desc"` + // + // * `orderBy="display_name"` + // * `orderBy="display_name desc"` string order_by = 4 [(google.api.field_behavior) = OPTIONAL]; // Optional. Optional filtering for the returned list. Filtering is currently // only supported on the `display_name` field. // // Example: - // - `filter="display_name="MyFolder""` + // + // * `filter="display_name="MyFolder""` string filter = 5 [(google.api.field_behavior) = OPTIONAL]; } @@ -3639,9 +3858,11 @@ message CreateTeamFolderRequest { // Required. The TeamFolder to create. TeamFolder team_folder = 2 [(google.api.field_behavior) = REQUIRED]; + // Deprecated: This field is not used. The resource name is generated + // automatically. // The ID to use for the TeamFolder, which will become the final component of // the TeamFolder's resource name. - string team_folder_id = 3; + string team_folder_id = 3 [deprecated = true]; } // `GetTeamFolder` request message. @@ -3679,7 +3900,7 @@ message DeleteTeamFolderRequest { // `QueryTeamFolderContents` request message. message QueryTeamFolderContentsRequest { - // Required. Name of the team_folder whose contents to list. + // Required. Resource name of the TeamFolder to list contents for. // Format: `projects/*/locations/*/teamFolders/*`. string team_folder = 1 [ (google.api.field_behavior) = REQUIRED, @@ -3706,15 +3927,17 @@ message QueryTeamFolderContentsRequest { // order. Supported keywords: `display_name` (default), `create_time`, // last_modified_time. // Examples: - // - `orderBy="display_name"` - // - `orderBy="display_name desc"` + // + // * `orderBy="display_name"` + // * `orderBy="display_name desc"` string order_by = 4 [(google.api.field_behavior) = OPTIONAL]; // Optional. Optional filtering for the returned list. Filtering is currently // only supported on the `display_name` field. // // Example: - // - `filter="display_name="MyFolder""` + // + // * `filter="display_name="MyFolder""` string filter = 5 [(google.api.field_behavior) = OPTIONAL]; } @@ -3751,9 +3974,9 @@ message SearchTeamFoldersRequest { } ]; - // Optional. Maximum number of TeamFolders to return. The server may return - // fewer items than requested. If unspecified, the server will pick an - // appropriate default. + // Optional. Maximum number of `TeamFolders` to return. The server may return + // fewer items than requested. If unspecified, the server will pick a default + // of `page_size` = 50. int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. Page token received from a previous `SearchTeamFolders` call. @@ -3767,15 +3990,17 @@ message SearchTeamFoldersRequest { // Optional. Field to additionally sort results by. // Supported keywords: `display_name` (default), `create_time`, // `last_modified_time`. Examples: - // - `orderBy="display_name"` - // - `orderBy="display_name desc"` + // + // * `orderBy="display_name"` + // * `orderBy="display_name desc"` string order_by = 4 [(google.api.field_behavior) = OPTIONAL]; // Optional. Optional filtering for the returned list. Filtering is currently // only supported on the `display_name` field. // // Example: - // - `filter="display_name="MyFolder""` + // + // * `filter="display_name="MyFolder""` string filter = 5 [(google.api.field_behavior) = OPTIONAL]; } @@ -3875,3 +4100,53 @@ message MoveRepositoryMetadata { // Percent complete of the move [0, 100]. int32 percent_complete = 5; } + +// Represents metadata about the progress of the DeleteRepository long-running +// operation. +message DeleteRepositoryLongRunningMetadata { + // Different states of the DeleteRepositoryLongRunning operation. + enum State { + // The state is unspecified. + STATE_UNSPECIFIED = 0; + + // The operation is running. + RUNNING = 1; + + // The operation has completed successfully. + SUCCEEDED = 2; + + // The operation has failed. + FAILED = 3; + } + + // Output only. The time the operation was created. + google.protobuf.Timestamp create_time = 1 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The time the operation finished running. + google.protobuf.Timestamp end_time = 2 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. Server-defined resource path for the target of the operation. + // Format: projects/{project}/locations/{location}/repositories/{repository} + string target = 3 [ + (google.api.field_behavior) = OUTPUT_ONLY, + (google.api.resource_reference) = { + type: "dataform.googleapis.com/Repository" + } + ]; + + // Output only. The state of the operation. + State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. Percent complete of the operation [0, 100]. + int32 percent_complete = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The total number of child resources (Compilation Results, + // Workflow Executions) that will be deleted. + int64 child_resources_count = 6 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The remaining number of child resources to be deleted. + int64 remaining_child_resources_count = 7 + [(google.api.field_behavior) = OUTPUT_ONLY]; +} diff --git a/google/cloud/dataform/v1beta1/dataform_grpc_service_config.json b/google/cloud/dataform/v1beta1/dataform_grpc_service_config.json index 8b83947daf..94324b3a4e 100644 --- a/google/cloud/dataform/v1beta1/dataform_grpc_service_config.json +++ b/google/cloud/dataform/v1beta1/dataform_grpc_service_config.json @@ -1,7 +1,9 @@ { "methodConfig": [ { - "name": [{ "service": "google.cloud.dataform.v1beta1.DataformService" }], + "name": [ + { "service": "google.cloud.dataform.v1beta1.DataformService" } + ], "timeout": "60s", "retryPolicy": { "maxAttempts": 5, diff --git a/google/cloud/dataform/v1beta1/dataform_v1beta1.yaml b/google/cloud/dataform/v1beta1/dataform_v1beta1.yaml index 1ddb9edd80..90a8841825 100644 --- a/google/cloud/dataform/v1beta1/dataform_v1beta1.yaml +++ b/google/cloud/dataform/v1beta1/dataform_v1beta1.yaml @@ -20,13 +20,21 @@ documentation: - selector: google.cloud.location.Locations.ListLocations description: |- Lists information about the supported locations for this service. - This method can be called in two ways: - * **List all public locations:** Use the path `GET /v1/locations`. - * **List project-visible locations:** Use the path - `GET /v1/projects/{project_id}/locations`. This may include public - locations as well as private or other locations specifically visible - to the project. + This method lists locations based on the resource scope provided in + the [ListLocationsRequest.name][google.cloud.location.ListLocationsRequest.name] field: * + **Global locations**: If `name` is empty, the method lists the + public locations available to all projects. * **Project-specific + locations**: If `name` follows the format + `projects/{project}`, the method lists locations visible to that + specific project. This includes public, private, or other + project-specific locations enabled for the project. + + For gRPC and client library implementations, the resource name is + passed as the `name` field. For direct service calls, the resource + name is + incorporated into the request path based on the specific service + implementation and version. - selector: google.iam.v1.IAMPolicy.GetIamPolicy description: |-