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

syntax = "proto3";

package google.container.v1;

import "google/api/annotations.proto";
import "google/protobuf/empty.proto";

option go_package = "google.golang.org/genproto/googleapis/container/v1;container";
option java_multiple_files = true;
option java_outer_classname = "ClusterServiceProto";
option java_package = "com.google.container.v1";


// Google Container Engine Cluster Manager v1
service ClusterManager {
  // Lists all clusters owned by a project in either the specified zone or all
  // zones.
  rpc ListClusters(ListClustersRequest) returns (ListClustersResponse) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/clusters" };
  }

  // Gets the details of a specific cluster.
  rpc GetCluster(GetClusterRequest) returns (Cluster) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}" };
  }

  // Creates a cluster, consisting of the specified number and type of Google
  // Compute Engine instances.
  //
  // By default, the cluster is created in the project's
  // [default network](/compute/docs/networks-and-firewalls#networks).
  //
  // One firewall is added for the cluster. After cluster creation,
  // the cluster creates routes for each node to allow the containers
  // on that node to communicate with all other instances in the
  // cluster.
  //
  // Finally, an entry is added to the project's global metadata indicating
  // which CIDR range is being used by the cluster.
  rpc CreateCluster(CreateClusterRequest) returns (Operation) {
    option (google.api.http) = { post: "/v1/projects/{project_id}/zones/{zone}/clusters" body: "*" };
  }

  // Updates the settings of a specific cluster.
  rpc UpdateCluster(UpdateClusterRequest) returns (Operation) {
    option (google.api.http) = { put: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}" body: "*" };
  }

  // Deletes the cluster, including the Kubernetes endpoint and all worker
  // nodes.
  //
  // Firewalls and routes that were configured during cluster creation
  // are also deleted.
  //
  // Other Google Compute Engine resources that might be in use by the cluster
  // (e.g. load balancer resources) will not be deleted if they weren't present
  // at the initial create time.
  rpc DeleteCluster(DeleteClusterRequest) returns (Operation) {
    option (google.api.http) = { delete: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}" };
  }

  // Lists all operations in a project in a specific zone or all zones.
  rpc ListOperations(ListOperationsRequest) returns (ListOperationsResponse) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/operations" };
  }

  // Gets the specified operation.
  rpc GetOperation(GetOperationRequest) returns (Operation) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/operations/{operation_id}" };
  }

  // Cancels the specified operation.
  rpc CancelOperation(CancelOperationRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { post: "/v1/projects/{project_id}/zones/{zone}/operations/{operation_id}:cancel" body: "*" };
  }

  // Returns configuration info about the Container Engine service.
  rpc GetServerConfig(GetServerConfigRequest) returns (ServerConfig) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/serverconfig" };
  }

  // Lists the node pools for a cluster.
  rpc ListNodePools(ListNodePoolsRequest) returns (ListNodePoolsResponse) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}/nodePools" };
  }

  // Retrieves the node pool requested.
  rpc GetNodePool(GetNodePoolRequest) returns (NodePool) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}/nodePools/{node_pool_id}" };
  }

  // Creates a node pool for a cluster.
  rpc CreateNodePool(CreateNodePoolRequest) returns (Operation) {
    option (google.api.http) = { post: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}/nodePools" body: "*" };
  }

  // Deletes a node pool from a cluster.
  rpc DeleteNodePool(DeleteNodePoolRequest) returns (Operation) {
    option (google.api.http) = { delete: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}/nodePools/{node_pool_id}" };
  }

  // Roll back the previously Aborted or Failed NodePool upgrade.
  // This will be an no-op if the last upgrade successfully completed.
  rpc RollbackNodePoolUpgrade(RollbackNodePoolUpgradeRequest) returns (Operation) {
    option (google.api.http) = { post: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}/nodePools/{node_pool_id}:rollback" body: "*" };
  }

  // Sets the NodeManagement options for a node pool.
  rpc SetNodePoolManagement(SetNodePoolManagementRequest) returns (Operation) {
    option (google.api.http) = { post: "/v1/projects/{project_id}/zones/{zone}/clusters/{cluster_id}/nodePools/{node_pool_id}/setManagement" body: "*" };
  }
}

