// Copyright 2023 Google LLC
//
// 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.cloud.gkebackup.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/gkebackup/v1/backup.proto";
import "google/cloud/gkebackup/v1/backup_plan.proto";
import "google/cloud/gkebackup/v1/restore.proto";
import "google/cloud/gkebackup/v1/restore_plan.proto";
import "google/cloud/gkebackup/v1/volume.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.GkeBackup.V1";
option go_package = "cloud.google.com/go/gkebackup/apiv1/gkebackuppb;gkebackuppb";
option java_multiple_files = true;
option java_outer_classname = "GKEBackupProto";
option java_package = "com.google.cloud.gkebackup.v1";
option php_namespace = "Google\\Cloud\\GkeBackup\\V1";
option ruby_package = "Google::Cloud::GkeBackup::V1";
option (google.api.resource_definition) = {
  type: "container.googleapis.com/Cluster"
  pattern: "projects/{project}/locations/{location}/clusters/{cluster}"
};
option (google.api.resource_definition) = {
  type: "cloudkms.googleapis.com/CryptoKey"
  pattern: "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}"
};

// BackupForGKE allows Kubernetes administrators to configure, execute, and
// manage backup and restore operations for their GKE clusters.
service BackupForGKE {
  option (google.api.default_host) = "gkebackup.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Creates a new BackupPlan in a given location.
  rpc CreateBackupPlan(CreateBackupPlanRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/backupPlans"
      body: "backup_plan"
    };
    option (google.api.method_signature) = "parent,backup_plan,backup_plan_id";
    option (google.longrunning.operation_info) = {
      response_type: "BackupPlan"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists BackupPlans in a given location.
  rpc ListBackupPlans(ListBackupPlansRequest)
      returns (ListBackupPlansResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/backupPlans"
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieve the details of a single BackupPlan.
  rpc GetBackupPlan(GetBackupPlanRequest) returns (BackupPlan) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/backupPlans/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Update a BackupPlan.
  rpc UpdateBackupPlan(UpdateBackupPlanRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{backup_plan.name=projects/*/locations/*/backupPlans/*}"
      body: "backup_plan"
    };
    option (google.api.method_signature) = "backup_plan,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "BackupPlan"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes an existing BackupPlan.
  rpc DeleteBackupPlan(DeleteBackupPlanRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/backupPlans/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Creates a Backup for the given BackupPlan.
  rpc CreateBackup(CreateBackupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/backupPlans/*}/backups"
      body: "backup"
    };
    option (google.api.method_signature) = "parent,backup,backup_id";
    option (google.longrunning.operation_info) = {
      response_type: "Backup"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists the Backups for a given BackupPlan.
  rpc ListBackups(ListBackupsRequest) returns (ListBackupsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/backupPlans/*}/backups"
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieve the details of a single Backup.
  rpc GetBackup(GetBackupRequest) returns (Backup) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/backupPlans/*/backups/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Update a Backup.
  rpc UpdateBackup(UpdateBackupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{backup.name=projects/*/locations/*/backupPlans/*/backups/*}"
      body: "backup"
    };
    option (google.api.method_signature) = "backup,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Backup"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes an existing Backup.
  rpc DeleteBackup(DeleteBackupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/backupPlans/*/backups/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists the VolumeBackups for a given Backup.
  rpc ListVolumeBackups(ListVolumeBackupsRequest)
      returns (ListVolumeBackupsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/backupPlans/*/backups/*}/volumeBackups"
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieve the details of a single VolumeBackup.
  rpc GetVolumeBackup(GetVolumeBackupRequest) returns (VolumeBackup) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/backupPlans/*/backups/*/volumeBackups/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new RestorePlan in a given location.
  rpc CreateRestorePlan(CreateRestorePlanRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/restorePlans"
      body: "restore_plan"
    };
    option (google.api.method_signature) =
        "parent,restore_plan,restore_plan_id";
    option (google.longrunning.operation_info) = {
      response_type: "RestorePlan"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists RestorePlans in a given location.
  rpc ListRestorePlans(ListRestorePlansRequest)
      returns (ListRestorePlansResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/restorePlans"
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieve the details of a single RestorePlan.
  rpc GetRestorePlan(GetRestorePlanRequest) returns (RestorePlan) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/restorePlans/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Update a RestorePlan.
  rpc UpdateRestorePlan(UpdateRestorePlanRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{restore_plan.name=projects/*/locations/*/restorePlans/*}"
      body: "restore_plan"
    };
    option (google.api.method_signature) = "restore_plan,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "RestorePlan"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes an existing RestorePlan.
  rpc DeleteRestorePlan(DeleteRestorePlanRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/restorePlans/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Creates a new Restore for the given RestorePlan.
  rpc CreateRestore(CreateRestoreRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/restorePlans/*}/restores"
      body: "restore"
    };
    option (google.api.method_signature) = "parent,restore,restore_id";
    option (google.longrunning.operation_info) = {
      response_type: "Restore"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists the Restores for a given RestorePlan.
  rpc ListRestores(ListRestoresRequest) returns (ListRestoresResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/restorePlans/*}/restores"
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieves the details of a single Restore.
  rpc GetRestore(GetRestoreRequest) returns (Restore) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/restorePlans/*/restores/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Update a Restore.
  rpc UpdateRestore(UpdateRestoreRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{restore.name=projects/*/locations/*/restorePlans/*/restores/*}"
      body: "restore"
    };
    option (google.api.method_signature) = "restore,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Restore"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes an existing Restore.
  rpc DeleteRestore(DeleteRestoreRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/restorePlans/*/restores/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists the VolumeRestores for a given Restore.
  rpc ListVolumeRestores(ListVolumeRestoresRequest)
      returns (ListVolumeRestoresResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/restorePlans/*/restores/*}/volumeRestores"
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieve the details of a single VolumeRestore.
  rpc GetVolumeRestore(GetVolumeRestoreRequest) returns (VolumeRestore) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/restorePlans/*/restores/*/volumeRestores/*}"
    };
    option (google.api.method_signature) = "name";
  }
}

// Represents the metadata of the long-running operation.
message OperationMetadata {
  // 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.
  string target = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Name of the verb executed by the operation.
  string verb = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Human-readable status of the operation, if any.
  string status_message = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Identifies whether the user has requested cancellation
  // of the operation. Operations that have successfully been cancelled
  // have [Operation.error][] value with a
  // [google.rpc.Status.code][google.rpc.Status.code] of 1, corresponding to
  // `Code.CANCELLED`.
  bool requested_cancellation = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. API version used to start the operation.
  string api_version = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Request message for CreateBackupPlan.
message CreateBackupPlanRequest {
  // Required. The location within which to create the BackupPlan.
  // Format: `projects/*/locations/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. The BackupPlan resource object to create.
  BackupPlan backup_plan = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The client-provided short name for the BackupPlan resource.
  // This name must:
  //
  // - be between 1 and 63 characters long (inclusive)
  // - consist of only lower-case ASCII letters, numbers, and dashes
  // - start with a lower-case letter
  // - end with a lower-case letter or number
  // - be unique within the set of BackupPlans in this location
  string backup_plan_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListBackupPlans.
message ListBackupPlansRequest {
  // Required. The location that contains the BackupPlans to list.
  // Format: `projects/*/locations/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // The target number of results to return in a single response.
  // If not specified, a default value will be chosen by the service.
  // Note that the response may inclue a partial list and a caller should
  // only rely on the response's
  // [next_page_token][google.cloud.gkebackup.v1.ListBackupPlansResponse.next_page_token]
  // to determine if there are more instances left to be queried.
  int32 page_size = 2;

  // The value of
  // [next_page_token][google.cloud.gkebackup.v1.ListBackupPlansResponse.next_page_token]
  // received from a previous `ListBackupPlans` call.
  // Provide this to retrieve the subsequent page in a multi-page list of
  // results. When paginating, all other parameters provided to
  // `ListBackupPlans` must match the call that provided the page token.
  string page_token = 3;

  // Field match expression used to filter the results.
  string filter = 4;

  // Field by which to sort the results.
  string order_by = 5;
}

// Response message for ListBackupPlans.
message ListBackupPlansResponse {
  // The list of BackupPlans matching the given criteria.
  repeated BackupPlan backup_plans = 1;

  // A token which may be sent as
  // [page_token][google.cloud.gkebackup.v1.ListBackupPlansRequest.page_token]
  // in a subsequent `ListBackupPlans` call to retrieve the next page of
  // results. If this field is omitted or empty, then there are no more results
  // to return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for GetBackupPlan.
message GetBackupPlanRequest {
  // Required. Fully qualified BackupPlan name.
  // Format: `projects/*/locations/*/backupPlans/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/BackupPlan"
    }
  ];
}

// Request message for UpdateBackupPlan.
message UpdateBackupPlanRequest {
  // Required. A new version of the BackupPlan resource that contains updated
  // fields. This may be sparsely populated if an `update_mask` is provided.
  BackupPlan backup_plan = 1 [(google.api.field_behavior) = REQUIRED];

  // This is used to specify the fields to be overwritten in the
  // BackupPlan targeted for update. The values for each of these
  // updated fields will be taken from the `backup_plan` provided
  // with this request. Field names are relative to the root of the resource
  // (e.g., `description`, `backup_config.include_volume_data`, etc.)
  // If no `update_mask` is provided, all fields in `backup_plan` will be
  // written to the target BackupPlan resource.
  // Note that OUTPUT_ONLY and IMMUTABLE fields in `backup_plan` are ignored
  // and are not used to update the target BackupPlan.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for DeleteBackupPlan.
message DeleteBackupPlanRequest {
  // Required. Fully qualified BackupPlan name.
  // Format: `projects/*/locations/*/backupPlans/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/BackupPlan"
    }
  ];

  // If provided, this value must match the current value of the
  // target BackupPlan's [etag][google.cloud.gkebackup.v1.BackupPlan.etag] field
  // or the request is rejected.
  string etag = 2;
}

// Request message for CreateBackup.
message CreateBackupRequest {
  // Required. The BackupPlan within which to create the Backup.
  // Format: `projects/*/locations/*/backupPlans/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/BackupPlan"
    }
  ];

  // The Backup resource to create.
  Backup backup = 2;

  // The client-provided short name for the Backup resource.
  // This name must:
  //
  // - be between 1 and 63 characters long (inclusive)
  // - consist of only lower-case ASCII letters, numbers, and dashes
  // - start with a lower-case letter
  // - end with a lower-case letter or number
  // - be unique within the set of Backups in this BackupPlan
  string backup_id = 3;
}

// Request message for ListBackups.
message ListBackupsRequest {
  // Required. The BackupPlan that contains the Backups to list.
  // Format: `projects/*/locations/*/backupPlans/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/BackupPlan"
    }
  ];

  // The target number of results to return in a single response.
  // If not specified, a default value will be chosen by the service.
  // Note that the response may inclue a partial list and a caller should
  // only rely on the response's
  // [next_page_token][google.cloud.gkebackup.v1.ListBackupsResponse.next_page_token]
  // to determine if there are more instances left to be queried.
  int32 page_size = 2;

  // The value of
  // [next_page_token][google.cloud.gkebackup.v1.ListBackupsResponse.next_page_token]
  // received from a previous `ListBackups` call.
  // Provide this to retrieve the subsequent page in a multi-page list of
  // results. When paginating, all other parameters provided to
  // `ListBackups` must match the call that provided the page token.
  string page_token = 3;

  // Field match expression used to filter the results.
  string filter = 4;

  // Field by which to sort the results.
  string order_by = 5;
}

// Response message for ListBackups.
message ListBackupsResponse {
  // The list of Backups matching the given criteria.
  repeated Backup backups = 1;

  // A token which may be sent as
  // [page_token][google.cloud.gkebackup.v1.ListBackupsRequest.page_token] in a
  // subsequent `ListBackups` call to retrieve the next page of results. If this
  // field is omitted or empty, then there are no more results to return.
  string next_page_token = 2;
}

// Request message for GetBackup.
message GetBackupRequest {
  // Required. Full name of the Backup resource.
  // Format: `projects/*/locations/*/backupPlans/*/backups/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/Backup"
    }
  ];
}

// Request message for UpdateBackup.
message UpdateBackupRequest {
  // Required. A new version of the Backup resource that contains updated
  // fields. This may be sparsely populated if an `update_mask` is provided.
  Backup backup = 1 [(google.api.field_behavior) = REQUIRED];

  // This is used to specify the fields to be overwritten in the
  // Backup targeted for update. The values for each of these
  // updated fields will be taken from the `backup_plan` provided
  // with this request. Field names are relative to the root of the resource.
  // If no `update_mask` is provided, all fields in `backup` will be
  // written to the target Backup resource.
  // Note that OUTPUT_ONLY and IMMUTABLE fields in `backup` are ignored
  // and are not used to update the target Backup.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for DeleteBackup.
message DeleteBackupRequest {
  // Required. Name of the Backup resource.
  // Format: `projects/*/locations/*/backupPlans/*/backups/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/Backup"
    }
  ];

  // If provided, this value must match the current value of the
  // target Backup's [etag][google.cloud.gkebackup.v1.Backup.etag] field or the
  // request is rejected.
  string etag = 2;

  // If set to true, any VolumeBackups below this Backup will also be deleted.
  // Otherwise, the request will only succeed if the Backup has no
  // VolumeBackups.
  bool force = 3;
}

// Request message for ListVolumeBackups.
message ListVolumeBackupsRequest {
  // Required. The Backup that contains the VolumeBackups to list.
  // Format: `projects/*/locations/*/backupPlans/*/backups/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/Backup"
    }
  ];

  // The target number of results to return in a single response.
  // If not specified, a default value will be chosen by the service.
  // Note that the response may inclue a partial list and a caller should
  // only rely on the response's
  // [next_page_token][google.cloud.gkebackup.v1.ListVolumeBackupsResponse.next_page_token]
  // to determine if there are more instances left to be queried.
  int32 page_size = 2;

  // The value of
  // [next_page_token][google.cloud.gkebackup.v1.ListVolumeBackupsResponse.next_page_token]
  // received from a previous `ListVolumeBackups` call.
  // Provide this to retrieve the subsequent page in a multi-page list of
  // results. When paginating, all other parameters provided to
  // `ListVolumeBackups` must match the call that provided the page token.
  string page_token = 3;

  // Field match expression used to filter the results.
  string filter = 4;

  // Field by which to sort the results.
  string order_by = 5;
}

