// Copyright 2024 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/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 = "HubProto";
option java_package = "com.google.cloud.networkconnectivity.v1";
option php_namespace = "Google\\Cloud\\NetworkConnectivity\\V1";
option ruby_package = "Google::Cloud::NetworkConnectivity::V1";
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/VpnTunnel"
  pattern: "projects/{project}/regions/{region}/vpnTunnels/{resource_id}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Instance"
  pattern: "projects/{project}/zones/{zone}/instances/{instance}"
};

// Network Connectivity Center is a hub-and-spoke abstraction for network
// connectivity management in Google Cloud. It reduces operational complexity
// through a simple, centralized connectivity management model.
service HubService {
  option (google.api.default_host) = "networkconnectivity.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Lists the Network Connectivity Center hubs associated with a given project.
  rpc ListHubs(ListHubsRequest) returns (ListHubsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/global}/hubs"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details about a Network Connectivity Center hub.
  rpc GetHub(GetHubRequest) returns (Hub) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/global/hubs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new Network Connectivity Center hub in the specified project.
  rpc CreateHub(CreateHubRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/global}/hubs"
      body: "hub"
    };
    option (google.api.method_signature) = "parent,hub,hub_id";
    option (google.longrunning.operation_info) = {
      response_type: "Hub"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the description and/or labels of a Network Connectivity Center
  // hub.
  rpc UpdateHub(UpdateHubRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{hub.name=projects/*/locations/global/hubs/*}"
      body: "hub"
    };
    option (google.api.method_signature) = "hub,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Hub"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a Network Connectivity Center hub.
  rpc DeleteHub(DeleteHubRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/global/hubs/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Lists the Network Connectivity Center spokes associated with a
  // specified hub and location. The list includes both spokes that are attached
  // to the hub and spokes that have been proposed but not yet accepted.
  rpc ListHubSpokes(ListHubSpokesRequest) returns (ListHubSpokesResponse) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/global/hubs/*}:listSpokes"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists the Network Connectivity Center spokes in a specified project and
  // location.
  rpc ListSpokes(ListSpokesRequest) returns (ListSpokesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/spokes"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details about a Network Connectivity Center spoke.
  rpc GetSpoke(GetSpokeRequest) returns (Spoke) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/spokes/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a Network Connectivity Center spoke.
  rpc CreateSpoke(CreateSpokeRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/spokes"
      body: "spoke"
    };
    option (google.api.method_signature) = "parent,spoke,spoke_id";
    option (google.longrunning.operation_info) = {
      response_type: "Spoke"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a Network Connectivity Center spoke.
  rpc UpdateSpoke(UpdateSpokeRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{spoke.name=projects/*/locations/*/spokes/*}"
      body: "spoke"
    };
    option (google.api.method_signature) = "spoke,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Spoke"
      metadata_type: "OperationMetadata"
    };
  }

  // Rejects a Network Connectivity Center spoke from being attached to a hub.
  // If the spoke was previously in the `ACTIVE` state, it
  // transitions to the `INACTIVE` state and is no longer able to
  // connect to other spokes that are attached to the hub.
  rpc RejectHubSpoke(RejectHubSpokeRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/global/hubs/*}:rejectSpoke"
      body: "*"
    };
    option (google.api.method_signature) = "name,spoke_uri";
    option (google.longrunning.operation_info) = {
      response_type: "RejectHubSpokeResponse"
      metadata_type: "OperationMetadata"
    };
  }

  // Accepts a proposal to attach a Network Connectivity Center spoke
  // to a hub.
  rpc AcceptHubSpoke(AcceptHubSpokeRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/global/hubs/*}:acceptSpoke"
      body: "*"
    };
    option (google.api.method_signature) = "name,spoke_uri";
    option (google.longrunning.operation_info) = {
      response_type: "AcceptHubSpokeResponse"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a Network Connectivity Center spoke.
  rpc DeleteSpoke(DeleteSpokeRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/spokes/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }

  // Gets details about a Network Connectivity Center route table.
  rpc GetRouteTable(GetRouteTableRequest) returns (RouteTable) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/global/hubs/*/routeTables/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Gets details about the specified route.
  rpc GetRoute(GetRouteRequest) returns (Route) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/global/hubs/*/routeTables/*/routes/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists routes in a given project.
  rpc ListRoutes(ListRoutesRequest) returns (ListRoutesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/global/hubs/*/routeTables/*}/routes"
    };
    option (google.api.method_signature) = "parent";
  }

  // Lists route tables in a given project.
  rpc ListRouteTables(ListRouteTablesRequest)
      returns (ListRouteTablesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/global/hubs/*}/routeTables"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details about a Network Connectivity Center group.
  rpc GetGroup(GetGroupRequest) returns (Group) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/global/hubs/*/groups/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists groups in a given hub.
  rpc ListGroups(ListGroupsRequest) returns (ListGroupsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/global/hubs/*}/groups"
    };
    option (google.api.method_signature) = "parent";
  }
}

// Supported features for a location
enum LocationFeature {
  // No publicly supported feature in this location
  LOCATION_FEATURE_UNSPECIFIED = 0;

  // Site-to-cloud spokes are supported in this location
  SITE_TO_CLOUD_SPOKES = 1;

  // Site-to-site spokes are supported in this location
  SITE_TO_SITE_SPOKES = 2;
}

// The route's type
enum RouteType {
  // No route type information specified
  ROUTE_TYPE_UNSPECIFIED = 0;

  // The route leads to a destination within the primary address range of the
  // VPC network's subnet.
  VPC_PRIMARY_SUBNET = 1;

  // The route leads to a destination within the secondary address range of the
  // VPC network's subnet.
  VPC_SECONDARY_SUBNET = 2;
}

// The State enum represents the lifecycle stage of a Network Connectivity
// Center resource.
enum State {
  // No state information available
  STATE_UNSPECIFIED = 0;

  // The resource's create operation is in progress.
  CREATING = 1;

  // The resource is active
  ACTIVE = 2;

  // The resource's delete operation is in progress.
  DELETING = 3;

  // The resource's accept operation is in progress.
  ACCEPTING = 8;

  // The resource's reject operation is in progress.
  REJECTING = 9;

  // The resource's update operation is in progress.
  UPDATING = 6;

  // The resource is inactive.
  INACTIVE = 7;

  // The hub associated with this spoke resource has been deleted.
  // This state applies to spoke resources only.
  OBSOLETE = 10;
}

// The SpokeType enum represents the type of spoke. The type
// reflects the kind of resource that a spoke is associated with.
enum SpokeType {
  // Unspecified spoke type.
  SPOKE_TYPE_UNSPECIFIED = 0;

  // Spokes associated with VPN tunnels.
  VPN_TUNNEL = 1;

  // Spokes associated with VLAN attachments.
  INTERCONNECT_ATTACHMENT = 2;

  // Spokes associated with router appliance instances.
  ROUTER_APPLIANCE = 3;

  // Spokes associated with VPC networks.
  VPC_NETWORK = 4;
}

// A Network Connectivity Center hub is a global management resource to which
// you attach spokes. A single hub can contain spokes from multiple regions.
// However, if any of a hub's spokes use the site-to-site data transfer feature,
// the resources associated with those spokes must all be in the same VPC
// network. Spokes that do not use site-to-site data transfer can be associated
// with any VPC network in your project.
message Hub {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/Hub"
    pattern: "projects/{project}/locations/global/hubs/{hub}"
  };

  // Immutable. The name of the hub. Hub names must be unique. They use the
  // following form:
  //     `projects/{project_number}/locations/global/hubs/{hub_id}`
  string name = 1 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The time the hub was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the hub was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional labels in key-value pair format. For more information about
  // labels, see [Requirements for
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements).
  map<string, string> labels = 4;

  // An optional description of the hub.
  string description = 5;

  // Output only. The Google-generated UUID for the hub. This value is unique
  // across all hub resources. If a hub is deleted and another with the same
  // name is created, the new hub is assigned a different unique_id.
  string unique_id = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current lifecycle state of this hub.
  State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The VPC networks associated with this hub's spokes.
  //
  // This field is read-only. Network Connectivity Center automatically
  // populates it based on the set of spokes attached to the hub.
  repeated RoutingVPC routing_vpcs = 10;

  // Output only. The route tables that belong to this hub. They use the
  // following form:
  //    `projects/{project_number}/locations/global/hubs/{hub_id}/routeTables/{route_table_id}`
  //
  // This field is read-only. Network Connectivity Center automatically
  // populates it based on the route tables nested under the hub.
  repeated string route_tables = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. A summary of the spokes associated with a hub. The
  // summary includes a count of spokes according to type
  // and according to state. If any spokes are inactive,
  // the summary also lists the reasons they are inactive,
  // including a count for each reason.
  SpokeSummary spoke_summary = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// RoutingVPC contains information about the VPC networks associated
// with the spokes of a Network Connectivity Center hub.
message RoutingVPC {
  // The URI of the VPC network.
  string uri = 1 [
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];

  // Output only. If true, indicates that this VPC network is currently
  // associated with spokes that use the data transfer feature (spokes where the
  // site_to_site_data_transfer field is set to true). If you create new spokes
  // that use data transfer, they must be associated with this VPC network. At
  // most, one VPC network will have this field set to true.
  bool required_for_new_site_to_site_data_transfer_spokes = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A Network Connectivity Center spoke represents one or more network
// connectivity resources.
//
// When you create a spoke, you associate it with a hub. You must also
// identify a value for exactly one of the following fields:
//
// * linked_vpn_tunnels
// * linked_interconnect_attachments
// * linked_router_appliance_instances
// * linked_vpc_network
message Spoke {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/Spoke"
    pattern: "projects/{project}/locations/{location}/spokes/{spoke}"
  };

  // The reason a spoke is inactive.
  message StateReason {
    // The Code enum represents the various reasons a state can be `INACTIVE`.
    enum Code {
      // No information available.
      CODE_UNSPECIFIED = 0;

      // The proposed spoke is pending review.
      PENDING_REVIEW = 1;

      // The proposed spoke has been rejected by the hub administrator.
      REJECTED = 2;

      // The spoke has been deactivated internally.
      PAUSED = 3;

      // Network Connectivity Center encountered errors while accepting
      // the spoke.
      FAILED = 4;
    }

    // The code associated with this reason.
    Code code = 1;

    // Human-readable details about this reason.
    string message = 2;

    // Additional information provided by the user in the RejectSpoke call.
    string user_details = 3;
  }

  // Immutable. The name of the spoke. Spoke names must be unique. They use the
  // following form:
  //     `projects/{project_number}/locations/{region}/spokes/{spoke_id}`
  string name = 1 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The time the spoke was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the spoke was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional labels in key-value pair format. For more information about
  // labels, see [Requirements for
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements).
  map<string, string> labels = 4;

  // An optional description of the spoke.
  string description = 5;

  // Immutable. The name of the hub that this spoke is attached to.
  string hub = 6 [
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // Optional. The name of the group that this spoke is associated with.
  string group = 23 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Group"
    }
  ];

  // VPN tunnels that are associated with the spoke.
  LinkedVpnTunnels linked_vpn_tunnels = 17;

  // VLAN attachments that are associated with the spoke.
  LinkedInterconnectAttachments linked_interconnect_attachments = 18;

  // Router appliance instances that are associated with the spoke.
  LinkedRouterApplianceInstances linked_router_appliance_instances = 19;

  // Optional. VPC network that is associated with the spoke.
  LinkedVpcNetwork linked_vpc_network = 20
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. The Google-generated UUID for the spoke. This value is unique
  // across all spoke resources. If a spoke is deleted and another with the same
  // name is created, the new spoke is assigned a different `unique_id`.
  string unique_id = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current lifecycle state of this spoke.
  State state = 15 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The reasons for current state of the spoke. Only present when
  // the spoke is in the `INACTIVE` state.
  repeated StateReason reasons = 21 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The type of resource associated with the spoke.
  SpokeType spoke_type = 22 [(google.api.field_behavior) = OUTPUT_ONLY];
}

message RouteTable {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/RouteTable"
    pattern: "projects/{project}/locations/global/hubs/{hub}/routeTables/{route_table}"
  };

  // Immutable. The name of the route table. Route table names must be unique.
  // They use the following form:
  //      `projects/{project_number}/locations/global/hubs/{hub}/routeTables/{route_table_id}`
  string name = 1 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The time the route table was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the route table was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional labels in key-value pair format. For more information about
  // labels, see [Requirements for
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements).
  map<string, string> labels = 4;

  // An optional description of the route table.
  string description = 5;

  // Output only. The Google-generated UUID for the route table. This value is
  // unique across all route table resources. If a route table is deleted and
  // another with the same name is created, the new route table is assigned
  // a different `uid`.
  string uid = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current lifecycle state of this route table.
  State state = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A route defines a path from VM instances within a spoke to a specific
// destination resource. Only VPC spokes have routes.
message Route {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/HubRoute"
    pattern: "projects/{project}/locations/global/hubs/{hub}/routeTables/{route_table}/routes/{route}"
  };

  // Immutable. The name of the route. Route names must be unique. Route names
  // use the following form:
  //      `projects/{project_number}/locations/global/hubs/{hub}/routeTables/{route_table_id}/routes/{route_id}`
  string name = 3 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The time the route was created.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the route was last updated.
  google.protobuf.Timestamp update_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // The destination IP address range.
  string ip_cidr_range = 1;

  // Output only. The route's type. Its type is determined by the properties of
  // its IP address range.
  RouteType type = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The destination VPC network for packets on this route.
  NextHopVpcNetwork next_hop_vpc_network = 2
      [(google.api.field_behavior) = IMMUTABLE];

  // Optional labels in key-value pair format. For more information about
  // labels, see [Requirements for
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements).
  map<string, string> labels = 6;

  // An optional description of the route.
  string description = 7;

  // Output only. The Google-generated UUID for the route. This value is unique
  // across all Network Connectivity Center route resources. If a
  // route is deleted and another with the same name is created,
  // the new route is assigned a different `uid`.
  string uid = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current lifecycle state of the route.
  State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The spoke that this route leads to.
  // Example: projects/12345/locations/global/spokes/SPOKE
  string spoke = 11 [
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Spoke"
    }
  ];

  // Output only. The location of the route.
  // Uses the following form: "projects/{project}/locations/{location}"
  // Example: projects/1234/locations/us-central1
  string location = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A group represents a subset of spokes attached to a hub.
message Group {
  option (google.api.resource) = {
    type: "networkconnectivity.googleapis.com/Group"
    pattern: "projects/{project}/locations/global/hubs/{hub}/groups/{group}"
  };

  // Immutable. The name of the group. Group names must be unique. They
  // use the following form:
  //      `projects/{project_number}/locations/global/hubs/{hub}/groups/{group_id}`
  string name = 1 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The time the group was created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time the group was last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Labels in key-value pair format. For more information about
  // labels, see [Requirements for
  // labels](https://cloud.google.com/resource-manager/docs/creating-managing-labels#requirements).
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The description of the group.
  string description = 5 [(google.api.field_behavior) = OPTIONAL];

  // Output only. The Google-generated UUID for the group. This value is unique
  // across all group resources. If a group is deleted and
  // another with the same name is created, the new route table is assigned
  // a different unique_id.
  string uid = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The current lifecycle state of this group.
  State state = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Request for
// [HubService.ListHubs][google.cloud.networkconnectivity.v1.HubService.ListHubs]
// method.
message ListHubsRequest {
  // Required. The parent resource's name.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // The maximum number of results per page to return.
  int32 page_size = 2;

  // The page token.
  string page_token = 3;

  // An expression that filters the list of results.
  string filter = 4;

  // Sort the results by a certain order.
  string order_by = 5;
}

// Response for
// [HubService.ListHubs][google.cloud.networkconnectivity.v1.HubService.ListHubs]
// method.
message ListHubsResponse {
  // The requested hubs.
  repeated Hub hubs = 1;

  // The token for the next page of the response. To see more results,
  // use this value as the page_token for your next request. If this value
  // is empty, there are no more results.
  string next_page_token = 2;

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

// Request for
// [HubService.GetHub][google.cloud.networkconnectivity.v1.HubService.GetHub]
// method.
message GetHubRequest {
  // Required. The name of the hub resource to get.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];
}

// Request for
// [HubService.CreateHub][google.cloud.networkconnectivity.v1.HubService.CreateHub]
// method.
message CreateHubRequest {
  // Required. The parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. A unique identifier for the hub.
  string hub_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The initial values for a new hub.
  Hub hub = 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 knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// Request for
// [HubService.UpdateHub][google.cloud.networkconnectivity.v1.HubService.UpdateHub]
// method.
message UpdateHubRequest {
  // Optional. In the case of an update to an existing hub, field mask is used
  // to specify the fields to be overwritten. The fields specified in the
  // update_mask are relative to the resource, not the full request. A field is
  // overwritten if it is in the mask. If the user does not provide a mask, then
  // all fields are overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Required. The state that the hub should be in after the update.
  Hub hub = 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 knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The request for
// [HubService.DeleteHub][google.cloud.networkconnectivity.v1.HubService.DeleteHub].
message DeleteHubRequest {
  // Required. The name of the hub to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID so
  // that if you must retry your request, the server knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// The request for
// [HubService.ListHubSpokes][google.cloud.networkconnectivity.v1.HubService.ListHubSpokes].
//
message ListHubSpokesRequest {
  // Enum that controls which spoke fields are included in the response.
  enum SpokeView {
    // The spoke view is unspecified. When the spoke view is unspecified, the
    // API returns the same fields as the `BASIC` view.
    SPOKE_VIEW_UNSPECIFIED = 0;

    // Includes `name`, `create_time`, `hub`, `unique_id`, `state`, `reasons`,
    // and `spoke_type`. This is the default value.
    BASIC = 1;

    // Includes all spoke fields except `labels`.
    // You can use the `DETAILED` view only when you set the `spoke_locations`
    // field to `[global]`.
    DETAILED = 2;
  }

  // Required. The name of the hub.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // A list of locations.
  // Specify one of the following: `[global]`, a single region (for
  // example, `[us-central1]`), or a combination of
  // values (for example, `[global, us-central1, us-west1]`).
  // If the spoke_locations field is populated, the list of results
  // includes only spokes in the specified location.
  // If the spoke_locations field is not populated, the list of results
  // includes spokes in all locations.
  repeated string spoke_locations = 2;

  // The maximum number of results to return per page.
  int32 page_size = 3;

  // The page token.
  string page_token = 4;

  // An expression that filters the list of results.
  string filter = 5;

  // Sort the results by name or create_time.
  string order_by = 6;

  // The view of the spoke to return.
  // The view that you use determines which spoke fields are included in the
  // response.
  SpokeView view = 7;
}

// The response for
// [HubService.ListHubSpokes][google.cloud.networkconnectivity.v1.HubService.ListHubSpokes].
message ListHubSpokesResponse {
  // The requested spokes.
  // The spoke fields can be partially populated based on the `view` field in
  // the request message.
  repeated Spoke spokes = 1;

  // The token for the next page of the response. To see more results,
  // use this value as the page_token for your next request. If this value
  // is empty, there are no more results.
  string next_page_token = 2;

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

// The request for
// [HubService.ListSpokes][google.cloud.networkconnectivity.v1.HubService.ListSpokes].
message ListSpokesRequest {
  // Required. The parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // The maximum number of results to return per page.
  int32 page_size = 2;

  // The page token.
  string page_token = 3;

  // An expression that filters the list of results.
  string filter = 4;

  // Sort the results by a certain order.
  string order_by = 5;
}

// The response for
// [HubService.ListSpokes][google.cloud.networkconnectivity.v1.HubService.ListSpokes].
message ListSpokesResponse {
  // The requested spokes.
  repeated Spoke spokes = 1;

  // The token for the next page of the response. To see more results,
  // use this value as the page_token for your next request. If this value
  // is empty, there are no more results.
  string next_page_token = 2;

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

// The request for
// [HubService.GetSpoke][google.cloud.networkconnectivity.v1.HubService.GetSpoke].
message GetSpokeRequest {
  // Required. The name of the spoke resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Spoke"
    }
  ];
}

// The request for
// [HubService.CreateSpoke][google.cloud.networkconnectivity.v1.HubService.CreateSpoke].
message CreateSpokeRequest {
  // Required. The parent resource.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. Unique id for the spoke to create.
  string spoke_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The initial values for a new spoke.
  Spoke spoke = 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 knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}

// Request for
// [HubService.UpdateSpoke][google.cloud.networkconnectivity.v1.HubService.UpdateSpoke]
// method.
message UpdateSpokeRequest {
  // Optional. In the case of an update to an existing spoke, field mask is used
  // to specify the fields to be overwritten. The fields specified in the
  // update_mask are relative to the resource, not the full request. A field is
  // overwritten if it is in the mask. If the user does not provide a mask, then
  // all fields are overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Required. The state that the spoke should be in after the update.
  Spoke spoke = 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 knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The request for
// [HubService.DeleteSpoke][google.cloud.networkconnectivity.v1.HubService.DeleteSpoke].
message DeleteSpokeRequest {
  // Required. The name of the spoke to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Spoke"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID so
  // that if you must retry your request, the server knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
}

// The request for
// [HubService.AcceptHubSpoke][google.cloud.networkconnectivity.v1.HubService.AcceptHubSpoke].
message AcceptHubSpokeRequest {
  // Required. The name of the hub into which to accept the spoke.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // Required. The URI of the spoke to accept into the hub.
  string spoke_uri = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Spoke"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID so
  // that if you must retry your request, the server knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The response for
// [HubService.AcceptHubSpoke][google.cloud.networkconnectivity.v1.HubService.AcceptHubSpoke].
message AcceptHubSpokeResponse {
  // The spoke that was operated on.
  Spoke spoke = 1;
}

// The request for
// [HubService.RejectHubSpoke][google.cloud.networkconnectivity.v1.HubService.RejectHubSpoke].
message RejectHubSpokeRequest {
  // Required. The name of the hub from which to reject the spoke.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // Required. The URI of the spoke to reject from the hub.
  string spoke_uri = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Spoke"
    }
  ];

  // Optional. A request ID to identify requests. Specify a unique request ID so
  // that if you must retry your request, the server knows to ignore the request
  // if it has already been completed. The server guarantees that a request
  // doesn't result in creation of duplicate commitments for at least 60
  // minutes.
  //
  // 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 to see whether the original operation
  // was received. If it was, the server ignores the second request. This
  // behavior prevents clients from mistakenly creating duplicate commitments.
  //
  // The request ID must be a valid UUID, with the exception that zero UUID is
  // not supported (00000000-0000-0000-0000-000000000000).
  string request_id = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Additional information provided by the hub administrator.
  string details = 4 [(google.api.field_behavior) = OPTIONAL];
}

// The response for
// [HubService.RejectHubSpoke][google.cloud.networkconnectivity.v1.HubService.RejectHubSpoke].
message RejectHubSpokeResponse {
  // The spoke that was operated on.
  Spoke spoke = 1;
}

// The request for
// [HubService.GetRouteTable][google.cloud.networkconnectivity.v1.HubService.GetRouteTable].
message GetRouteTableRequest {
  // Required. The name of the route table resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/RouteTable"
    }
  ];
}

// The request for
// [HubService.GetRoute][google.cloud.networkconnectivity.v1.HubService.GetRoute].
message GetRouteRequest {
  // Required. The name of the route resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/HubRoute"
    }
  ];
}

// Request for
// [HubService.ListRoutes][google.cloud.networkconnectivity.v1.HubService.ListRoutes]
// method.
message ListRoutesRequest {
  // Required. The parent resource's name.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/RouteTable"
    }
  ];

  // The maximum number of results to return per page.
  int32 page_size = 2;

  // The page token.
  string page_token = 3;

  // An expression that filters the list of results.
  string filter = 4;

  // Sort the results by a certain order.
  string order_by = 5;
}

// Response for
// [HubService.ListRoutes][google.cloud.networkconnectivity.v1.HubService.ListRoutes]
// method.
message ListRoutesResponse {
  // The requested routes.
  repeated Route routes = 1;

  // The token for the next page of the response. To see more results,
  // use this value as the page_token for your next request. If this value
  // is empty, there are no more results.
  string next_page_token = 2;

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

// Request for
// [HubService.ListRouteTables][google.cloud.networkconnectivity.v1.HubService.ListRouteTables]
// method.
message ListRouteTablesRequest {
  // Required. The parent resource's name.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // The maximum number of results to return per page.
  int32 page_size = 2;

  // The page token.
  string page_token = 3;

  // An expression that filters the list of results.
  string filter = 4;

  // Sort the results by a certain order.
  string order_by = 5;
}

// Response for
// [HubService.ListRouteTables][google.cloud.networkconnectivity.v1.HubService.ListRouteTables]
// method.
message ListRouteTablesResponse {
  // The requested route tables.
  repeated RouteTable route_tables = 1;

  // The token for the next page of the response. To see more results,
  // use this value as the page_token for your next request. If this value
  // is empty, there are no more results.
  string next_page_token = 2;

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

// Request for
// [HubService.ListGroups][google.cloud.networkconnectivity.v1.HubService.ListGroups]
// method.
message ListGroupsRequest {
  // Required. The parent resource's name.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Hub"
    }
  ];

  // The maximum number of results to return per page.
  int32 page_size = 2;

  // The page token.
  string page_token = 3;

  // An expression that filters the list of results.
  string filter = 4;

  // Sort the results by a certain order.
  string order_by = 5;
}

// Response for
// [HubService.ListGroups][google.cloud.networkconnectivity.v1.HubService.ListGroups]
// method.
message ListGroupsResponse {
  // The requested groups.
  repeated Group groups = 1;

  // The token for the next page of the response. To see more results,
  // use this value as the page_token for your next request. If this value
  // is empty, there are no more results.
  string next_page_token = 2;

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

// A collection of Cloud VPN tunnel resources. These resources should be
// redundant HA VPN tunnels that all advertise the same prefixes to Google
// Cloud. Alternatively, in a passive/active configuration, all tunnels
// should be capable of advertising the same prefixes.
message LinkedVpnTunnels {
  // The URIs of linked VPN tunnel resources.
  repeated string uris = 1 [(google.api.resource_reference) = {
    type: "compute.googleapis.com/VpnTunnel"
  }];

  // A value that controls whether site-to-site data transfer is enabled for
  // these resources. Data transfer is available only in [supported
  // locations](https://cloud.google.com/network-connectivity/docs/network-connectivity-center/concepts/locations).
  bool site_to_site_data_transfer = 2;

  // Output only. The VPC network where these VPN tunnels are located.
  string vpc_network = 3 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];
}

// A collection of VLAN attachment resources. These resources should
// be redundant attachments that all advertise the same prefixes to Google
// Cloud. Alternatively, in active/passive configurations, all attachments
// should be capable of advertising the same prefixes.
message LinkedInterconnectAttachments {
  // The URIs of linked interconnect attachment resources
  repeated string uris = 1 [(google.api.resource_reference) = {
    type: "compute.googleapis.com/InterconnectAttachment"
  }];

  // A value that controls whether site-to-site data transfer is enabled for
  // these resources. Data transfer is available only in [supported
  // locations](https://cloud.google.com/network-connectivity/docs/network-connectivity-center/concepts/locations).
  bool site_to_site_data_transfer = 2;

  // Output only. The VPC network where these VLAN attachments are located.
  string vpc_network = 3 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];
}

// A collection of router appliance instances. If you configure multiple router
// appliance instances to receive data from the same set of sites outside of
// Google Cloud, we recommend that you associate those instances with the same
// spoke.
message LinkedRouterApplianceInstances {
  // The list of router appliance instances.
  repeated RouterApplianceInstance instances = 1;

  // A value that controls whether site-to-site data transfer is enabled for
  // these resources. Data transfer is available only in [supported
  // locations](https://cloud.google.com/network-connectivity/docs/network-connectivity-center/concepts/locations).
  bool site_to_site_data_transfer = 2;

  // Output only. The VPC network where these router appliance instances are
  // located.
  string vpc_network = 3 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];
}

// An existing VPC network.
message LinkedVpcNetwork {
  // Required. The URI of the VPC network resource.
  string uri = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];

  // Optional. IP ranges encompassing the subnets to be excluded from peering.
  repeated string exclude_export_ranges = 2
      [(google.api.field_behavior) = OPTIONAL];
}

// A router appliance instance is a Compute Engine virtual machine (VM) instance
// that acts as a BGP speaker. A router appliance instance is specified by the
// URI of the VM and the internal IP address of one of the VM's network
// interfaces.
message RouterApplianceInstance {
  // The URI of the VM.
  string virtual_machine = 1 [(google.api.resource_reference) = {
    type: "compute.googleapis.com/Instance"
  }];

  // The IP address on the VM to use for peering.
  string ip_address = 3;
}

// Metadata about locations
message LocationMetadata {
  // List of supported features
  repeated LocationFeature location_features = 1;
}

message NextHopVpcNetwork {
  // The URI of the VPC network resource
  string uri = 1 [
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];
}

// Summarizes information about the spokes associated with a hub.
// The summary includes a count of spokes according to type
// and according to state. If any spokes are inactive,
// the summary also lists the reasons they are inactive,
// including a count for each reason.
message SpokeSummary {
  // The number of spokes of a given type that are associated
  // with a specific hub. The type indicates what kind of
  // resource is associated with the spoke.
  message SpokeTypeCount {
    // Output only. The type of the spokes.
    SpokeType spoke_type = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total number of spokes of this type that are
    // associated with the hub.
    int64 count = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // The number of spokes that are in a particular state
  // and associated with a given hub.
  message SpokeStateCount {
    // Output only. The state of the spokes.
    State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total number of spokes that are in this state
    // and associated with a given hub.
    int64 count = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // The number of spokes in the hub that are inactive for this reason.
  message SpokeStateReasonCount {
    // Output only. The reason that a spoke is inactive.
    Spoke.StateReason.Code state_reason_code = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total number of spokes that are inactive for a
    // particular reason and associated with a given hub.
    int64 count = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. Counts the number of spokes of each type that are
  // associated with a specific hub.
  repeated SpokeTypeCount spoke_type_counts = 1
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Counts the number of spokes that are in each state
  // and associated with a given hub.
  repeated SpokeStateCount spoke_state_counts = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Counts the number of spokes that are inactive for each
  // possible reason and associated with a given hub.
  repeated SpokeStateReasonCount spoke_state_reason_counts = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The request for
// [HubService.GetGroup][google.cloud.networkconnectivity.v1.HubService.GetGroup].
message GetGroupRequest {
  // Required. The name of the route table resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "networkconnectivity.googleapis.com/Group"
    }
  ];
}