// Parameters that describe the nodes in a cluster.
message NodeConfig {
  // The name of a Google Compute Engine [machine
  // type](/compute/docs/machine-types) (e.g.
  // `n1-standard-1`).
  //
  // If unspecified, the default machine type is
  // `n1-standard-1`.
  string machine_type = 1;

  // Size of the disk attached to each node, specified in GB.
  // The smallest allowed disk size is 10GB.
  //
  // If unspecified, the default disk size is 100GB.
  int32 disk_size_gb = 2;

  // The set of Google API scopes to be made available on all of the
  // node VMs under the "default" service account.
  //
  // The following scopes are recommended, but not required, and by default are
  // not included:
  //
  // * `https://www.googleapis.com/auth/compute` is required for mounting
  // persistent storage on your nodes.
  // * `https://www.googleapis.com/auth/devstorage.read_only` is required for
  // communicating with **gcr.io**
  // (the [Google Container Registry](/container-registry/)).
  //
  // If unspecified, no scopes are added, unless Cloud Logging or Cloud
  // Monitoring are enabled, in which case their required scopes will be added.
  repeated string oauth_scopes = 3;

  // The Google Cloud Platform Service Account to be used by the node VMs. If
  // no Service Account is specified, the "default" service account is used.
  string service_account = 9;

  // The metadata key/value pairs assigned to instances in the cluster.
  //
  // Keys must conform to the regexp [a-zA-Z0-9-_]+ and be less than 128 bytes
  // in length. These are reflected as part of a URL in the metadata server.
  // Additionally, to avoid ambiguity, keys must not conflict with any other
  // metadata keys for the project or be one of the four reserved keys:
  // "instance-template", "kube-env", "startup-script", and "user-data"
  //
  // Values are free-form strings, and only have meaning as interpreted by
  // the image running in the instance. The only restriction placed on them is
  // that each value's size must be less than or equal to 32 KB.
  //
  // The total size of all keys and values must be less than 512 KB.
  map<string, string> metadata = 4;

  // The image type to use for this node. Note that for a given image type,
  // the latest version of it will be used.
  string image_type = 5;

  // The map of Kubernetes labels (key/value pairs) to be applied to each node.
  // These will added in addition to any default label(s) that
  // Kubernetes may apply to the node.
  // In case of conflict in label keys, the applied set may differ depending on
  // the Kubernetes version -- it's best to assume the behavior is undefined
  // and conflicts should be avoided.
  // For more information, including usage and the valid values, see:
  // http://kubernetes.io/v1.1/docs/user-guide/labels.html
  map<string, string> labels = 6;

  // The number of local SSD disks to be attached to the node.
  //
  // The limit for this value is dependant upon the maximum number of
  // disks available on a machine per zone. See:
  // https://cloud.google.com/compute/docs/disks/local-ssd#local_ssd_limits
  // for more information.
  int32 local_ssd_count = 7;

  // The list of instance tags applied to all nodes. Tags are used to identify
  // valid sources or targets for network firewalls and are specified by
  // the client during cluster or node pool creation. Each tag within the list
  // must comply with RFC1035.
  repeated string tags = 8;

  // Whether the nodes are created as preemptible VM instances. See:
  // https://cloud.google.com/compute/docs/instances/preemptible for more
  // inforamtion about preemptible VM instances.
  bool preemptible = 10;
}

// The authentication information for accessing the master endpoint.
// Authentication can be done using HTTP basic auth or using client
// certificates.
message MasterAuth {
  // The username to use for HTTP basic authentication to the master endpoint.
  string username = 1;

  // The password to use for HTTP basic authentication to the master endpoint.
  // Because the master endpoint is open to the Internet, you should create a
  // strong password.
  string password = 2;

  // [Output only] Base64-encoded public certificate that is the root of
  // trust for the cluster.
  string cluster_ca_certificate = 100;

  // [Output only] Base64-encoded public certificate used by clients to
  // authenticate to the cluster endpoint.
  string client_certificate = 101;

  // [Output only] Base64-encoded private key used by clients to authenticate
  // to the cluster endpoint.
  string client_key = 102;
}