// Response message for ListVolumeBackups.
message ListVolumeBackupsResponse {
  // The list of VolumeBackups matching the given criteria.
  repeated VolumeBackup volume_backups = 1;

  // A token which may be sent as
  // [page_token][google.cloud.gkebackup.v1.ListVolumeBackupsRequest.page_token]
  // in a subsequent `ListVolumeBackups` call to retrieve the next page of
  // results. If this field is omitted or empty, then there are no more results
  // to return.
  string next_page_token = 2;
}

// Request message for GetVolumeBackup.
message GetVolumeBackupRequest {
  // Required. Full name of the VolumeBackup resource.
  // Format: `projects/*/locations/*/backupPlans/*/backups/*/volumeBackups/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/VolumeBackup"
    }
  ];
}

// Request message for CreateRestorePlan.
message CreateRestorePlanRequest {
  // Required. The location within which to create the RestorePlan.
  // Format: `projects/*/locations/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. The RestorePlan resource object to create.
  RestorePlan restore_plan = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The client-provided short name for the RestorePlan resource.
  // This name must:
  //
  // - be between 1 and 63 characters long (inclusive)
  // - consist of only lower-case ASCII letters, numbers, and dashes
  // - start with a lower-case letter
  // - end with a lower-case letter or number
  // - be unique within the set of RestorePlans in this location
  string restore_plan_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListRestorePlans.
message ListRestorePlansRequest {
  // Required. The location that contains the RestorePlans to list.
  // Format: `projects/*/locations/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // The target number of results to return in a single response.
  // If not specified, a default value will be chosen by the service.
  // Note that the response may inclue a partial list and a caller should
  // only rely on the response's
  // [next_page_token][google.cloud.gkebackup.v1.ListRestorePlansResponse.next_page_token]
  // to determine if there are more instances left to be queried.
  int32 page_size = 2;

  // The value of
  // [next_page_token][google.cloud.gkebackup.v1.ListRestorePlansResponse.next_page_token]
  // received from a previous `ListRestorePlans` call.
  // Provide this to retrieve the subsequent page in a multi-page list of
  // results. When paginating, all other parameters provided to
  // `ListRestorePlans` must match the call that provided the page token.
  string page_token = 3;

  // Field match expression used to filter the results.
  string filter = 4;

  // Field by which to sort the results.
  string order_by = 5;
}

// Response message for ListRestorePlans.
message ListRestorePlansResponse {
  // The list of RestorePlans matching the given criteria.
  repeated RestorePlan restore_plans = 1;

  // A token which may be sent as
  // [page_token][google.cloud.gkebackup.v1.ListRestorePlansRequest.page_token]
  // in a subsequent `ListRestorePlans` call to retrieve the next page of
  // results. If this field is omitted or empty, then there are no more results
  // to return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for GetRestorePlan.
message GetRestorePlanRequest {
  // Required. Fully qualified RestorePlan name.
  // Format: `projects/*/locations/*/restorePlans/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/RestorePlan"
    }
  ];
}

