// 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.edgecontainer.v1; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/status.proto"; option go_package = "cloud.google.com/go/edgecontainer/apiv1/edgecontainerpb;edgecontainerpb"; option java_multiple_files = true; option java_outer_classname = "ResourcesProto"; option java_package = "com.google.cloud.edgecontainer.v1"; option (google.api.resource_definition) = { type: "cloudkms.googleapis.com/CryptoKey" pattern: "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}" }; option (google.api.resource_definition) = { type: "cloudkms.googleapis.com/CryptoKeyVersion" pattern: "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}/cryptoKeyVersions/{crypto_key_version}" }; // Represents the accessibility state of a customer-managed KMS key used for // CMEK integration. enum KmsKeyState { // Unspecified. KMS_KEY_STATE_UNSPECIFIED = 0; // The key is available for use, and dependent resources should be accessible. KMS_KEY_STATE_KEY_AVAILABLE = 1; // The key is unavailable for an unspecified reason. Dependent resources may // be inaccessible. KMS_KEY_STATE_KEY_UNAVAILABLE = 2; } // A Google Distributed Cloud Edge Kubernetes cluster. message Cluster { option (google.api.resource) = { type: "edgecontainer.googleapis.com/Cluster" pattern: "projects/{project}/locations/{location}/clusters/{cluster}" }; // Configuration of the cluster control plane. message ControlPlane { // Configuration specific to clusters with a control plane hosted remotely. message Remote {} // Configuration specific to clusters with a control plane hosted locally. // // Warning: Local control plane clusters must be created in their own // project. Local control plane clusters cannot coexist in the same // project with any other type of clusters, including non-GDCE clusters. // Mixing local control plane GDCE clusters with any other type of // clusters in the same project can result in data loss. message Local { // Name of the Google Distributed Cloud Edge zones where this node pool // will be created. For example: `us-central1-edge-customer-a`. string node_location = 1; // The number of nodes to serve as replicas of the Control Plane. int32 node_count = 2; // Only machines matching this filter will be allowed to host control // plane nodes. The filtering language accepts strings like "name=", // and is documented here: [AIP-160](https://google.aip.dev/160). string machine_filter = 3; // Policy configuration about how user applications are deployed. SharedDeploymentPolicy shared_deployment_policy = 4; } // Represents the policy configuration about how user applications are // deployed. enum SharedDeploymentPolicy { // Unspecified. SHARED_DEPLOYMENT_POLICY_UNSPECIFIED = 0; // User applications can be deployed both on control plane and worker // nodes. ALLOWED = 1; // User applications can not be deployed on control plane nodes and can // only be deployed on worker nodes. DISALLOWED = 2; } oneof config { // Remote control plane configuration. Remote remote = 1; // Local control plane configuration. // // Warning: Local control plane clusters must be created in their own // project. Local control plane clusters cannot coexist in the same // project with any other type of clusters, including non-GDCE clusters. // Mixing local control plane GDCE clusters with any other type of // clusters in the same project can result in data loss. Local local = 2; } } // Config that customers are allowed to define for GDCE system add-ons. message SystemAddonsConfig { // Config for the Ingress add-on which allows customers to create an Ingress // object to manage external access to the servers in a cluster. The add-on // consists of istiod and istio-ingress. message Ingress { // Optional. Whether Ingress is disabled. bool disabled = 1 [(google.api.field_behavior) = OPTIONAL]; // Optional. Ingress VIP. string ipv4_vip = 2 [(google.api.field_behavior) = OPTIONAL]; } // Optional. Config for Ingress. Ingress ingress = 1 [(google.api.field_behavior) = OPTIONAL]; } // Configuration for Customer-managed KMS key support for remote control plane // cluster disk encryption. message ControlPlaneEncryption { // Immutable. The Cloud KMS CryptoKey e.g. // projects/{project}/locations/{location}/keyRings/{keyRing}/cryptoKeys/{cryptoKey} // to use for protecting control plane disks. If not specified, a // Google-managed key will be used instead. string kms_key = 1 [ (google.api.field_behavior) = IMMUTABLE, (google.api.resource_reference) = { type: "cloudkms.googleapis.com/CryptoKey" } ]; // Output only. The Cloud KMS CryptoKeyVersion currently in use for // protecting control plane disks. Only applicable if kms_key is set. string kms_key_active_version = 2 [ (google.api.field_behavior) = OUTPUT_ONLY, (google.api.resource_reference) = { type: "cloudkms.googleapis.com/CryptoKeyVersion" } ]; // Output only. Availability of the Cloud KMS CryptoKey. If not // `KEY_AVAILABLE`, then nodes may go offline as they cannot access their // local data. This can be caused by a lack of permissions to use the key, // or if the key is disabled or deleted. KmsKeyState kms_key_state = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Error status returned by Cloud KMS when using this key. This // field may be populated only if `kms_key_state` is not // `KMS_KEY_STATE_KEY_AVAILABLE`. If populated, this field contains the // error status reported by Cloud KMS. google.rpc.Status kms_status = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; } // A Maintenance Event is an operation that could cause temporary disruptions // to the cluster workloads, including Google-driven or user-initiated cluster // upgrades, user-initiated cluster configuration changes that require // restarting nodes, etc. message MaintenanceEvent { // Indicates the maintenance event type. enum Type { // Unspecified. TYPE_UNSPECIFIED = 0; // Upgrade initiated by users. USER_INITIATED_UPGRADE = 1; // Upgrade driven by Google. GOOGLE_DRIVEN_UPGRADE = 2; } // Indicates when the maintenance event should be performed. enum Schedule { // Unspecified. SCHEDULE_UNSPECIFIED = 0; // Immediately after receiving the request. IMMEDIATELY = 1; } // Indicates the maintenance event state. enum State { // Unspecified. STATE_UNSPECIFIED = 0; // The maintenance event is ongoing. The cluster might be unusable. RECONCILING = 1; // The maintenance event succeeded. SUCCEEDED = 2; // The maintenance event failed. FAILED = 3; } // Output only. UUID of the maintenance event. string uuid = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The target version of the cluster. string target_version = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The operation for running the maintenance event. Specified // in the format projects/*/locations/*/operations/*. If the maintenance // event is split into multiple operations (e.g. due to maintenance // windows), the latest one is recorded. string operation = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The type of the maintenance event. Type type = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The schedule of the maintenance event. Schedule schedule = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The state of the maintenance event. State state = 6 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the maintenance event request was created. google.protobuf.Timestamp create_time = 7 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the maintenance event started. google.protobuf.Timestamp start_time = 8 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the maintenance event ended, either // successfully or not. If the maintenance event is split into multiple // maintenance windows, end_time is only updated when the whole flow ends. google.protobuf.Timestamp end_time = 9 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the maintenance event message was updated. google.protobuf.Timestamp update_time = 10 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Configuration of the cluster survivability, e.g., for the case when network // connectivity is lost. message SurvivabilityConfig { // Optional. Time period that allows the cluster nodes to be rebooted and // become functional without network connectivity to Google. The default 0 // means not allowed. The maximum is 7 days. google.protobuf.Duration offline_reboot_ttl = 1 [(google.api.field_behavior) = OPTIONAL]; } // Indicates the status of the cluster. enum Status { // Status unknown. STATUS_UNSPECIFIED = 0; // The cluster is being created. PROVISIONING = 1; // The cluster is created and fully usable. RUNNING = 2; // The cluster is being deleted. DELETING = 3; // The status indicates that some errors occurred while reconciling/deleting // the cluster. ERROR = 4; // The cluster is undergoing some work such as version upgrades, etc. RECONCILING = 5; } // The release channel a cluster is subscribed to. enum ReleaseChannel { // Unspecified release channel. This will default to the REGULAR channel. RELEASE_CHANNEL_UNSPECIFIED = 0; // No release channel. NONE = 1; // Regular release channel. REGULAR = 2; } // Required. The resource name of the cluster. string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "edgecontainer.googleapis.com/Cluster" } ]; // Output only. The time when the cluster was created. google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the cluster was last updated. google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Labels associated with this resource. map labels = 4; // Required. Fleet configuration. Fleet fleet = 11 [(google.api.field_behavior) = REQUIRED]; // Required. Cluster-wide networking configuration. ClusterNetworking networking = 7 [(google.api.field_behavior) = REQUIRED]; // Required. Immutable. RBAC policy that will be applied and managed by GEC. Authorization authorization = 9 [ (google.api.field_behavior) = REQUIRED, (google.api.field_behavior) = IMMUTABLE ]; // Optional. The default maximum number of pods per node used if a maximum // value is not specified explicitly for a node pool in this cluster. If // unspecified, the Kubernetes default value will be used. int32 default_max_pods_per_node = 8 [(google.api.field_behavior) = OPTIONAL]; // Output only. The IP address of the Kubernetes API server. string endpoint = 6 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The port number of the Kubernetes API server. int32 port = 19 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The PEM-encoded public certificate of the cluster's CA. string cluster_ca_certificate = 10 [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. Cluster-wide maintenance policy configuration. MaintenancePolicy maintenance_policy = 12 [(google.api.field_behavior) = OPTIONAL]; // Output only. The control plane release version string control_plane_version = 13 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The lowest release version among all worker nodes. This field // can be empty if the cluster does not have any worker nodes. string node_version = 14 [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. The configuration of the cluster control plane. ControlPlane control_plane = 15 [(google.api.field_behavior) = OPTIONAL]; // Optional. The configuration of the system add-ons. SystemAddonsConfig system_addons_config = 16 [(google.api.field_behavior) = OPTIONAL]; // Optional. IPv4 address pools for cluster data plane external load // balancing. repeated string external_load_balancer_ipv4_address_pools = 17 [(google.api.field_behavior) = OPTIONAL]; // Optional. Remote control plane disk encryption options. This field is only // used when enabling CMEK support. ControlPlaneEncryption control_plane_encryption = 18 [(google.api.field_behavior) = OPTIONAL]; // Output only. The current status of the cluster. Status status = 20 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. All the maintenance events scheduled for the cluster, // including the ones ongoing, planned for the future and done in the past (up // to 90 days). repeated MaintenanceEvent maintenance_events = 21 [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. The target cluster version. For example: "1.5.0". string target_version = 22 [(google.api.field_behavior) = OPTIONAL]; // Optional. The release channel a cluster is subscribed to. ReleaseChannel release_channel = 23 [(google.api.field_behavior) = OPTIONAL]; // Optional. Configuration of the cluster survivability, e.g., for the case // when network connectivity is lost. Note: This only applies to local control // plane clusters. SurvivabilityConfig survivability_config = 24 [(google.api.field_behavior) = OPTIONAL]; // Optional. IPv6 address pools for cluster data plane external load // balancing. repeated string external_load_balancer_ipv6_address_pools = 25 [(google.api.field_behavior) = OPTIONAL]; } // Cluster-wide networking configuration. message ClusterNetworking { // Required. All pods in the cluster are assigned an RFC1918 IPv4 address from // these blocks. Only a single block is supported. This field cannot be // changed after creation. repeated string cluster_ipv4_cidr_blocks = 1 [(google.api.field_behavior) = REQUIRED]; // Required. All services in the cluster are assigned an RFC1918 IPv4 address // from these blocks. Only a single block is supported. This field cannot be // changed after creation. repeated string services_ipv4_cidr_blocks = 2 [(google.api.field_behavior) = REQUIRED]; } // Fleet related configuration. // // Fleets are a Google Cloud concept for logically organizing clusters, // letting you use and manage multi-cluster capabilities and apply // consistent policies across your systems. message Fleet { // Required. The name of the Fleet host project where this cluster will be // registered. // // Project names are formatted as // `projects/`. string project = 1 [(google.api.field_behavior) = REQUIRED]; // Output only. The name of the managed Hub Membership resource associated to // this cluster. // // Membership names are formatted as // `projects//locations/global/membership/`. string membership = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } // A user principal for an RBAC policy. message ClusterUser { // Required. An active Google username. string username = 1 [(google.api.field_behavior) = REQUIRED]; } // RBAC policy that will be applied and managed by GEC. message Authorization { // Required. User that will be granted the cluster-admin role on the cluster, // providing full access to the cluster. Currently, this is a singular field, // but will be expanded to allow multiple admins in the future. ClusterUser admin_users = 1 [(google.api.field_behavior) = REQUIRED]; } // A set of Kubernetes nodes in a cluster with common configuration and // specification. message NodePool { option (google.api.resource) = { type: "edgecontainer.googleapis.com/NodePool" pattern: "projects/{project}/locations/{location}/clusters/{cluster}/nodePools/{node_pool}" }; // Configuration for CMEK support for edge machine local disk encryption. message LocalDiskEncryption { // Immutable. The Cloud KMS CryptoKey e.g. // projects/{project}/locations/{location}/keyRings/{keyRing}/cryptoKeys/{cryptoKey} // to use for protecting node local disks. If not specified, a // Google-managed key will be used instead. string kms_key = 1 [ (google.api.field_behavior) = IMMUTABLE, (google.api.resource_reference) = { type: "cloudkms.googleapis.com/CryptoKey" } ]; // Output only. The Cloud KMS CryptoKeyVersion currently in use for // protecting node local disks. Only applicable if kms_key is set. string kms_key_active_version = 2 [ (google.api.field_behavior) = OUTPUT_ONLY, (google.api.resource_reference) = { type: "cloudkms.googleapis.com/CryptoKeyVersion" } ]; // Output only. Availability of the Cloud KMS CryptoKey. If not // `KEY_AVAILABLE`, then nodes may go offline as they cannot access their // local data. This can be caused by a lack of permissions to use the key, // or if the key is disabled or deleted. KmsKeyState kms_key_state = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Error status returned by Cloud KMS when using this key. This // field may be populated only if `kms_key_state` is not // `KMS_KEY_STATE_KEY_AVAILABLE`. If populated, this field contains the // error status reported by Cloud KMS. google.rpc.Status kms_status = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Configuration for each node in the NodePool message NodeConfig { // Optional. The Kubernetes node labels map labels = 1 [(google.api.field_behavior) = OPTIONAL]; } // Required. The resource name of the node pool. string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "edgecontainer.googleapis.com/NodePool" } ]; // Output only. The time when the node pool was created. google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the node pool was last updated. google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Labels associated with this resource. map labels = 4; // Name of the Google Distributed Cloud Edge zone where this node pool will be // created. For example: `us-central1-edge-customer-a`. string node_location = 8; // Required. The number of nodes in the pool. int32 node_count = 6 [(google.api.field_behavior) = REQUIRED]; // Only machines matching this filter will be allowed to join the node pool. // The filtering language accepts strings like "name=", and is // documented in more detail in [AIP-160](https://google.aip.dev/160). string machine_filter = 7; // Optional. Local disk encryption options. This field is only used when // enabling CMEK support. LocalDiskEncryption local_disk_encryption = 9 [(google.api.field_behavior) = OPTIONAL]; // Output only. The lowest release version among all worker nodes. string node_version = 10 [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. Configuration for each node in the NodePool NodeConfig node_config = 11 [(google.api.field_behavior) = OPTIONAL]; } // A Google Distributed Cloud Edge machine capable of acting as a Kubernetes // node. message Machine { option (google.api.resource) = { type: "edgecontainer.googleapis.com/Machine" pattern: "projects/{project}/locations/{location}/machines/{machine}" }; // Required. The resource name of the machine. string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "edgecontainer.googleapis.com/Machine" } ]; // Output only. The time when the node pool was created. google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the node pool was last updated. google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Labels associated with this resource. map labels = 4; // Canonical resource name of the node that this machine is responsible for // hosting e.g. // projects/{project}/locations/{location}/clusters/{cluster_id}/nodePools/{pool_id}/{node}, // Or empty if the machine is not assigned to assume the role of a node. // // For control plane nodes hosted on edge machines, this will return // the following format: // "projects/{project}/locations/{location}/clusters/{cluster_id}/controlPlaneNodes/{node}". string hosted_node = 5; // The Google Distributed Cloud Edge zone of this machine. string zone = 6; // Output only. The software version of the machine. string version = 7 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Whether the machine is disabled. If disabled, the machine is // unable to enter service. bool disabled = 8 [(google.api.field_behavior) = OUTPUT_ONLY]; } // A VPN connection . message VpnConnection { option (google.api.resource) = { type: "edgecontainer.googleapis.com/VpnConnection" pattern: "projects/{project}/locations/{location}/vpnConnections/{vpn_connection}" }; // Project detail of the VPC network. message VpcProject { // The project of the VPC to connect to. If not specified, it is the same as // the cluster project. string project_id = 1; // Optional. The service account in the VPC project configured by user. It // is used to create/delete Cloud Router and Cloud HA VPNs for VPN // connection. If this SA is changed during/after a VPN connection is // created, you need to remove the Cloud Router and Cloud VPN resources in // |project_id|. It is in the form of // service-{project_number}@gcp-sa-edgecontainer.iam.gserviceaccount.com. string service_account = 2 [deprecated = true, (google.api.field_behavior) = OPTIONAL]; } // The created connection details. message Details { // The Cloud Router info. message CloudRouter { // The associated Cloud Router name. string name = 1; } // The Cloud VPN info. message CloudVpn { // The created Cloud VPN gateway name. string gateway = 1; } // The current connection state. enum State { // Unknown. STATE_UNSPECIFIED = 0; // Connected. STATE_CONNECTED = 1; // Still connecting. STATE_CONNECTING = 2; // Error occurred. STATE_ERROR = 3; } // The state of this connection. State state = 1; // The error message. This is only populated when state=ERROR. string error = 2; // The Cloud Router info. CloudRouter cloud_router = 3; // Each connection has multiple Cloud VPN gateways. repeated CloudVpn cloud_vpns = 4; } // Routing mode. enum BgpRoutingMode { // Unknown. BGP_ROUTING_MODE_UNSPECIFIED = 0; // Regional mode. REGIONAL = 1; // Global mode. GLOBAL = 2; } // Required. The resource name of VPN connection string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "edgecontainer.googleapis.com/VpnConnection" } ]; // Output only. The time when the VPN connection was created. google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time when the VPN connection was last updated. google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Labels associated with this resource. map labels = 4; // NAT gateway IP, or WAN IP address. If a customer has multiple NAT IPs, the // customer needs to configure NAT such that only one external IP maps to the // GMEC Anthos cluster. This is empty if NAT is not used. string nat_gateway_ip = 5; // Dynamic routing mode of the VPC network, `regional` or `global`. BgpRoutingMode bgp_routing_mode = 6 [deprecated = true]; // The canonical Cluster name to connect to. It is in the form of // projects/{project}/locations/{location}/clusters/{cluster}. string cluster = 7 [(google.api.resource_reference) = { type: "edgecontainer.googleapis.com/Cluster" }]; // The network ID of VPC to connect to. string vpc = 8; // Optional. Project detail of the VPC network. Required if VPC is in a // different project than the cluster project. VpcProject vpc_project = 11 [(google.api.field_behavior) = OPTIONAL]; // Whether this VPN connection has HA enabled on cluster side. If enabled, // when creating VPN connection we will attempt to use 2 ANG floating IPs. bool enable_high_availability = 9; // Optional. The VPN connection Cloud Router name. string router = 12 [(google.api.field_behavior) = OPTIONAL]; // Output only. The created connection details. Details details = 10 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Metadata for a given // [google.cloud.location.Location][google.cloud.location.Location]. message LocationMetadata { // The set of available Google Distributed Cloud Edge zones in the location. // The map is keyed by the lowercase ID of each zone. map available_zones = 1; } // A Google Distributed Cloud Edge zone where edge machines are located. message ZoneMetadata { // Type of the rack. enum RackType { // Unspecified rack type, single rack also belongs to this type. RACK_TYPE_UNSPECIFIED = 0; // Base rack type, a pair of two modified Config-1 racks containing // Aggregation switches. BASE = 1; // Expansion rack type, also known as standalone racks, // added by customers on demand. EXPANSION = 2; } // Quota for resources in this zone. repeated Quota quota = 1; // The map keyed by rack name and has value of RackType. map rack_types = 2; } // Represents quota for Edge Container resources. message Quota { // Name of the quota metric. string metric = 1; // Quota limit for this metric. double limit = 2; // Current usage of this metric. double usage = 3; } // Maintenance policy configuration. message MaintenancePolicy { // Specifies the maintenance window in which maintenance may be performed. MaintenanceWindow window = 1; } // Maintenance window configuration message MaintenanceWindow { // Configuration of a recurring maintenance window. RecurringTimeWindow recurring_window = 1; } // Represents an arbitrary window of time that recurs. message RecurringTimeWindow { // The window of the first recurrence. TimeWindow window = 1; // An RRULE (https://tools.ietf.org/html/rfc5545#section-3.8.5.3) for how // this window recurs. They go on for the span of time between the start and // end time. string recurrence = 2; } // Represents an arbitrary window of time. message TimeWindow { // The time that the window first starts. google.protobuf.Timestamp start_time = 1; // The time that the window ends. The end time must take place after the // start time. google.protobuf.Timestamp end_time = 2; } // Server configuration for supported versions and release channels. message ServerConfig { // Output only. Mapping from release channel to channel config. map channels = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Supported versions, e.g.: ["1.4.0", "1.5.0"]. repeated Version versions = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Default version, e.g.: "1.4.0". string default_version = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Configuration for a release channel. message ChannelConfig { // Output only. Default version for this release channel, e.g.: "1.4.0". string default_version = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Version of a cluster. message Version { // Output only. Name of the version, e.g.: "1.4.0". string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; }