// Configuration for the addons that can be automatically spun up in the
// cluster, enabling additional functionality.
message AddonsConfig {
  // Configuration for the HTTP (L7) load balancing controller addon, which
  // makes it easy to set up HTTP load balancers for services in a cluster.
  HttpLoadBalancing http_load_balancing = 1;

  // Configuration for the horizontal pod autoscaling feature, which
  // increases or decreases the number of replica pods a replication controller
  // has based on the resource usage of the existing pods.
  HorizontalPodAutoscaling horizontal_pod_autoscaling = 2;
}

// Configuration options for the HTTP (L7) load balancing controller addon,
// which makes it easy to set up HTTP load balancers for services in a cluster.
message HttpLoadBalancing {
  // Whether the HTTP Load Balancing controller is enabled in the cluster.
  // When enabled, it runs a small pod in the cluster that manages the load
  // balancers.
  bool disabled = 1;
}

// Configuration options for the horizontal pod autoscaling feature, which
// increases or decreases the number of replica pods a replication controller
// has based on the resource usage of the existing pods.
message HorizontalPodAutoscaling {
  // Whether the Horizontal Pod Autoscaling feature is enabled in the cluster.
  // When enabled, it ensures that a Heapster pod is running in the cluster,
  // which is also used by the Cloud Monitoring service.
  bool disabled = 1;
}