// Request message for UpdateRestorePlan.
message UpdateRestorePlanRequest {
  // Required. A new version of the RestorePlan resource that contains updated
  // fields. This may be sparsely populated if an `update_mask` is provided.
  RestorePlan restore_plan = 1 [(google.api.field_behavior) = REQUIRED];

  // This is used to specify the fields to be overwritten in the
  // RestorePlan targeted for update. The values for each of these
  // updated fields will be taken from the `restore_plan` provided
  // with this request. Field names are relative to the root of the resource.
  // If no `update_mask` is provided, all fields in `restore_plan` will be
  // written to the target RestorePlan resource.
  // Note that OUTPUT_ONLY and IMMUTABLE fields in `restore_plan` are ignored
  // and are not used to update the target RestorePlan.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for DeleteRestorePlan.
message DeleteRestorePlanRequest {
  // Required. Fully qualified RestorePlan name.
  // Format: `projects/*/locations/*/restorePlans/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/RestorePlan"
    }
  ];

  // If provided, this value must match the current value of the
  // target RestorePlan's [etag][google.cloud.gkebackup.v1.RestorePlan.etag]
  // field or the request is rejected.
  string etag = 2;

  // If set to true, any Restores below this RestorePlan will also be deleted.
  // Otherwise, the request will only succeed if the RestorePlan has no
  // Restores.
  bool force = 3;
}

