diff --git a/google/storagetransfer/v1/BUILD.bazel b/google/storagetransfer/v1/BUILD.bazel new file mode 100644 index 0000000000..4433f7293e --- /dev/null +++ b/google/storagetransfer/v1/BUILD.bazel @@ -0,0 +1,350 @@ +# This file was automatically generated by BuildFileGenerator +# https://github.com/googleapis/rules_gapic/tree/master/bazel + +# Most of the manual changes to this file will be overwritten. +# It's **only** allowed to change the following rule attribute values: +# - names of *_gapic_assembly_* rules +# - certain parameters of *_gapic_library rules, including but not limited to: +# * extra_protoc_parameters +# * extra_protoc_file_parameters +# The complete list of preserved parameters can be found in the source code. + +# This is an API workspace, having public visibility by default makes perfect sense. +package(default_visibility = ["//visibility:public"]) + +############################################################################## +# Common +############################################################################## +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@com_google_googleapis_imports//:imports.bzl", "proto_library_with_info") + +proto_library( + name = "storagetransfer_proto", + srcs = [ + "transfer.proto", + "transfer_types.proto", + ], + deps = [ + "//google/api:annotations_proto", + "//google/api:client_proto", + "//google/api:field_behavior_proto", + "//google/longrunning:operations_proto", + "//google/rpc:code_proto", + "//google/type:date_proto", + "//google/type:timeofday_proto", + "@com_google_protobuf//:any_proto", + "@com_google_protobuf//:duration_proto", + "@com_google_protobuf//:empty_proto", + "@com_google_protobuf//:field_mask_proto", + "@com_google_protobuf//:timestamp_proto", + ], +) + +proto_library_with_info( + name = "storagetransfer_proto_with_info", + deps = [ + ":storagetransfer_proto", + "//google/cloud:common_resources_proto", + ], +) + +############################################################################## +# Java +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "java_gapic_assembly_gradle_pkg", + "java_gapic_library", + "java_gapic_test", + "java_grpc_library", + "java_proto_library", +) + +java_proto_library( + name = "storagetransfer_java_proto", + deps = [":storagetransfer_proto"], +) + +java_grpc_library( + name = "storagetransfer_java_grpc", + srcs = [":storagetransfer_proto"], + deps = [":storagetransfer_java_proto"], +) + +java_gapic_library( + name = "storagetransfer_java_gapic", + srcs = [":storagetransfer_proto_with_info"], + grpc_service_config = "storagetransfer_grpc_service_config.json", + test_deps = [ + ":storagetransfer_java_grpc", + ], + deps = [ + ":storagetransfer_java_proto", + ], +) + +java_gapic_test( + name = "storagetransfer_java_gapic_test_suite", + test_classes = [ + "com.google.storagetransfer.v1.proto.StorageTransferServiceClientTest", + ], + runtime_deps = [":storagetransfer_java_gapic_test"], +) + +# Open Source Packages +java_gapic_assembly_gradle_pkg( + name = "google-cloud-storagetransfer-v1-java", + deps = [ + ":storagetransfer_java_gapic", + ":storagetransfer_java_grpc", + ":storagetransfer_java_proto", + ":storagetransfer_proto", + ], +) + +############################################################################## +# Go +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "go_gapic_assembly_pkg", + "go_gapic_library", + "go_proto_library", + "go_test", +) + +go_proto_library( + name = "storagetransfer_go_proto", + compilers = ["@io_bazel_rules_go//proto:go_grpc"], + importpath = "google.golang.org/genproto/googleapis/storagetransfer/v1", + protos = [":storagetransfer_proto"], + deps = [ + "//google/api:annotations_go_proto", + "//google/longrunning:longrunning_go_proto", + "//google/rpc:code_go_proto", + "//google/type:date_go_proto", + "//google/type:timeofday_go_proto", + ], +) + +go_gapic_library( + name = "storagetransfer_go_gapic", + srcs = [":storagetransfer_proto_with_info"], + grpc_service_config = "storagetransfer_grpc_service_config.json", + importpath = "cloud.google.com/go/storagetransfer/apiv1;storagetransfer", + metadata = True, + service_yaml = "storagetransfer_v1.yaml", + deps = [ + ":storagetransfer_go_proto", + "//google/longrunning:longrunning_go_proto", + "@com_google_cloud_go//longrunning:go_default_library", + "@com_google_cloud_go//longrunning/autogen:go_default_library", + "@io_bazel_rules_go//proto/wkt:any_go_proto", + "@io_bazel_rules_go//proto/wkt:duration_go_proto", + ], +) + +go_test( + name = "storagetransfer_go_gapic_test", + srcs = [":storagetransfer_go_gapic_srcjar_test"], + embed = [":storagetransfer_go_gapic"], + importpath = "cloud.google.com/go/storagetransfer/apiv1", +) + +# Open Source Packages +go_gapic_assembly_pkg( + name = "gapi-cloud-storagetransfer-v1-go", + deps = [ + ":storagetransfer_go_gapic", + ":storagetransfer_go_gapic_srcjar-metadata.srcjar", + ":storagetransfer_go_gapic_srcjar-test.srcjar", + ":storagetransfer_go_proto", + ], +) + +############################################################################## +# Python +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "py_gapic_assembly_pkg", + "py_gapic_library", +) + +py_gapic_library( + name = "storagetransfer_py_gapic", + srcs = [":storagetransfer_proto"], + grpc_service_config = "storagetransfer_grpc_service_config.json", +) + +# Open Source Packages +py_gapic_assembly_pkg( + name = "storagetransfer-v1-py", + deps = [ + ":storagetransfer_py_gapic", + ], +) + +############################################################################## +# PHP +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "php_gapic_assembly_pkg", + "php_gapic_library", + "php_grpc_library", + "php_proto_library", +) + +php_proto_library( + name = "storagetransfer_php_proto", + deps = [":storagetransfer_proto"], +) + +php_grpc_library( + name = "storagetransfer_php_grpc", + srcs = [":storagetransfer_proto"], + deps = [":storagetransfer_php_proto"], +) + +php_gapic_library( + name = "storagetransfer_php_gapic", + srcs = [":storagetransfer_proto_with_info"], + grpc_service_config = "storagetransfer_grpc_service_config.json", + service_yaml = "storagetransfer_v1.yaml", + deps = [ + ":storagetransfer_php_grpc", + ":storagetransfer_php_proto", + ], +) + +# Open Source Packages +php_gapic_assembly_pkg( + name = "google-cloud-storagetransfer-v1-php", + deps = [ + ":storagetransfer_php_gapic", + ":storagetransfer_php_grpc", + ":storagetransfer_php_proto", + ], +) + +############################################################################## +# Node.js +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "nodejs_gapic_assembly_pkg", + "nodejs_gapic_library", +) + +nodejs_gapic_library( + name = "storagetransfer_nodejs_gapic", + package_name = "@google-cloud/storagetransfer", + src = ":storagetransfer_proto_with_info", + extra_protoc_parameters = ["metadata"], + grpc_service_config = "storagetransfer_grpc_service_config.json", + package = "google.storagetransfer.v1", + service_yaml = "storagetransfer_v1.yaml", + deps = [], +) + +nodejs_gapic_assembly_pkg( + name = "storagetransfer-v1-nodejs", + deps = [ + ":storagetransfer_nodejs_gapic", + ":storagetransfer_proto", + ], +) + +############################################################################## +# Ruby +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "ruby_cloud_gapic_library", + "ruby_gapic_assembly_pkg", + "ruby_grpc_library", + "ruby_proto_library", +) + +ruby_proto_library( + name = "storagetransfer_ruby_proto", + deps = [":storagetransfer_proto"], +) + +ruby_grpc_library( + name = "storagetransfer_ruby_grpc", + srcs = [":storagetransfer_proto"], + deps = [":storagetransfer_ruby_proto"], +) + +ruby_cloud_gapic_library( + name = "storagetransfer_ruby_gapic", + srcs = [":storagetransfer_proto_with_info"], + extra_protoc_parameters = [ + "ruby-cloud-gem-name=google-cloud-storagetransfer-v1", + ], + grpc_service_config = "storagetransfer_grpc_service_config.json", + deps = [ + ":storagetransfer_ruby_grpc", + ":storagetransfer_ruby_proto", + ], +) + +# Open Source Packages +ruby_gapic_assembly_pkg( + name = "google-cloud-storagetransfer-v1-ruby", + deps = [ + ":storagetransfer_ruby_gapic", + ":storagetransfer_ruby_grpc", + ":storagetransfer_ruby_proto", + ], +) + +############################################################################## +# C# +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "csharp_gapic_assembly_pkg", + "csharp_gapic_library", + "csharp_grpc_library", + "csharp_proto_library", +) + +csharp_proto_library( + name = "storagetransfer_csharp_proto", + deps = [":storagetransfer_proto"], +) + +csharp_grpc_library( + name = "storagetransfer_csharp_grpc", + srcs = [":storagetransfer_proto"], + deps = [":storagetransfer_csharp_proto"], +) + +csharp_gapic_library( + name = "storagetransfer_csharp_gapic", + srcs = [":storagetransfer_proto_with_info"], + common_resources_config = "@gax_dotnet//:Google.Api.Gax/ResourceNames/CommonResourcesConfig.json", + grpc_service_config = "storagetransfer_grpc_service_config.json", + deps = [ + ":storagetransfer_csharp_grpc", + ":storagetransfer_csharp_proto", + ], +) + +# Open Source Packages +csharp_gapic_assembly_pkg( + name = "google-cloud-storagetransfer-v1-csharp", + deps = [ + ":storagetransfer_csharp_gapic", + ":storagetransfer_csharp_grpc", + ":storagetransfer_csharp_proto", + ], +) + +############################################################################## +# C++ +############################################################################## +# Put your C++ rules here diff --git a/google/storagetransfer/v1/storagetransfer_grpc_service_config.json b/google/storagetransfer/v1/storagetransfer_grpc_service_config.json new file mode 100644 index 0000000000..b29bd34cd4 --- /dev/null +++ b/google/storagetransfer/v1/storagetransfer_grpc_service_config.json @@ -0,0 +1,12 @@ +{ + "methodConfig": [ + { + "name": [ + { + "service": "google.storagetransfer.v1.StorageTransferService" + } + ], + "timeout": "60s" + } + ] +} diff --git a/google/storagetransfer/v1/storagetransfer_v1.yaml b/google/storagetransfer/v1/storagetransfer_v1.yaml new file mode 100644 index 0000000000..aa2337eb97 --- /dev/null +++ b/google/storagetransfer/v1/storagetransfer_v1.yaml @@ -0,0 +1,80 @@ +type: google.api.Service +config_version: 3 +name: storagetransfer.googleapis.com +title: Storage Transfer API + +apis: +- name: google.storagetransfer.v1.StorageTransferService + +types: +- name: google.storagetransfer.v1.RunTransferJobMetadata +- name: google.storagetransfer.v1.RunTransferJobResponse +- name: google.storagetransfer.v1.TransferOperation + +documentation: + summary: |- + Transfers data from external data sources to a Google Cloud Storage bucket + or between Google Cloud Storage buckets. + rules: + - selector: google.longrunning.Operations.CancelOperation + description: |- + Cancels a transfer. Use + the [transferOperations.get][google.longrunning.Operations.GetOperation] + method to check if the cancellation succeeded or if the operation + completed despite the `cancel` request. + + When you cancel an operation, the currently running transfer is + interrupted. For recurring transfer jobs, the next instance of the + transfer job will still run. For example, if your job is configured + to run every day at 1pm and you cancel Monday's operation at 1:05pm, + Monday's transfer + will stop. However, a transfer job will still be attempted on Tuesday. + + This applies only to currently running operations. If an operation is + not currently running, `cancel` does nothing. + + + + When you cancel a job, the next job computes a delta of files and may + repair any inconsistent state. For instance, if you run a job every + day, and today's job found 10 new files and transferred five files + before you canceled the job, tomorrow's transfer operation will + compute a new delta with the five files that were not copied today + plus any new files discovered tomorrow. + + - selector: google.longrunning.Operations.ListOperations + description: |- + Lists transfer operations. Operations are ordered by their creation + time in reverse chronological order. + +backend: + rules: + - selector: 'google.longrunning.Operations.*' + deadline: 30.0 + - selector: 'google.storagetransfer.v1.StorageTransferService.*' + deadline: 30.0 + +http: + rules: + - selector: google.longrunning.Operations.CancelOperation + post: '/v1/{name=transferOperations/**}:cancel' + body: '*' + - selector: google.longrunning.Operations.GetOperation + get: '/v1/{name=transferOperations/**}' + - selector: google.longrunning.Operations.ListOperations + get: '/v1/{name=transferOperations}' + +authentication: + rules: + - selector: 'google.longrunning.Operations.*' + oauth: + canonical_scopes: |- + https://www.googleapis.com/auth/cloud-platform + - selector: 'google.storagetransfer.v1.StorageTransferService.*' + oauth: + canonical_scopes: |- + https://www.googleapis.com/auth/cloud-platform diff --git a/google/storagetransfer/v1/transfer.proto b/google/storagetransfer/v1/transfer.proto index e2a40b9235..d282628132 100644 --- a/google/storagetransfer/v1/transfer.proto +++ b/google/storagetransfer/v1/transfer.proto @@ -1,4 +1,4 @@ -// Copyright 2017 Google Inc. +// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,6 +17,10 @@ syntax = "proto3"; package google.storagetransfer.v1; import "google/api/annotations.proto"; +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/longrunning/operations.proto"; +import "google/protobuf/duration.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; import "google/storagetransfer/v1/transfer_types.proto"; @@ -27,10 +31,16 @@ option go_package = "google.golang.org/genproto/googleapis/storagetransfer/v1;st option java_outer_classname = "TransferProto"; option java_package = "com.google.storagetransfer.v1.proto"; option php_namespace = "Google\\Cloud\\StorageTransfer\\V1"; +option ruby_package = "Google::Cloud::StorageTransfer::V1"; +// Storage Transfer Service and its protos. // Transfers data between between Google Cloud Storage buckets or from a data // source external to Google to a Cloud Storage bucket. service StorageTransferService { + option (google.api.default_host) = "storagetransfer.googleapis.com"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/cloud-platform"; + // Returns the Google service account that is used by Storage Transfer // Service to access buckets in the project where transfers // run or in other projects. Each Google service account is associated @@ -55,8 +65,13 @@ service StorageTransferService { } // Updates a transfer job. Updating a job's transfer spec does not affect - // transfer operations that are running already. Updating the scheduling - // of a job is not allowed. + // transfer operations that are running already. + // + // **Note:** The job's [status][google.storagetransfer.v1.TransferJob.status] + // field can be modified using this RPC (for example, to set a job's status to + // [DELETED][google.storagetransfer.v1.TransferJob.Status.DELETED], + // [DISABLED][google.storagetransfer.v1.TransferJob.Status.DISABLED], or + // [ENABLED][google.storagetransfer.v1.TransferJob.Status.ENABLED]). rpc UpdateTransferJob(UpdateTransferJobRequest) returns (TransferJob) { option (google.api.http) = { patch: "/v1/{job_name=transferJobs/**}" @@ -96,72 +111,98 @@ service StorageTransferService { body: "*" }; } + + // Attempts to start a new TransferOperation for the current TransferJob. A + // TransferJob has a maximum of one active TransferOperation. If this method + // is called while a TransferOperation is active, an error wil be returned. + rpc RunTransferJob(RunTransferJobRequest) + returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1/{job_name=transferJobs/**}:run" + body: "*" + }; + option (google.longrunning.operation_info) = { + response_type: "google.protobuf.Empty" + metadata_type: "TransferOperation" + }; + } } // Request passed to GetGoogleServiceAccount. message GetGoogleServiceAccountRequest { - // The ID of the Google Cloud Platform Console project that the Google service - // account is associated with. - // Required. - string project_id = 1; + // Required. The ID of the Google Cloud Platform Console project that the + // Google service account is associated with. + string project_id = 1 [(google.api.field_behavior) = REQUIRED]; } // Request passed to CreateTransferJob. message CreateTransferJobRequest { - // The job to create. - // Required. - TransferJob transfer_job = 1; + // Required. The job to create. + TransferJob transfer_job = 1 [(google.api.field_behavior) = REQUIRED]; } // Request passed to UpdateTransferJob. message UpdateTransferJobRequest { - // The name of job to update. - // Required. - string job_name = 1; + // Required. The name of job to update. + string job_name = 1 [(google.api.field_behavior) = REQUIRED]; - // The ID of the Google Cloud Platform Console project that owns the job. - // Required. - string project_id = 2; + // Required. The ID of the Google Cloud Platform Console project that owns the + // job. + string project_id = 2 [(google.api.field_behavior) = REQUIRED]; - // The job to update. `transferJob` is expected to specify only three fields: - // `description`, `transferSpec`, and `status`. An UpdateTransferJobRequest - // that specifies other fields will be rejected with an error - // `INVALID_ARGUMENT`. - // Required. - TransferJob transfer_job = 3; + // Required. The job to update. `transferJob` is expected to specify only + // four fields: + // [description][google.storagetransfer.v1.TransferJob.description], + // [transfer_spec][google.storagetransfer.v1.TransferJob.transfer_spec], + // [notification_config][google.storagetransfer.v1.TransferJob.notification_config], + // and [status][google.storagetransfer.v1.TransferJob.status]. An + // `UpdateTransferJobRequest` that specifies other fields are rejected with + // the error [INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. Updating a + // job status to + // [DELETED][google.storagetransfer.v1.TransferJob.Status.DELETED] requires + // `storagetransfer.jobs.delete` permissions. + TransferJob transfer_job = 3 [(google.api.field_behavior) = REQUIRED]; // The field mask of the fields in `transferJob` that are to be updated in // this request. Fields in `transferJob` that can be updated are: - // `description`, `transferSpec`, and `status`. To update the `transferSpec` - // of the job, a complete transfer specification has to be provided. An - // incomplete specification which misses any required fields will be rejected - // with the error `INVALID_ARGUMENT`. + // [description][google.storagetransfer.v1.TransferJob.description], + // [transfer_spec][google.storagetransfer.v1.TransferJob.transfer_spec], + // [notification_config][google.storagetransfer.v1.TransferJob.notification_config], + // and [status][google.storagetransfer.v1.TransferJob.status]. To update the + // `transfer_spec` of the job, a complete transfer specification must be + // provided. An incomplete specification missing any required fields is + // rejected with the error + // [INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. google.protobuf.FieldMask update_transfer_job_field_mask = 4; } // Request passed to GetTransferJob. message GetTransferJobRequest { + // Required. // The job to get. - // Required. - string job_name = 1; + string job_name = 1 [(google.api.field_behavior) = REQUIRED]; - // The ID of the Google Cloud Platform Console project that owns the job. - // Required. - string project_id = 2; + // Required. The ID of the Google Cloud Platform Console project that owns the + // job. + string project_id = 2 [(google.api.field_behavior) = REQUIRED]; } -// `project_id`, `job_names`, and `job_statuses` are query parameters that can +// `projectId`, `jobNames`, and `jobStatuses` are query parameters that can // be specified when listing transfer jobs. message ListTransferJobsRequest { - // A list of query parameters specified as JSON text in the form of - // {"project_id":"my_project_id", - // "job_names":["jobid1","jobid2",...], - // "job_statuses":["status1","status2",...]}. - // Since `job_names` and `job_statuses` support multiple values, their values - // must be specified with array notation. `project_id` is required. - // `job_names` and `job_statuses` are optional. The valid values for - // `job_statuses` are case-insensitive: `ENABLED`, `DISABLED`, and `DELETED`. - string filter = 1; + // Required. A list of query parameters specified as JSON text in the form of: + // `{"projectId":"my_project_id", + // "jobNames":["jobid1","jobid2",...], + // "jobStatuses":["status1","status2",...]}` + // + // Since `jobNames` and `jobStatuses` support multiple values, their values + // must be specified with array notation. `projectId` is required. + // `jobNames` and `jobStatuses` are optional. The valid values for + // `jobStatuses` are case-insensitive: + // [ENABLED][google.storagetransfer.v1.TransferJob.Status.ENABLED], + // [DISABLED][google.storagetransfer.v1.TransferJob.Status.DISABLED], and + // [DELETED][google.storagetransfer.v1.TransferJob.Status.DELETED]. + string filter = 1 [(google.api.field_behavior) = REQUIRED]; // The list page size. The max allowed value is 256. int32 page_size = 4; @@ -181,14 +222,22 @@ message ListTransferJobsResponse { // Request passed to PauseTransferOperation. message PauseTransferOperationRequest { - // The name of the transfer operation. - // Required. - string name = 1; + // Required. The name of the transfer operation. + string name = 1 [(google.api.field_behavior) = REQUIRED]; } // Request passed to ResumeTransferOperation. message ResumeTransferOperationRequest { - // The name of the transfer operation. - // Required. - string name = 1; + // Required. The name of the transfer operation. + string name = 1 [(google.api.field_behavior) = REQUIRED]; +} + +// Request passed to RunTransferJob. +message RunTransferJobRequest { + // Required. The name of the transfer job. + string job_name = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. The ID of the Google Cloud Platform Console project that owns the + // transfer job. + string project_id = 2 [(google.api.field_behavior) = REQUIRED]; } diff --git a/google/storagetransfer/v1/transfer_types.proto b/google/storagetransfer/v1/transfer_types.proto index 1495e42ffe..6301c57eb2 100644 --- a/google/storagetransfer/v1/transfer_types.proto +++ b/google/storagetransfer/v1/transfer_types.proto @@ -1,4 +1,4 @@ -// Copyright 2017 Google Inc. +// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ syntax = "proto3"; package google.storagetransfer.v1; import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/code.proto"; @@ -29,127 +31,267 @@ option go_package = "google.golang.org/genproto/googleapis/storagetransfer/v1;st option java_outer_classname = "TransferTypes"; option java_package = "com.google.storagetransfer.v1.proto"; option php_namespace = "Google\\Cloud\\StorageTransfer\\V1"; +option ruby_package = "Google::Cloud::StorageTransfer::V1"; // Google service account message GoogleServiceAccount { - // Required. + // Email address of the service account. string account_email = 1; + + // Unique identifier for the service account. + string subject_id = 2; } // AWS access key (see // [AWS Security -// Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html)). +// Credentials](https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html)). +// +// For information on our data retention policy for user credentials, see +// [User credentials](/storage-transfer/docs/data-retention#user-credentials). message AwsAccessKey { - // AWS access key ID. - // Required. - string access_key_id = 1; + // Required. AWS access key ID. + string access_key_id = 1 [(google.api.field_behavior) = REQUIRED]; - // AWS secret access key. This field is not returned in RPC responses. - // Required. - string secret_access_key = 2; + // Required. AWS secret access key. This field is not returned in RPC + // responses. + string secret_access_key = 2 [(google.api.field_behavior) = REQUIRED]; } -// Conditions that determine which objects will be transferred. +// Azure credentials +// +// For information on our data retention policy for user credentials, see +// [User credentials](/storage-transfer/docs/data-retention#user-credentials). +message AzureCredentials { + // Required. Azure shared access signature (SAS). + // + // + // + // For more information about SAS, see + // [Grant limited access to Azure Storage resources using shared access + // signatures + // (SAS)](https://docs.microsoft.com/en-us/azure/storage/common/storage-sas-overview). + string sas_token = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Conditions that determine which objects will be transferred. Applies only +// to Cloud Data Sources such as S3, Azure, and Cloud Storage. +// +// The "last modification time" refers to the time of the +// last change to the object's content or metadata — specifically, this is +// the `updated` property of Cloud Storage objects, the `LastModified` field +// of S3 objects, and the `Last-Modified` header of Azure blobs. message ObjectConditions { - // If unspecified, `minTimeElapsedSinceLastModification` takes a zero value - // and `maxTimeElapsedSinceLastModification` takes the maximum possible - // value of Duration. Objects that satisfy the object conditions - // must either have a `lastModificationTime` greater or equal to - // `NOW` - `maxTimeElapsedSinceLastModification` and less than - // `NOW` - `minTimeElapsedSinceLastModification`, or not have a - // `lastModificationTime`. + // If specified, only objects with a "last modification time" before + // `NOW` - `min_time_elapsed_since_last_modification` and objects that don't + // have a "last modification time" are transferred. + // + // For each [TransferOperation][google.storagetransfer.v1.TransferOperation] + // started by this [TransferJob][google.storagetransfer.v1.TransferJob], `NOW` + // refers to the [start_time] + // [google.storagetransfer.v1.TransferOperation.start_time] of the + // `TransferOperation`. google.protobuf.Duration min_time_elapsed_since_last_modification = 1; - // `maxTimeElapsedSinceLastModification` is the complement to - // `minTimeElapsedSinceLastModification`. + // If specified, only objects with a "last modification time" on or after + // `NOW` - `max_time_elapsed_since_last_modification` and objects that don't + // have a "last modification time" are transferred. + // + // For each [TransferOperation][google.storagetransfer.v1.TransferOperation] + // started by this [TransferJob][google.storagetransfer.v1.TransferJob], + // `NOW` refers to the [start_time] + // [google.storagetransfer.v1.TransferOperation.start_time] of the + // `TransferOperation`. google.protobuf.Duration max_time_elapsed_since_last_modification = 2; - // If `includePrefixes` is specified, objects that satisfy the object - // conditions must have names that start with one of the `includePrefixes` - // and that do not start with any of the `excludePrefixes`. If - // `includePrefixes` is not specified, all objects except those that have - // names starting with one of the `excludePrefixes` must satisfy the object - // conditions. + // If you specify `include_prefixes`, Storage Transfer Service uses the items + // in the `include_prefixes` array to determine which objects to include in a + // transfer. Objects must start with one of the matching `include_prefixes` + // for inclusion in the transfer. If [exclude_prefixes] + // [google.storagetransfer.v1.ObjectConditions.exclude_prefixes] is specified, + // objects must not start with any of the `exclude_prefixes` specified for + // inclusion in the transfer. // - // Requirements: + // The following are requirements of `include_prefixes`: // - // * Each include-prefix and exclude-prefix can contain any sequence of - // Unicode characters, of max length 1024 bytes when UTF8-encoded, and - // must not contain Carriage Return or Line Feed characters. Wildcard - // matching and regular expression matching are not supported. + // * Each include-prefix can contain any sequence of Unicode characters, to + // a max length of 1024 bytes when UTF8-encoded, and must not contain + // Carriage Return or Line Feed characters. Wildcard matching and regular + // expression matching are not supported. // - // * Each include-prefix and exclude-prefix must omit the leading slash. - // For example, to include the `requests.gz` object in a transfer from - // `s3://my-aws-bucket/logs/y=2015/requests.gz`, specify the include - // prefix as `logs/y=2015/requests.gz`. + // * Each include-prefix must omit the leading slash. For example, to + // include the object `s3://my-aws-bucket/logs/y=2015/requests.gz`, + // specify the include-prefix as `logs/y=2015/requests.gz`. // - // * None of the include-prefix or the exclude-prefix values can be empty, - // if specified. + // * None of the include-prefix values can be empty, if specified. // // * Each include-prefix must include a distinct portion of the object - // namespace, i.e., no include-prefix may be a prefix of another + // namespace. No include-prefix may be a prefix of another // include-prefix. // - // * Each exclude-prefix must exclude a distinct portion of the object - // namespace, i.e., no exclude-prefix may be a prefix of another - // exclude-prefix. + // The max size of `include_prefixes` is 1000. // - // * If `includePrefixes` is specified, then each exclude-prefix must start - // with the value of a path explicitly included by `includePrefixes`. - // - // The max size of `includePrefixes` is 1000. + // For more information, see [Filtering objects from + // transfers](/storage-transfer/docs/filtering-objects-from-transfers). repeated string include_prefixes = 3; - // `excludePrefixes` must follow the requirements described for - // `includePrefixes`. + // If you specify `exclude_prefixes`, Storage Transfer Service uses the items + // in the `exclude_prefixes` array to determine which objects to exclude from + // a transfer. Objects must not start with one of the matching + // `exclude_prefixes` for inclusion in a transfer. // - // The max size of `excludePrefixes` is 1000. + // The following are requirements of `exclude_prefixes`: + // + // * Each exclude-prefix can contain any sequence of Unicode characters, to + // a max length of 1024 bytes when UTF8-encoded, and must not contain + // Carriage Return or Line Feed characters. Wildcard matching and regular + // expression matching are not supported. + // + // * Each exclude-prefix must omit the leading slash. For example, to + // exclude the object `s3://my-aws-bucket/logs/y=2015/requests.gz`, + // specify the exclude-prefix as `logs/y=2015/requests.gz`. + // + // * None of the exclude-prefix values can be empty, if specified. + // + // * Each exclude-prefix must exclude a distinct portion of the object + // namespace. No exclude-prefix may be a prefix of another + // exclude-prefix. + // + // * If [include_prefixes] + // [google.storagetransfer.v1.ObjectConditions.include_prefixes] is + // specified, then each exclude-prefix must start with the value of a path + // explicitly included by `include_prefixes`. + // + // The max size of `exclude_prefixes` is 1000. + // + // For more information, see [Filtering objects from + // transfers](/storage-transfer/docs/filtering-objects-from-transfers). repeated string exclude_prefixes = 4; + + // If specified, only objects with a "last modification time" on or after + // this timestamp and objects that don't have a "last modification time" are + // transferred. + // + // The `last_modified_since` and `last_modified_before` fields can be used + // together for chunked data processing. For example, consider a script that + // processes each day's worth of data at a time. For that you'd set each + // of the fields as follows: + // + // * `last_modified_since` to the start of the day + // + // * `last_modified_before` to the end of the day + google.protobuf.Timestamp last_modified_since = 5; + + // If specified, only objects with a "last modification time" before this + // timestamp and objects that don't have a "last modification time" will be + // transferred. + google.protobuf.Timestamp last_modified_before = 6; } -// In a GcsData, an object's name is the Google Cloud Storage object's name and -// its `lastModificationTime` refers to the object's updated time, which changes -// when the content or the metadata of the object is updated. +// In a GcsData resource, an object's name is the Cloud Storage object's +// name and its "last modification time" refers to the object's `updated` +// property of Cloud Storage objects, which changes when the content or the +// metadata of the object is updated. message GcsData { - // Google Cloud Storage bucket name (see - // [Bucket Name - // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)). - // Required. - string bucket_name = 1; + // Required. Cloud Storage bucket name. Must meet + // [Bucket Name Requirements](/storage/docs/naming#requirements). + string bucket_name = 1 [(google.api.field_behavior) = REQUIRED]; + + // Root path to transfer objects. + // + // Must be an empty string or full path name that ends with a '/'. This field + // is treated as an object prefix. As such, it should generally not begin with + // a '/'. + // + // The root path value must meet + // [Object Name Requirements](/storage/docs/naming#objectnames). + string path = 3; } -// An AwsS3Data can be a data source, but not a data sink. -// In an AwsS3Data, an object's name is the S3 object's key name. +// An AwsS3Data resource can be a data source, but not a data sink. +// In an AwsS3Data resource, an object's name is the S3 object's key name. message AwsS3Data { - // S3 Bucket name (see + // Required. S3 Bucket name (see // [Creating a - // bucket](http://docs.aws.amazon.com/AmazonS3/latest/dev/create-bucket-get-location-example.html)). - // Required. - string bucket_name = 1; + // bucket](https://docs.aws.amazon.com/AmazonS3/latest/dev/create-bucket-get-location-example.html)). + string bucket_name = 1 [(google.api.field_behavior) = REQUIRED]; - // AWS access key used to sign the API requests to the AWS S3 bucket. - // Permissions on the bucket must be granted to the access ID of the - // AWS access key. - // Required. - AwsAccessKey aws_access_key = 2; + // Input only. AWS access key used to sign the API requests to the AWS S3 + // bucket. Permissions on the bucket must be granted to the access ID of the + // AWS access key. This field is required. + // + // For information on our data retention policy for user credentials, see + // [User credentials](/storage-transfer/docs/data-retention#user-credentials). + AwsAccessKey aws_access_key = 2 [(google.api.field_behavior) = INPUT_ONLY]; + + // Root path to transfer objects. + // + // Must be an empty string or full path name that ends with a '/'. This field + // is treated as an object prefix. As such, it should generally not begin with + // a '/'. + string path = 3; + + // Input only. Role arn to support temporary credentials via + // AssumeRoleWithWebIdentity. + // + // When role arn is provided, transfer service will fetch temporary + // credentials for the session using AssumeRoleWithWebIdentity call for the + // provided role using the [GoogleServiceAccount] for this project. + string role_arn = 4 [(google.api.field_behavior) = INPUT_ONLY]; } -// An HttpData specifies a list of objects on the web to be transferred over -// HTTP. The information of the objects to be transferred is contained in a -// file referenced by a URL. The first line in the file must be -// "TsvHttpData-1.0", which specifies the format of the file. Subsequent lines -// specify the information of the list of objects, one object per list entry. -// Each entry has the following tab-delimited fields: +// An AzureBlobStorageData resource can be a data source, but not a data sink. +// An AzureBlobStorageData resource represents one Azure container. The storage +// account determines the [Azure +// endpoint](https://docs.microsoft.com/en-us/azure/storage/common/storage-create-storage-account#storage-account-endpoints). +// In an AzureBlobStorageData resource, a blobs's name is the [Azure Blob +// Storage blob's key +// name](https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#blob-names). +message AzureBlobStorageData { + // Required. The name of the Azure Storage account. + string storage_account = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. Input only. Credentials used to authenticate API requests to + // Azure. + // + // For information on our data retention policy for user credentials, see + // [User credentials](/storage-transfer/docs/data-retention#user-credentials). + AzureCredentials azure_credentials = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = INPUT_ONLY + ]; + + // Required. The container to transfer from the Azure Storage account. + string container = 4 [(google.api.field_behavior) = REQUIRED]; + + // Root path to transfer objects. + // + // Must be an empty string or full path name that ends with a '/'. This field + // is treated as an object prefix. As such, it should generally not begin with + // a '/'. + string path = 5; +} + +// An HttpData resource specifies a list of objects on the web to be transferred +// over HTTP. The information of the objects to be transferred is contained in +// a file referenced by a URL. The first line in the file must be +// `"TsvHttpData-1.0"`, which specifies the format of the file. Subsequent +// lines specify the information of the list of objects, one object per list +// entry. Each entry has the following tab-delimited fields: // -// * HTTP URL - The location of the object. +// * **HTTP URL** — The location of the object. // -// * Length - The size of the object in bytes. +// * **Length** — The size of the object in bytes. // -// * MD5 - The base64-encoded MD5 hash of the object. +// * **MD5** — The base64-encoded MD5 hash of the object. // // For an example of a valid TSV file, see // [Transferring data from -// URLs](https://cloud.google.com/storage/transfer/create-url-list). +// URLs](https://cloud.google.com/storage-transfer/docs/create-url-list). // // When transferring data based on a URL list, keep the following in mind: // @@ -161,51 +303,61 @@ message AwsS3Data { // object fetched, the object will not be transferred. // // * If the specified MD5 does not match the MD5 computed from the transferred -// bytes, the object transfer will fail. For more information, see -// [Generating MD5 hashes](https://cloud.google.com/storage/transfer/#md5) +// bytes, the object transfer will fail. // // * Ensure that each URL you specify is publicly accessible. For -// example, in Google Cloud Storage you can +// example, in Cloud Storage you can // [share an object publicly] -// (https://cloud.google.com/storage/docs/cloud-console#_sharingdata) and get -// a link to it. +// (/storage/docs/cloud-console#_sharingdata) and get a link to it. // // * Storage Transfer Service obeys `robots.txt` rules and requires the source // HTTP server to support `Range` requests and to return a `Content-Length` // header in each response. // -// * [ObjectConditions](#ObjectConditions) have no effect when filtering objects -// to transfer. +// * [ObjectConditions][google.storagetransfer.v1.ObjectConditions] have no +// effect when filtering objects to transfer. message HttpData { - // The URL that points to the file that stores the object list entries. - // This file must allow public access. Currently, only URLs with HTTP and - // HTTPS schemes are supported. - // Required. - string list_url = 1; + // Required. The URL that points to the file that stores the object list + // entries. This file must allow public access. Currently, only URLs with + // HTTP and HTTPS schemes are supported. + string list_url = 1 [(google.api.field_behavior) = REQUIRED]; } -// TransferOptions uses three boolean parameters to define the actions -// to be performed on objects in a transfer. +// TransferOptions define the actions to be performed on objects in a transfer. message TransferOptions { - // Whether overwriting objects that already exist in the sink is allowed. + // When to overwrite objects that already exist in the sink. The default is + // that only objects that are different from the source are ovewritten. If + // true, all objects in the sink whose name matches an object in the source + // will be overwritten with the source object. bool overwrite_objects_already_existing_in_sink = 1; - // Whether objects that exist only in the sink should be deleted. Note that - // this option and `deleteObjectsFromSourceAfterTransfer` are mutually - // exclusive. + // Whether objects that exist only in the sink should be deleted. + // + // **Note:** This option and [delete_objects_from_source_after_transfer] + // [google.storagetransfer.v1.TransferOptions.delete_objects_from_source_after_transfer] + // are mutually exclusive. bool delete_objects_unique_in_sink = 2; // Whether objects should be deleted from the source after they are - // transferred to the sink. Note that this option and - // `deleteObjectsUniqueInSink` are mutually exclusive. + // transferred to the sink. + // + // **Note:** This option and [delete_objects_unique_in_sink] + // [google.storagetransfer.v1.TransferOptions.delete_objects_unique_in_sink] + // are mutually exclusive. bool delete_objects_from_source_after_transfer = 3; } // Configuration for running a transfer. message TransferSpec { + // The write sink for the data. + oneof data_sink { + // A Cloud Storage data sink. + GcsData gcs_data_sink = 4; + } + // The read source of the data. oneof data_source { - // A Google Cloud Storage data source. + // A Cloud Storage data source. GcsData gcs_data_source = 1; // An AWS S3 data source. @@ -213,46 +365,96 @@ message TransferSpec { // An HTTP URL data source. HttpData http_data_source = 3; - } - // The write sink for the data. - oneof data_sink { - // A Google Cloud Storage data sink. - GcsData gcs_data_sink = 4; + // An Azure Blob Storage data source. + AzureBlobStorageData azure_blob_storage_data_source = 8; } // Only objects that satisfy these object conditions are included in the set // of data source and data sink objects. Object conditions based on - // objects' `lastModificationTime` do not exclude objects in a data sink. + // objects' "last modification time" do not exclude objects in a data sink. ObjectConditions object_conditions = 5; - // If the option `deleteObjectsUniqueInSink` is `true`, object conditions - // based on objects' `lastModificationTime` are ignored and do not exclude - // objects in a data source or a data sink. + // If the option + // [delete_objects_unique_in_sink][google.storagetransfer.v1.TransferOptions.delete_objects_unique_in_sink] + // is `true` and time-based object conditions such as 'last modification time' + // are specified, the request fails with an + // [INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT] error. TransferOptions transfer_options = 6; } // Transfers can be scheduled to recur or to run just once. message Schedule { - // The first day the recurring transfer is scheduled to run. If - // `scheduleStartDate` is in the past, the transfer will run for the first - // time on the following day. - // Required. - google.type.Date schedule_start_date = 1; + // Required. The start date of a transfer. Date boundaries are determined + // relative to UTC time. If `schedule_start_date` and + // [start_time_of_day][google.storagetransfer.v1.Schedule.start_time_of_day] + // are in the past relative to the job's creation time, the transfer starts + // the day after you schedule the transfer request. + // + // **Note:** When starting jobs at or near midnight UTC it is possible that + // a job will start later than expected. For example, if you send an outbound + // request on June 1 one millisecond prior to midnight UTC and the Storage + // Transfer Service server receives the request on June 2, then it will create + // a TransferJob with `schedule_start_date` set to June 2 and a + // `start_time_of_day` set to midnight UTC. The first scheduled + // [TransferOperation][google.storagetransfer.v1.TransferOperation] will take + // place on June 3 at midnight UTC. + google.type.Date schedule_start_date = 1 + [(google.api.field_behavior) = REQUIRED]; - // The last day the recurring transfer will be run. If `scheduleEndDate` - // is the same as `scheduleStartDate`, the transfer will be executed only - // once. + // The last day a transfer runs. Date boundaries are determined relative to + // UTC time. A job will run once per 24 hours within the following guidelines: + // + // * If `schedule_end_date` and + // [schedule_start_date][google.storagetransfer.v1.Schedule.schedule_start_date] + // are the same and in + // the future relative to UTC, the transfer is executed only one time. + // * If `schedule_end_date` is later than `schedule_start_date` and + // `schedule_end_date` is in the future relative to UTC, the job will + // run each day at + // [start_time_of_day][google.storagetransfer.v1.Schedule.start_time_of_day] + // through `schedule_end_date`. google.type.Date schedule_end_date = 2; - // The time in UTC at which the transfer will be scheduled to start in a day. - // Transfers may start later than this time. If not specified, recurring and - // one-time transfers that are scheduled to run today will run immediately; - // recurring transfers that are scheduled to run on a future date will start - // at approximately midnight UTC on that date. Note that when configuring a - // transfer with the Cloud Platform Console, the transfer's start time in a - // day is specified in your local timezone. + // The time in UTC that a transfer job is scheduled to run. Transfers may + // start later than this time. + // + // If `start_time_of_day` is not specified: + // + // * One-time transfers run immediately. + // * Recurring transfers run immediately, and each day at midnight UTC, + // through + // [schedule_end_date][google.storagetransfer.v1.Schedule.schedule_end_date]. + // + // If `start_time_of_day` is specified: + // + // * One-time transfers run at the specified time. + // * Recurring transfers run at the specified time each day, through + // `schedule_end_date`. google.type.TimeOfDay start_time_of_day = 3; + + // The time in UTC that no further transfer operations are scheduled. Combined + // with + // [schedule_end_date][google.storagetransfer.v1.Schedule.schedule_end_date], + // `end_time_of_day` specifies the end date and time for starting new transfer + // operations. This field must be greater than or equal to the timestamp + // corresponding to the combintation of + // [schedule_start_date][google.storagetransfer.v1.Schedule.schedule_start_date] + // and + // [start_time_of_day][google.storagetransfer.v1.Schedule.start_time_of_day], + // and is subject to the following: + // + // * If `end_time_of_day` is not set and `schedule_end_date` is set, then + // a default value of `23:59:59` is used for `end_time_of_day`. + // + // * If `end_time_of_day` is set and `schedule_end_date` is not set, then + // [INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT] is returned. + google.type.TimeOfDay end_time_of_day = 4; + + // Interval between the start of each scheduled TransferOperation. If + // unspecified, the default value is 24 hours. This value may not be less than + // 1 hour. + google.protobuf.Duration repeat_interval = 5; } // This resource represents the configuration of a transfer job that runs @@ -271,54 +473,81 @@ message TransferJob { // This is a soft delete state. After a transfer job is set to this // state, the job and all the transfer executions are subject to - // garbage collection. + // garbage collection. Transfer jobs become eligible for garbage collection + // 30 days after their status is set to `DELETED`. DELETED = 3; } - // A globally unique name assigned by Storage Transfer Service when the - // job is created. This field should be left empty in requests to create a new - // transfer job; otherwise, the requests result in an `INVALID_ARGUMENT` - // error. + // A unique name (within the transfer project) assigned when the job is + // created. If this field is empty in a CreateTransferJobRequest, Storage + // Transfer Service will assign a unique name. Otherwise, the specified name + // is used as the unique name for this job. + // + // If the specified name is in use by a job, the creation request fails with + // an [ALREADY_EXISTS][google.rpc.Code.ALREADY_EXISTS] error. + // + // This name must start with `"transferJobs/"` prefix and end with a letter or + // a number, and should be no more than 128 characters. This name must not + // start with 'transferJobs/OPI'. 'transferJobs/OPI' is a reserved prefix. + // Example: + // `"transferJobs/^(?!OPI)[A-Za-z0-9-._~]*[A-Za-z0-9]$"` + // + // Invalid job names will fail with an + // [INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT] error. string name = 1; // A description provided by the user for the job. Its max length is 1024 // bytes when Unicode-encoded. string description = 2; - // The ID of the Google Cloud Platform Console project that owns the job. + // The ID of the Google Cloud Platform Project that owns the job. string project_id = 3; // Transfer specification. TransferSpec transfer_spec = 4; - // Schedule specification. + // Notification configuration. + NotificationConfig notification_config = 11; + + // Specifies schedule for the transfer job. + // This is an optional field. When the field is not set, the job will never + // execute a transfer, unless you invoke RunTransferJob or update the job to + // have a non-empty schedule. Schedule schedule = 5; // Status of the job. This value MUST be specified for // `CreateTransferJobRequests`. // - // NOTE: The effect of the new job status takes place during a subsequent job - // run. For example, if you change the job status from `ENABLED` to - // `DISABLED`, and an operation spawned by the transfer is running, the status - // change would not affect the current operation. + // **Note:** The effect of the new job status takes place during a subsequent + // job run. For example, if you change the job status from + // [ENABLED][google.storagetransfer.v1.TransferJob.Status.ENABLED] to + // [DISABLED][google.storagetransfer.v1.TransferJob.Status.DISABLED], and an + // operation spawned by the transfer is running, the status change would not + // affect the current operation. Status status = 6; - // This field cannot be changed by user requests. - google.protobuf.Timestamp creation_time = 7; + // Output only. The time that the transfer job was created. + google.protobuf.Timestamp creation_time = 7 + [(google.api.field_behavior) = OUTPUT_ONLY]; - // This field cannot be changed by user requests. - google.protobuf.Timestamp last_modification_time = 8; + // Output only. The time that the transfer job was last modified. + google.protobuf.Timestamp last_modification_time = 8 + [(google.api.field_behavior) = OUTPUT_ONLY]; - // This field cannot be changed by user requests. - google.protobuf.Timestamp deletion_time = 9; + // Output only. The time that the transfer job was deleted. + google.protobuf.Timestamp deletion_time = 9 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // The name of the most recently started TransferOperation of this JobConfig. + // Present if a TransferOperation has been created for this JobConfig. + string latest_operation_name = 12; } // An entry describing an error that has occurred. message ErrorLogEntry { - // A URL that refers to the target (a data source, a data sink, + // Required. A URL that refers to the target (a data source, a data sink, // or an object) with which the error is associated. - // Required. - string url = 1; + string url = 1 [(google.api.field_behavior) = REQUIRED]; // A list of messages that carry the error details. repeated string error_details = 3; @@ -328,13 +557,15 @@ message ErrorLogEntry { // entries. message ErrorSummary { // Required. - google.rpc.Code error_code = 1; + google.rpc.Code error_code = 1 [(google.api.field_behavior) = REQUIRED]; - // Count of this type of error. - // Required. - int64 error_count = 2; + // Required. Count of this type of error. + int64 error_count = 2 [(google.api.field_behavior) = REQUIRED]; // Error samples. + // + // At most 5 error log entries will be recorded for a given + // error code for a single transfer operation. repeated ErrorLogEntry error_log_entries = 3; } @@ -382,10 +613,12 @@ message TransferCounters { // Bytes that are deleted from the data sink. int64 bytes_deleted_from_sink = 12; - // Objects in the data source that failed during the transfer. + // Objects in the data source that failed to be transferred or that failed + // to be deleted after being transferred. int64 objects_from_source_failed = 13; - // Bytes in the data source that failed during the transfer. + // Bytes in the data source that failed to be transferred or that failed to + // be deleted after being transferred. int64 bytes_from_source_failed = 14; // Objects that failed to be deleted from the data sink. @@ -395,6 +628,80 @@ message TransferCounters { int64 bytes_failed_to_delete_from_sink = 16; } +// Specification to configure notifications published to Cloud Pub/Sub. +// Notifications will be published to the customer-provided topic using the +// following `PubsubMessage.attributes`: +// +// * `"eventType"`: one of the +// [EventType][google.storagetransfer.v1.NotificationConfig.EventType] values +// * `"payloadFormat"`: one of the +// [PayloadFormat][google.storagetransfer.v1.NotificationConfig.PayloadFormat] +// values +// * `"projectId"`: the +// [project_id][google.storagetransfer.v1.TransferOperation.project_id] of the +// `TransferOperation` +// * `"transferJobName"`: the +// [transfer_job_name][google.storagetransfer.v1.TransferOperation.transfer_job_name] +// of the `TransferOperation` +// * `"transferOperationName"`: the +// [name][google.storagetransfer.v1.TransferOperation.name] of the +// `TransferOperation` +// +// The `PubsubMessage.data` will contain a +// [TransferOperation][google.storagetransfer.v1.TransferOperation] resource +// formatted according to the specified `PayloadFormat`. +message NotificationConfig { + // Enum for specifying event types for which notifications are to be + // published. + // + // Additional event types may be added in the future. Clients should either + // safely ignore unrecognized event types or explicitly specify which event + // types they are prepared to accept. + enum EventType { + // Illegal value, to avoid allowing a default. + EVENT_TYPE_UNSPECIFIED = 0; + + // `TransferOperation` completed with status + // [SUCCESS][google.storagetransfer.v1.TransferOperation.Status.SUCCESS]. + TRANSFER_OPERATION_SUCCESS = 1; + + // `TransferOperation` completed with status + // [FAILED][google.storagetransfer.v1.TransferOperation.Status.FAILED]. + TRANSFER_OPERATION_FAILED = 2; + + // `TransferOperation` completed with status + // [ABORTED][google.storagetransfer.v1.TransferOperation.Status.ABORTED]. + TRANSFER_OPERATION_ABORTED = 3; + } + + // Enum for specifying the format of a notification message's payload. + enum PayloadFormat { + // Illegal value, to avoid allowing a default. + PAYLOAD_FORMAT_UNSPECIFIED = 0; + + // No payload is included with the notification. + NONE = 1; + + // `TransferOperation` is [formatted as a JSON + // response](https://developers.google.com/protocol-buffers/docs/proto3#json), + // in application/json. + JSON = 2; + } + + // Required. The `Topic.name` of the Cloud Pub/Sub topic to which to publish + // notifications. Must be of the format: `projects/{project}/topics/{topic}`. + // Not matching this format will result in an + // [INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT] error. + string pubsub_topic = 1 [(google.api.field_behavior) = REQUIRED]; + + // Event types for which a notification is desired. If empty, send + // notifications for all event types. + repeated EventType event_types = 2; + + // Required. The desired format of the notification message payloads. + PayloadFormat payload_format = 3 [(google.api.field_behavior) = REQUIRED]; +} + // A description of the execution of a transfer. message TransferOperation { // The status of a TransferOperation. @@ -416,19 +723,23 @@ message TransferOperation { // Aborted by the user. ABORTED = 5; + + // Temporarily delayed by the system. No user action is required. + QUEUED = 6; } // A globally unique ID assigned by the system. string name = 1; - // The ID of the Google Cloud Platform Console project that owns the - // operation. Required. + // The ID of the Google Cloud Platform Project that owns the operation. string project_id = 2; // Transfer specification. - // Required. TransferSpec transfer_spec = 3; + // Notification configuration. + NotificationConfig notification_config = 10; + // Start time of this transfer execution. google.protobuf.Timestamp start_time = 4;