// A Google Container Engine cluster.
message Cluster {
  // The current status of the cluster.
  enum Status {
    // Not set.
    STATUS_UNSPECIFIED = 0;

    // The PROVISIONING state indicates the cluster is being created.
    PROVISIONING = 1;

    // The RUNNING state indicates the cluster has been created and is fully
    // usable.
    RUNNING = 2;

    // The RECONCILING state indicates that some work is actively being done on
    // the cluster, such as upgrading the master or node software. Details can
    // be found in the `statusMessage` field.
    RECONCILING = 3;

    // The STOPPING state indicates the cluster is being deleted.
    STOPPING = 4;

    // The ERROR state indicates the cluster may be unusable. Details
    // can be found in the `statusMessage` field.
    ERROR = 5;
  }

  // The name of this cluster. The name must be unique within this project
  // and zone, and can be up to 40 characters with the following restrictions:
  //
  // * Lowercase letters, numbers, and hyphens only.
  // * Must start with a letter.
  // * Must end with a number or a letter.
  string name = 1;

  // An optional description of this cluster.
  string description = 2;

  // The number of nodes to create in this cluster. You must ensure that your
  // Compute Engine <a href="/compute/docs/resource-quotas">resource quota</a>
  // is sufficient for this number of instances. You must also have available
  // firewall and routes quota.
  // For requests, this field should only be used in lieu of a
  // "node_pool" object, since this configuration (along with the
  // "node_config") will be used to create a "NodePool" object with an
  // auto-generated name. Do not use this and a node_pool at the same time.
  int32 initial_node_count = 3;

  // Parameters used in creating the cluster's nodes.
  // See `nodeConfig` for the description of its properties.
  // For requests, this field should only be used in lieu of a
  // "node_pool" object, since this configuration (along with the
  // "initial_node_count") will be used to create a "NodePool" object with an
  // auto-generated name. Do not use this and a node_pool at the same time.
  // For responses, this field will be populated with the node configuration of
  // the first node pool.
  //
  // If unspecified, the defaults are used.
  NodeConfig node_config = 4;

  // The authentication information for accessing the master endpoint.
  MasterAuth master_auth = 5;

  // The logging service the cluster should use to write logs.
  // Currently available options:
  //
  // * `logging.googleapis.com` - the Google Cloud Logging service.
  // * `none` - no logs will be exported from the cluster.
  // * if left as an empty string,`logging.googleapis.com` will be used.
  string logging_service = 6;

  // The monitoring service the cluster should use to write metrics.
  // Currently available options:
  //
  // * `monitoring.googleapis.com` - the Google Cloud Monitoring service.
  // * `none` - no metrics will be exported from the cluster.
  // * if left as an empty string, `monitoring.googleapis.com` will be used.
  string monitoring_service = 7;

  // The name of the Google Compute Engine
  // [network](/compute/docs/networks-and-firewalls#networks) to which the
  // cluster is connected. If left unspecified, the `default` network
  // will be used.
  string network = 8;

  // The IP address range of the container pods in this cluster, in
  // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
  // notation (e.g. `10.96.0.0/14`). Leave blank to have
  // one automatically chosen or specify a `/14` block in `10.0.0.0/8`.
  string cluster_ipv4_cidr = 9;

  // Configurations for the various addons available to run in the cluster.
  AddonsConfig addons_config = 10;

  // The name of the Google Compute Engine
  // [subnetwork](/compute/docs/subnetworks) to which the
  // cluster is connected.
  string subnetwork = 11;

  // The node pools associated with this cluster.
  // This field should not be set if "node_config" or "initial_node_count" are
  // specified.
  repeated NodePool node_pools = 12;

  // The list of Google Compute Engine
  // [locations](/compute/docs/zones#available) in which the cluster's nodes
  // should be located.
  repeated string locations = 13;

  // Kubernetes alpha features are enabled on this cluster. This includes alpha
  // API groups (e.g. v1alpha1) and features that may not be production ready in
  // the kubernetes version of the master and nodes.
  // The cluster has no SLA for uptime and master/node upgrades are disabled.
  // Alpha enabled clusters are automatically deleted thirty days after
  // creation.
  bool enable_kubernetes_alpha = 14;

  // [Output only] Server-defined URL for the resource.
  string self_link = 100;

  // [Output only] The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 101;

  // [Output only] The IP address of this cluster's master endpoint.
  // The endpoint can be accessed from the internet at
  // `https://username:password@endpoint/`.
  //
  // See the `masterAuth` property of this resource for username and
  // password information.
  string endpoint = 102;

  // [Output only] The software version of the master endpoint and kubelets used
  // in the cluster when it was first created. The version can be upgraded over
  // time.
  string initial_cluster_version = 103;

  // [Output only] The current software version of the master endpoint.
  string current_master_version = 104;

  // [Output only] The current version of the node software components.
  // If they are currently at multiple versions because they're in the process
  // of being upgraded, this reflects the minimum version of all nodes.
  string current_node_version = 105;

  // [Output only] The time the cluster was created, in
  // [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.
  string create_time = 106;

  // [Output only] The current status of this cluster.
  Status status = 107;

  // [Output only] Additional information about the current status of this
  // cluster, if available.
  string status_message = 108;

  // [Output only] The size of the address space on each node for hosting
  // containers. This is provisioned from within the `container_ipv4_cidr`
  // range.
  int32 node_ipv4_cidr_size = 109;

  // [Output only] The IP address range of the Kubernetes services in
  // this cluster, in
  // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing)
  // notation (e.g. `1.2.3.4/29`). Service addresses are
  // typically put in the last `/16` from the container CIDR.
  string services_ipv4_cidr = 110;

  // [Output only] The resource URLs of [instance
  // groups](/compute/docs/instance-groups/) associated with this
  // cluster.
  repeated string instance_group_urls = 111;

  // [Output only] The number of nodes currently in the cluster.
  int32 current_node_count = 112;

  // [Output only] The time the cluster will be automatically
  // deleted in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.
  string expire_time = 113;
}