// Request message for CreateRestore.
message CreateRestoreRequest {
  // Required. The RestorePlan within which to create the Restore.
  // Format: `projects/*/locations/*/restorePlans/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/RestorePlan"
    }
  ];

  // Required. The restore resource to create.
  Restore restore = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The client-provided short name for the Restore resource.
  // This name must:
  //
  // - be between 1 and 63 characters long (inclusive)
  // - consist of only lower-case ASCII letters, numbers, and dashes
  // - start with a lower-case letter
  // - end with a lower-case letter or number
  // - be unique within the set of Restores in this RestorePlan.
  string restore_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListRestores.
message ListRestoresRequest {
  // Required. The RestorePlan that contains the Restores to list.
  // Format: `projects/*/locations/*/restorePlans/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/RestorePlan"
    }
  ];

  // The target number of results to return in a single response.
  // If not specified, a default value will be chosen by the service.
  // Note that the response may inclue a partial list and a caller should
  // only rely on the response's
  // [next_page_token][google.cloud.gkebackup.v1.ListRestoresResponse.next_page_token]
  // to determine if there are more instances left to be queried.
  int32 page_size = 2;

  // The value of
  // [next_page_token][google.cloud.gkebackup.v1.ListRestoresResponse.next_page_token]
  // received from a previous `ListRestores` call.
  // Provide this to retrieve the subsequent page in a multi-page list of
  // results. When paginating, all other parameters provided to `ListRestores`
  // must match the call that provided the page token.
  string page_token = 3;

  // Field match expression used to filter the results.
  string filter = 4;

  // Field by which to sort the results.
  string order_by = 5;
}

