// Copyright 2016 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.storagetransfer.v1;

import "google/api/annotations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/storagetransfer/v1/transfer_types.proto";

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/storagetransfer/v1;storagetransfer";
option java_outer_classname = "TransferProto";
option java_package = "com.google.storagetransfer.v1.proto";


// Transfers data between between Google Cloud Storage buckets or from a data
// source external to Google to a Cloud Storage bucket.
service StorageTransferService {
  // 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
  // with one Google Cloud Platform Console project. Users
  // should add this service account to the Google Cloud Storage bucket
  // ACLs to grant access to Storage Transfer Service. This service
  // account is created and owned by Storage Transfer Service and can
  // only be used by Storage Transfer Service.
  rpc GetGoogleServiceAccount(GetGoogleServiceAccountRequest) returns (GoogleServiceAccount) {
    option (google.api.http) = { get: "/v1/googleServiceAccounts/{project_id}" };
  }

  // Creates a transfer job that runs periodically.
  rpc CreateTransferJob(CreateTransferJobRequest) returns (TransferJob) {
    option (google.api.http) = { post: "/v1/transferJobs" body: "transfer_job" };
  }

  // 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.
  rpc UpdateTransferJob(UpdateTransferJobRequest) returns (TransferJob) {
    option (google.api.http) = { patch: "/v1/{job_name=transferJobs/**}" body: "*" };
  }

  // Gets a transfer job.
  rpc GetTransferJob(GetTransferJobRequest) returns (TransferJob) {
    option (google.api.http) = { get: "/v1/{job_name=transferJobs/**}" };
  }

  // Lists transfer jobs.
  rpc ListTransferJobs(ListTransferJobsRequest) returns (ListTransferJobsResponse) {
    option (google.api.http) = { get: "/v1/transferJobs" };
  }

  // Pauses a transfer operation.
  rpc PauseTransferOperation(PauseTransferOperationRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { post: "/v1/{name=transferOperations/**}:pause" body: "*" };
  }

  // Resumes a transfer operation that is paused.
  rpc ResumeTransferOperation(ResumeTransferOperationRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { post: "/v1/{name=transferOperations/**}:resume" body: "*" };
  }
}

// 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;
}

// Request passed to CreateTransferJob.
message CreateTransferJobRequest {
  // The job to create.
  // Required.
  TransferJob transfer_job = 1;
}

// Request passed to UpdateTransferJob.
message UpdateTransferJobRequest {
  // The name of job to update.
  // Required.
  string job_name = 1;

  // The ID of the Google Cloud Platform Console project that owns the job.
  // Required.
  string project_id = 2;

  // The job to update.
  // Required.
  TransferJob transfer_job = 3;

  // 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`.
  google.protobuf.FieldMask update_transfer_job_field_mask = 4;
}

// Request passed to GetTransferJob.
message GetTransferJobRequest {
  // The job to get.
  // Required.
  string job_name = 1;

  // The ID of the Google Cloud Platform Console project that owns the job.
  // Required.
  string project_id = 2;
}

// `project_id`, `job_names`, and `job_statuses` 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;

  // The list page size. The max allowed value is 256.
  int32 page_size = 4;

  // The list page token.
  string page_token = 5;
}

// Response from ListTransferJobs.
message ListTransferJobsResponse {
  // A list of transfer jobs.
  repeated TransferJob transfer_jobs = 1;

  // The list next page token.
  string next_page_token = 2;
}

// Request passed to PauseTransferOperation.
message PauseTransferOperationRequest {
  // The name of the transfer operation.
  // Required.
  string name = 1;
}

// Request passed to ResumeTransferOperation.
message ResumeTransferOperationRequest {
  // The name of the transfer operation.
  // Required.
  string name = 1;
}