// ClusterUpdate describes an update to the cluster. Exactly one update can
// be applied to a cluster with each request, so at most one field can be
// provided.
message ClusterUpdate {
  // The Kubernetes version to change the nodes to (typically an
  // upgrade). Use `-` to upgrade to the latest version supported by
  // the server.
  string desired_node_version = 4;

  // The monitoring service the cluster should use to write metrics.
  // Currently available options:
  //
  // * "monitoring.googleapis.com" - the Google Cloud Monitoring service
  // * "none" - no metrics will be exported from the cluster
  string desired_monitoring_service = 5;

  // Configurations for the various addons available to run in the cluster.
  AddonsConfig desired_addons_config = 6;

  // The node pool to be upgraded. This field is mandatory if
  // "desired_node_version", "desired_image_family" or
  // "desired_node_pool_autoscaling" is specified and there is more than one
  // node pool on the cluster.
  string desired_node_pool_id = 7;

  // The desired image type for the node pool.
  // NOTE: Set the "desired_node_pool" field as well.
  string desired_image_type = 8;

  // Autoscaler configuration for the node pool specified in
  // desired_node_pool_id. If there is only one pool in the
  // cluster and desired_node_pool_id is not provided then
  // the change applies to that single node pool.
  NodePoolAutoscaling desired_node_pool_autoscaling = 9;

  // The desired list of Google Compute Engine
  // [locations](/compute/docs/zones#available) in which the cluster's nodes
  // should be located. Changing the locations a cluster is in will result
  // in nodes being either created or removed from the cluster, depending on
  // whether locations are being added or removed.
  //
  // This list must always include the cluster's primary zone.
  repeated string desired_locations = 10;

  // The Kubernetes version to change the master to. The only valid value is the
  // latest supported version. Use "-" to have the server automatically select
  // the latest version.
  string desired_master_version = 100;
}

// This operation resource represents operations that may have happened or are
// happening on the cluster. All fields are output only.
message Operation {
  // Current status of the operation.
  enum Status {
    // Not set.
    STATUS_UNSPECIFIED = 0;

    // The operation has been created.
    PENDING = 1;

    // The operation is currently running.
    RUNNING = 2;

    // The operation is done, either cancelled or completed.
    DONE = 3;

    // The operation is aborting.
    ABORTING = 4;
  }

  // Operation type.
  enum Type {
    // Not set.
    TYPE_UNSPECIFIED = 0;

    // Cluster create.
    CREATE_CLUSTER = 1;

    // Cluster delete.
    DELETE_CLUSTER = 2;

    // A master upgrade.
    UPGRADE_MASTER = 3;

    // A node upgrade.
    UPGRADE_NODES = 4;

    // Cluster repair.
    REPAIR_CLUSTER = 5;

    // Cluster update.
    UPDATE_CLUSTER = 6;

    // Node pool create.
    CREATE_NODE_POOL = 7;

    // Node pool delete.
    DELETE_NODE_POOL = 8;

    // Set node pool management.
    SET_NODE_POOL_MANAGEMENT = 9;
  }

  // The server-assigned ID for the operation.
  string name = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the operation
  // is taking place.
  string zone = 2;

  // The operation type.
  Type operation_type = 3;

  // The current status of the operation.
  Status status = 4;

  // Detailed operation progress, if available.
  string detail = 8;

  // If an error has occurred, a textual description of the error.
  string status_message = 5;

  // Server-defined URL for the resource.
  string self_link = 6;

  // Server-defined URL for the target of the operation.
  string target_link = 7;
}

// CreateClusterRequest creates a cluster.
message CreateClusterRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // A [cluster
  // resource](/container-engine/reference/rest/v1/projects.zones.clusters)
  Cluster cluster = 3;
}

// GetClusterRequest gets the settings of a cluster.
message GetClusterRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster to retrieve.
  string cluster_id = 3;
}

// UpdateClusterRequest updates the settings of a cluster.
message UpdateClusterRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster to upgrade.
  string cluster_id = 3;

  // A description of the update.
  ClusterUpdate update = 4;
}

// DeleteClusterRequest deletes a cluster.
message DeleteClusterRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster to delete.
  string cluster_id = 3;
}

// ListClustersRequest lists clusters.
message ListClustersRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides, or "-" for all zones.
  string zone = 2;
}