// Response message for ListRestores.
message ListRestoresResponse {
  // The list of Restores matching the given criteria.
  repeated Restore restores = 1;

  // A token which may be sent as
  // [page_token][google.cloud.gkebackup.v1.ListRestoresRequest.page_token] in a
  // subsequent `ListRestores` call to retrieve the next page of results. If
  // this field is omitted or empty, then there are no more results to return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Request message for GetRestore.
message GetRestoreRequest {
  // Required. Name of the restore resource.
  // Format: `projects/*/locations/*/restorePlans/*/restores/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/Restore"
    }
  ];
}

// Request message for UpdateRestore.
message UpdateRestoreRequest {
  // Required. A new version of the Restore resource that contains updated
  // fields. This may be sparsely populated if an `update_mask` is provided.
  Restore restore = 1 [(google.api.field_behavior) = REQUIRED];

  // This is used to specify the fields to be overwritten in the
  // Restore targeted for update. The values for each of these
  // updated fields will be taken from the `restore` provided
  // with this request. Field names are relative to the root of the resource.
  // If no `update_mask` is provided, all fields in `restore` will be
  // written to the target Restore resource.
  // Note that OUTPUT_ONLY and IMMUTABLE fields in `restore` are ignored
  // and are not used to update the target Restore.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for DeleteRestore.
message DeleteRestoreRequest {
  // Required. Full name of the Restore
  // Format: `projects/*/locations/*/restorePlans/*/restores/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/Restore"
    }
  ];

  // If provided, this value must match the current value of the
  // target Restore's [etag][google.cloud.gkebackup.v1.Restore.etag] field or
  // the request is rejected.
  string etag = 2;

  // If set to true, any VolumeRestores below this restore will also be deleted.
  // Otherwise, the request will only succeed if the restore has no
  // VolumeRestores.
  bool force = 3;
}

