// Copyright 2025 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.networkconnectivity.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/field_info.proto";
import "google/api/resource.proto";
import "google/cloud/networkconnectivity/v1/common.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.NetworkConnectivity.V1";
option go_package = "cloud.google.com/go/networkconnectivity/apiv1/networkconnectivitypb;networkconnectivitypb";
option java_multiple_files = true;
option java_outer_classname = "DataTransferProto";
option java_package = "com.google.cloud.networkconnectivity.v1";
option php_namespace = "Google\\Cloud\\NetworkConnectivity\\V1";
option ruby_package = "Google::Cloud::NetworkConnectivity::V1";

// DataTransferService is the service for the Data Transfer API.
service DataTransferService {
  option (google.api.default_host) = "networkconnectivity.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Lists the `MulticloudDataTransferConfig` resources in a specified project
  // and location.
  rpc ListMulticloudDataTransferConfigs(
      ListMulticloudDataTransferConfigsRequest)
      returns (ListMulticloudDataTransferConfigsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/multicloudDataTransferConfigs"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a `MulticloudDataTransferConfig` resource.
  rpc GetMulticloudDataTransferConfig(GetMulticloudDataTransferConfigRequest)
      returns (MulticloudDataTransferConfig) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/multicloudDataTransferConfigs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a `MulticloudDataTransferConfig` resource in a specified project
  // and location.
  rpc CreateMulticloudDataTransferConfig(
      CreateMulticloudDataTransferConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/multicloudDataTransferConfigs"
      body: "multicloud_data_transfer_config"
    };
    option (google.api.method_signature) =
        "parent,multicloud_data_transfer_config,multicloud_data_transfer_config_id";
    option (google.longrunning.operation_info) = {
      response_type: "MulticloudDataTransferConfig"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates a `MulticloudDataTransferConfig` resource in a specified project
  // and location.
  rpc UpdateMulticloudDataTransferConfig(
      UpdateMulticloudDataTransferConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{multicloud_data_transfer_config.name=projects/*/locations/*/multicloudDataTransferConfigs/*}"
      body: "multicloud_data_transfer_config"
    };
    option (google.api.method_signature) =
        "multicloud_data_transfer_config,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "MulticloudDataTransferConfig"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a `MulticloudDataTransferConfig` resource.
  rpc DeleteMulticloudDataTransferConfig(
      DeleteMulticloudDataTransferConfigRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/multicloudDataTransferConfigs/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists the `Destination` resources in a specified project and location.
  rpc ListDestinations(ListDestinationsRequest)
      returns (ListDestinationsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/multicloudDataTransferConfigs/*}/destinations"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a `Destination` resource.
  rpc GetDestination(GetDestinationRequest) returns (Destination) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/multicloudDataTransferConfigs/*/destinations/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a `Destination` resource in a specified project and location.
  rpc CreateDestination(CreateDestinationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/multicloudDataTransferConfigs/*}/destinations"
      body: "destination"
    };
    option (google.api.method_signature) = "parent,destination,destination_id";
    option (google.longrunning.operation_info) = {
      response_type: "Destination"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates a `Destination` resource in a specified project and location.
  rpc UpdateDestination(UpdateDestinationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{destination.name=projects/*/locations/*/multicloudDataTransferConfigs/*/destinations/*}"
      body: "destination"
    };
    option (google.api.method_signature) = "destination,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Destination"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a `Destination` resource.
  rpc DeleteDestination(DeleteDestinationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/multicloudDataTransferConfigs/*/destinations/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets the details of a service that is supported for Data Transfer
  // Essentials.
  rpc GetMulticloudDataTransferSupportedService(
      GetMulticloudDataTransferSupportedServiceRequest)
      returns (MulticloudDataTransferSupportedService) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/multicloudDataTransferSupportedServices/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists the services in the project for a region that are supported for
  // Data Transfer Essentials.
  rpc ListMulticloudDataTransferSupportedServices(
      ListMulticloudDataTransferSupportedServicesRequest)
      returns (ListMulticloudDataTransferSupportedServicesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/multicloudDataTransferSupportedServices"
    };
    option (google.api.method_signature) = "parent";
  }
}

// The `MulticloudDataTransferConfig` resource. It lists the services that you
// configure for Data Transfer Essentials billing and metering.
message MulticloudDataTransferConfig {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/MulticloudDataTransferConfig"
    pattern: "projects/{project}/locations/{location}/multicloudDataTransferConfigs/{multicloud_data_transfer_config}"
    plural: "multicloudDataTransferConfigs"
    singular: "multicloudDataTransferConfig"
  };

  // Identifier. The name of the `MulticloudDataTransferConfig` resource.
  // Format:
  // `projects/{project}/locations/{location}/multicloudDataTransferConfigs/{multicloud_data_transfer_config}`.
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Time when the `MulticloudDataTransferConfig` resource was
  // created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when the `MulticloudDataTransferConfig` resource was
  // updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. User-defined labels.
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // The etag is computed by the server, and might be sent with update and
  // delete requests so that the client has an up-to-date value before
  // proceeding.
  string etag = 5;

  // Optional. A description of this resource.
  string description = 6 [(google.api.field_behavior) = OPTIONAL];

  // Output only. The number of `Destination` resources configured for the
  // `MulticloudDataTransferConfig` resource.
  int32 destinations_count = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The number of `Destination` resources in use with the
  // `MulticloudDataTransferConfig` resource.
  int32 destinations_active_count = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Maps services to their current or planned states. Service names
  // are keys, and the associated values describe the state of the service. If a
  // state change is expected, the value is either `ADDING` or `DELETING`,
  // depending on the actions taken.
  //
  // Sample output:
  // "services": {
  //   "big-query": {
  //     "states": [
  //       {
  //         "effectiveTime": "2024-12-12T08:00:00Z"
  //         "state": "ADDING",
  //       },
  //     ]
  //   },
  //   "cloud-storage": {
  //     "states": [
  //       {
  //         "state": "ACTIVE",
  //       }
  //     ]
  //   }
  // }
  map<string, StateTimeline> services = 9
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. The Google-generated unique ID for the
  // `MulticloudDataTransferConfig` resource. This value is unique across all
  // `MulticloudDataTransferConfig` resources. If a resource is deleted and
  // another with the same name is created, the new resource is assigned a
  // different and unique ID.
  string uid = 10 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];
}

// Request message to list `MulticloudDataTransferConfig` resources.
message ListMulticloudDataTransferConfigsRequest {
  // Required. The name of the parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Optional. The maximum number of results listed per page.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. An expression that filters the results listed in the response.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The sort order of the results.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If `true`, allows partial responses for multi-regional aggregated
  // list requests.
  bool return_partial_success = 6 [(google.api.field_behavior) = OPTIONAL];
}

// Response message to list `MulticloudDataTransferConfig` resources.
message ListMulticloudDataTransferConfigsResponse {
  // The list of `MulticloudDataTransferConfig` resources to be listed.
  repeated MulticloudDataTransferConfig multicloud_data_transfer_configs = 1;

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

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

// Request message to get the details of a `MulticloudDataTransferConfig`
// resource.
message GetMulticloudDataTransferConfigRequest {
  // Required. The name of the `MulticloudDataTransferConfig` resource to get.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/MulticloudDataTransferConfig"
    }
  ];
}

// Request message to create a `MulticloudDataTransferConfig` resource.
message CreateMulticloudDataTransferConfigRequest {
  // Required. The name of the parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. The ID to use for the `MulticloudDataTransferConfig` resource,
  // which becomes the final component of the `MulticloudDataTransferConfig`
  // resource name.
  string multicloud_data_transfer_config_id = 2
      [(google.api.field_behavior) = REQUIRED];

  // Required. The `MulticloudDataTransferConfig` resource to create.
  MulticloudDataTransferConfig multicloud_data_transfer_config = 3
      [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server can ignore
  // the request if it has already been completed. The server waits
  // for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, can ignore the second request. This prevents
  // clients from accidentally creating duplicate `MulticloudDataTransferConfig`
  // resources.
  //
  // The request ID must be a valid UUID with the exception that zero UUID
  // (00000000-0000-0000-0000-000000000000) isn't supported.
  string request_id = 4 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// Request message to update a `MulticloudDataTransferConfig` resource.
message UpdateMulticloudDataTransferConfigRequest {
  // Optional. `FieldMask` is used to specify the fields in the
  // `MulticloudDataTransferConfig` resource to be overwritten by the update.
  // The fields specified in `update_mask` are relative to the resource, not
  // the full request. A field is overwritten if it is in the mask. If you
  // don't specify a mask, all fields are overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Required. The `MulticloudDataTransferConfig` resource to update.
  MulticloudDataTransferConfig multicloud_data_transfer_config = 2
      [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server can ignore
  // the request if it has already been completed. The server waits
  // for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, can ignore the second request. This prevents
  // clients from accidentally creating duplicate `MulticloudDataTransferConfig`
  // resources.
  //
  // The request ID must be a valid UUID with the exception that zero UUID
  // (00000000-0000-0000-0000-000000000000) isn't supported.
  string request_id = 3 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// Request message to delete a `MulticloudDataTransferConfig` resource.
message DeleteMulticloudDataTransferConfigRequest {
  // Required. The name of the `MulticloudDataTransferConfig` resource to
  // delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/MulticloudDataTransferConfig"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server can ignore
  // the request if it has already been completed. The server waits
  // for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, can ignore the second request. This prevents
  // clients from accidentally creating duplicate `MulticloudDataTransferConfig`
  // resources.
  //
  // The request ID must be a valid UUID with the exception that zero UUID
  // (00000000-0000-0000-0000-000000000000) isn't supported.
  string request_id = 2 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Optional. The etag is computed by the server, and might be sent with update
  // and delete requests so that the client has an up-to-date value before
  // proceeding.
  string etag = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The `Destination` resource. It specifies the IP prefix and the associated
// autonomous system numbers (ASN) that you want to include in a
// `MulticloudDataTransferConfig` resource.
message Destination {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/Destination"
    pattern: "projects/{project}/locations/{location}/multicloudDataTransferConfigs/{multicloud_data_transfer_config}/destinations/{destination}"
    plural: "destinations"
    singular: "destination"
  };

  // The metadata for a `DestinationEndpoint` resource.
  message DestinationEndpoint {
    // The state of the `DestinationEndpoint` resource.
    enum State {
      // An invalid state, which is the default case.
      STATE_UNSPECIFIED = 0;

      // The `DestinationEndpoint` resource is valid.
      VALID = 1;

      // The `DestinationEndpoint` resource is invalid.
      INVALID = 2;
    }

    // Required. The ASN of the remote IP prefix.
    int64 asn = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The CSP of the remote IP prefix.
    string csp = 2 [(google.api.field_behavior) = REQUIRED];

    // Output only. The state of the `DestinationEndpoint` resource.
    State state = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Time when the `DestinationEndpoint` resource was updated.
    google.protobuf.Timestamp update_time = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Identifier. The name of the `Destination` resource.
  // Format:
  // `projects/{project}/locations/{location}/multicloudDataTransferConfigs/{multicloud_data_transfer_config}/destinations/{destination}`.
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Time when the `Destination` resource was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when the `Destination` resource was updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. User-defined labels.
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // The etag is computed by the server, and might be sent with update and
  // delete requests so that the client has an up-to-date value before
  // proceeding.
  string etag = 5;

  // Optional. A description of this resource.
  string description = 6 [(google.api.field_behavior) = OPTIONAL];

  // Required. Immutable. The IP prefix that represents your workload on another
  // CSP.
  string ip_prefix = 7 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Unordered list. The list of `DestinationEndpoint` resources
  // configured for the IP prefix.
  repeated DestinationEndpoint endpoints = 8 [
    (google.api.field_behavior) = UNORDERED_LIST,
    (google.api.field_behavior) = REQUIRED
  ];

  // Output only. The timeline of the expected `Destination` states or the
  // current rest state. If a state change is expected, the value is `ADDING`,
  // `DELETING` or `SUSPENDING`, depending on the action specified.
  //
  // Example:
  // "state_timeline": {
  //   "states": [
  //     {
  //       // The time when the `Destination` resource will be activated.
  //       "effectiveTime": "2024-12-01T08:00:00Z",
  //       "state": "ADDING"
  //     },
  //     {
  //       // The time when the `Destination` resource will be suspended.
  //       "effectiveTime": "2024-12-01T20:00:00Z",
  //       "state": "SUSPENDING"
  //     }
  //   ]
  // }
  StateTimeline state_timeline = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The Google-generated unique ID for the `Destination` resource.
  // This value is unique across all `Destination` resources.
  // If a resource is deleted and another with the same name is
  // created, the new resource is assigned a different and unique ID.
  string uid = 10 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];
}

// Request message to list `Destination` resources.
message ListDestinationsRequest {
  // Required. The name of the parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/MulticloudDataTransferConfig"
    }
  ];

  // Optional. The maximum number of results listed per page.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. An expression that filters the results listed in the response.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The sort order of the results.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If `true`, allow partial responses for multi-regional aggregated
  // list requests.
  bool return_partial_success = 6 [(google.api.field_behavior) = OPTIONAL];
}

// Response message to list `Destination` resources.
message ListDestinationsResponse {
  // The list of `Destination` resources to be listed.
  repeated Destination destinations = 1;

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

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

// Request message to get the details of a `Destination` resource.
message GetDestinationRequest {
  // Required. The name of the `Destination` resource to get.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Destination"
    }
  ];
}

// Request message to create a `Destination` resource.
message CreateDestinationRequest {
  // Required. The name of the parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/MulticloudDataTransferConfig"
    }
  ];

  // Required. The ID to use for the `Destination` resource, which becomes the
  // final component of the `Destination` resource name.
  string destination_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The `Destination` resource to create.
  Destination destination = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server can ignore
  // the request if it has already been completed. The server waits
  // for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, can ignore the second request. This prevents
  // clients from accidentally creating duplicate `Destination`
  // resources.
  //
  // The request ID must be a valid UUID with the exception that zero UUID
  // (00000000-0000-0000-0000-000000000000) isn't supported.
  string request_id = 4 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// Request message to update a `Destination` resource.
message UpdateDestinationRequest {
  // Optional. `FieldMask is used to specify the fields to be overwritten in the
  // `Destination` resource by the update.
  // The fields specified in `update_mask` are relative to the resource, not
  // the full request. A field is overwritten if it is in the mask. If you
  // don't specify a mask, all fields are overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Required. The `Destination` resource to update.
  Destination destination = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server can ignore
  // the request if it has already been completed. The server waits
  // for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, can ignore the second request.
  //
  // The request ID must be a valid UUID with the exception that zero UUID
  // (00000000-0000-0000-0000-000000000000) isn't supported.
  string request_id = 3 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// Request message to delete a `Destination` resource.
message DeleteDestinationRequest {
  // Required. The name of the `Destination` resource to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Destination"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID
  // so that if you must retry your request, the server can ignore
  // the request if it has already been completed. The server waits
  // for at least 60 minutes since the first request.
  //
  // For example, consider a situation where you make an initial request and
  // the request times out. If you make the request again with the same request
  // ID, the server can check if original operation with the same request ID
  // was received, and if so, can ignore the second request.
  //
  // The request ID must be a valid UUID with the exception that zero UUID
  // (00000000-0000-0000-0000-000000000000) isn't supported.
  string request_id = 2 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Optional. The etag is computed by the server, and might be sent with update
  // and delete requests so that the client has an up-to-date value before
  // proceeding.
  string etag = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The timeline of the pending states for a resource.
message StateTimeline {
  // The state and activation time details of the resource state.
  message StateMetadata {
    // The state of the resource.
    enum State {
      // An invalid state, which is the default case.
      STATE_UNSPECIFIED = 0;

      // The resource is being added.
      ADDING = 1;

      // The resource is in use.
      ACTIVE = 2;

      // The resource is being deleted.
      DELETING = 3;

      // The resource is being suspended.
      SUSPENDING = 4;

      // The resource is suspended and not in use.
      SUSPENDED = 5;
    }

    // Output only. The state of the resource.
    State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Accompanies only the transient states, which include
    // `ADDING`, `DELETING`, and `SUSPENDING`, to denote the time until which
    // the transient state of the resource will be effective. For instance, if
    // the state is `ADDING`, this field shows the time when the resource state
    // transitions to `ACTIVE`.
    google.protobuf.Timestamp effective_time = 2
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. The state and activation time details of the resource state.
  repeated StateMetadata states = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A service in your project in a region that is eligible for Data Transfer
// Essentials configuration.
message MulticloudDataTransferSupportedService {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/MulticloudDataTransferSupportedService"
    pattern: "projects/{project}/locations/{location}/multicloudDataTransferSupportedServices/{multicloud_data_transfer_supported_service}"
    plural: "multicloudDataTransferSupportedServices"
    singular: "multicloudDataTransferSupportedService"
  };

  // Identifier. The name of the service.
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. The network service tier or regional endpoint supported for
  // the service.
  repeated ServiceConfig service_configs = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Specifies eligibility information for the service.
message ServiceConfig {
  // The eligibility information for the service.
  enum EligibilityCriteria {
    // The service is not eligible for Data Transfer Essentials configuration.
    // This is the default case.
    ELIGIBILITY_CRITERIA_UNSPECIFIED = 0;

    // The service is eligible for Data Transfer Essentials configuration only
    // for Premium Tier.
    NETWORK_SERVICE_TIER_PREMIUM_ONLY = 1;

    // The service is eligible for Data Transfer Essentials configuration only
    // for Standard Tier.
    NETWORK_SERVICE_TIER_STANDARD_ONLY = 2;

    // The service is eligible for Data Transfer Essentials configuration only
    // for the regional endpoint.
    REQUEST_ENDPOINT_REGIONAL_ENDPOINT_ONLY = 3;
  }

  // Output only. The eligibility criteria for the service.
  EligibilityCriteria eligibility_criteria = 1
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The end time for eligibility criteria support. If not
  // specified, no planned end time is set.
  google.protobuf.Timestamp support_end_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Request message to check if a service in your project in a region is
// eligible for Data Transfer Essentials configuration.
message GetMulticloudDataTransferSupportedServiceRequest {
  // Required. The name of the service.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/MulticloudDataTransferSupportedService"
    }
  ];
}

// Request message to list the services in your project that are eligible for
// Data Transfer Essentials configuration.
message ListMulticloudDataTransferSupportedServicesRequest {
  // Required. The name of the parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Optional. The maximum number of results listed per page.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Response message to list the services in your project in regions that are
// eligible for Data Transfer Essentials configuration.
message ListMulticloudDataTransferSupportedServicesResponse {
  // The list of supported services.
  repeated MulticloudDataTransferSupportedService
      multicloud_data_transfer_supported_services = 1;

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