// ListClustersResponse is the result of ListClustersRequest.
message ListClustersResponse {
  // A list of clusters in the project in the specified zone, or
  // across all ones.
  repeated Cluster clusters = 1;

  // If any zones are listed here, the list of clusters returned
  // may be missing those zones.
  repeated string missing_zones = 2;
}

// GetOperationRequest gets a single operation.
message GetOperationRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The server-assigned `name` of the operation.
  string operation_id = 3;
}

// ListOperationsRequest lists operations.
message ListOperationsRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine [zone](/compute/docs/zones#available)
  // to return operations for, or `-` for all zones.
  string zone = 2;
}

// CancelOperationRequest cancels a single operation.
message CancelOperationRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the operation resides.
  string zone = 2;

  // The server-assigned `name` of the operation.
  string operation_id = 3;
}

// ListOperationsResponse is the result of ListOperationsRequest.
message ListOperationsResponse {
  // A list of operations in the project in the specified zone.
  repeated Operation operations = 1;

  // If any zones are listed here, the list of operations returned
  // may be missing the operations from those zones.
  repeated string missing_zones = 2;
}

// Gets the current Container Engine service configuration.
message GetServerConfigRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine [zone](/compute/docs/zones#available)
  // to return operations for.
  string zone = 2;
}

// Container Engine service configuration.
message ServerConfig {
  // Version of Kubernetes the service deploys by default.
  string default_cluster_version = 1;

  // List of valid node upgrade target versions.
  repeated string valid_node_versions = 3;

  // Default image type.
  string default_image_type = 4;

  // List of valid image types.
  repeated string valid_image_types = 5;

  // List of valid master versions.
  repeated string valid_master_versions = 6;
}

// CreateNodePoolRequest creates a node pool for a cluster.
message CreateNodePoolRequest {
  // The Google Developers Console [project ID or project
  // number](https://developers.google.com/console/help/new/#projectnumber).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster.
  string cluster_id = 3;

  // The node pool to create.
  NodePool node_pool = 4;
}

// DeleteNodePoolRequest deletes a node pool for a cluster.
message DeleteNodePoolRequest {
  // The Google Developers Console [project ID or project
  // number](https://developers.google.com/console/help/new/#projectnumber).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster.
  string cluster_id = 3;

  // The name of the node pool to delete.
  string node_pool_id = 4;
}

// ListNodePoolsRequest lists the node pool(s) for a cluster.
message ListNodePoolsRequest {
  // The Google Developers Console [project ID or project
  // number](https://developers.google.com/console/help/new/#projectnumber).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster.
  string cluster_id = 3;
}

// GetNodePoolRequest retrieves a node pool for a cluster.
message GetNodePoolRequest {
  // The Google Developers Console [project ID or project
  // number](https://developers.google.com/console/help/new/#projectnumber).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster.
  string cluster_id = 3;

  // The name of the node pool.
  string node_pool_id = 4;
}