// Request message for ListVolumeRestores.
message ListVolumeRestoresRequest {
  // Required. The Restore that contains the VolumeRestores to list.
  // Format: `projects/*/locations/*/restorePlans/*/restores/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/Restore"
    }
  ];

  // The target number of results to return in a single response.
  // If not specified, a default value will be chosen by the service.
  // Note that the response may inclue a partial list and a caller should
  // only rely on the response's
  // [next_page_token][google.cloud.gkebackup.v1.ListVolumeRestoresResponse.next_page_token]
  // to determine if there are more instances left to be queried.
  int32 page_size = 2;

  // The value of
  // [next_page_token][google.cloud.gkebackup.v1.ListVolumeRestoresResponse.next_page_token]
  // received from a previous `ListVolumeRestores` call.
  // Provide this to retrieve the subsequent page in a multi-page list of
  // results. When paginating, all other parameters provided to
  // `ListVolumeRestores` must match the call that provided the page token.
  string page_token = 3;

  // Field match expression used to filter the results.
  string filter = 4;

  // Field by which to sort the results.
  string order_by = 5;
}

// Response message for ListVolumeRestores.
message ListVolumeRestoresResponse {
  // The list of VolumeRestores matching the given criteria.
  repeated VolumeRestore volume_restores = 1;

  // A token which may be sent as
  // [page_token][google.cloud.gkebackup.v1.ListVolumeRestoresRequest.page_token]
  // in a subsequent `ListVolumeRestores` call to retrieve the next page of
  // results. If this field is omitted or empty, then there are no more results
  // to return.
  string next_page_token = 2;
}

// Request message for GetVolumeRestore.
message GetVolumeRestoreRequest {
  // Required. Full name of the VolumeRestore resource.
  // Format: `projects/*/locations/*/restorePlans/*/restores/*/volumeRestores/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "gkebackup.googleapis.com/VolumeRestore"
    }
  ];
}