// NodePool contains the name and configuration for a cluster's node pool.
// Node pools are a set of nodes (i.e. VM's), with a common configuration and
// specification, under the control of the cluster master. They may have a set
// of Kubernetes labels applied to them, which may be used to reference them
// during pod scheduling. They may also be resized up or down, to accommodate
// the workload.
message NodePool {
  // The current status of the node pool instance.
  enum Status {
    // Not set.
    STATUS_UNSPECIFIED = 0;

    // The PROVISIONING state indicates the node pool is being created.
    PROVISIONING = 1;

    // The RUNNING state indicates the node pool has been created
    // and is fully usable.
    RUNNING = 2;

    // The RUNNING_WITH_ERROR state indicates the node pool has been created
    // and is partially usable. Some error state has occurred and some
    // functionality may be impaired. Customer may need to reissue a request
    // or trigger a new update.
    RUNNING_WITH_ERROR = 3;

    // The RECONCILING state indicates that some work is actively being done on
    // the node pool, such as upgrading node software. Details can
    // be found in the `statusMessage` field.
    RECONCILING = 4;

    // The STOPPING state indicates the node pool is being deleted.
    STOPPING = 5;

    // The ERROR state indicates the node pool may be unusable. Details
    // can be found in the `statusMessage` field.
    ERROR = 6;
  }

  // The name of the node pool.
  string name = 1;

  // The node configuration of the pool.
  NodeConfig config = 2;

  // The initial node count for the pool. You must ensure that your
  // Compute Engine <a href="/compute/docs/resource-quotas">resource quota</a>
  // is sufficient for this number of instances. You must also have available
  // firewall and routes quota.
  int32 initial_node_count = 3;

  // [Output only] Server-defined URL for the resource.
  string self_link = 100;

  // [Output only] The version of the Kubernetes of this node.
  string version = 101;

  // [Output only] The resource URLs of [instance
  // groups](/compute/docs/instance-groups/) associated with this
  // node pool.
  repeated string instance_group_urls = 102;

  // [Output only] The status of the nodes in this pool instance.
  Status status = 103;

  // [Output only] Additional information about the current status of this
  // node pool instance, if available.
  string status_message = 104;

  // Autoscaler configuration for this NodePool. Autoscaler is enabled
  // only if a valid configuration is present.
  NodePoolAutoscaling autoscaling = 4;

  // NodeManagement configuration for this NodePool.
  NodeManagement management = 5;
}

// NodeManagement defines the set of node management services turned on for the
// node pool.
message NodeManagement {
  // A flag that specifies whether node auto-upgrade is enabled for the node
  // pool. If enabled, node auto-upgrade helps keep the nodes in your node pool
  // up to date with the latest release version of Kubernetes.
  bool auto_upgrade = 1;

  // A flag that specifies whether the node auto-repair is enabled for the node
  // pool. If enabled, the nodes in this node pool will be monitored and, if
  // they fail health checks too many times, an automatic repair action will be
  // triggered.
  bool auto_repair = 2;

  // Specifies the Auto Upgrade knobs for the node pool.
  AutoUpgradeOptions upgrade_options = 10;
}

// AutoUpgradeOptions defines the set of options for the user to control how
// the Auto Upgrades will proceed.
message AutoUpgradeOptions {
  // [Output only] This field is set when upgrades are about to commence
  // with the approximate start time for the upgrades, in
  // [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.
  string auto_upgrade_start_time = 1;

  // [Output only] This field is set when upgrades are about to commence
  // with the description of the upgrade.
  string description = 2;
}

// SetNodePoolManagementRequest sets the node management properties of a node
// pool.
message SetNodePoolManagementRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster to update.
  string cluster_id = 3;

  // The name of the node pool to update.
  string node_pool_id = 4;

  // NodeManagement configuration for the node pool.
  NodeManagement management = 5;
}

// RollbackNodePoolUpgradeRequest rollbacks the previously Aborted or Failed
// NodePool upgrade. This will be an no-op if the last upgrade successfully
// completed.
message RollbackNodePoolUpgradeRequest {
  // The Google Developers Console [project ID or project
  // number](https://support.google.com/cloud/answer/6158840).
  string project_id = 1;

  // The name of the Google Compute Engine
  // [zone](/compute/docs/zones#available) in which the cluster
  // resides.
  string zone = 2;

  // The name of the cluster to rollback.
  string cluster_id = 3;

  // The name of the node pool to rollback.
  string node_pool_id = 4;
}

// ListNodePoolsResponse is the result of ListNodePoolsRequest.
message ListNodePoolsResponse {
  // A list of node pools for a cluster.
  repeated NodePool node_pools = 1;
}

// NodePoolAutoscaling contains information required by cluster autoscaler to
// adjust the size of the node pool to the current cluster usage.
message NodePoolAutoscaling {
  // Is autoscaling enabled for this node pool.
  bool enabled = 1;

  // Minimum number of nodes in the NodePool. Must be >= 1 and <=
  // max_node_count.
  int32 min_node_count = 2;

  // Maximum number of nodes in the NodePool. Must be >= min_node_count. There
  // has to enough quota to scale up the cluster.
  int32 max_node_count = 3;
}
