// Copyright 2019 CUE Authors
//
// 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.

// Copyright 2017 Istio Authors
//
//   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";

// $title: Gateway
// $description: Configuration affecting edge load balancer.
// $location: https://istio.io/docs/reference/config/networking/v1alpha3/gateway.html

// `Gateway` describes a load balancer operating at the edge of the mesh
// receiving incoming or outgoing HTTP/TCP connections. The specification
// describes a set of ports that should be exposed, the type of protocol to
// use, SNI configuration for the load balancer, etc.
//
// For example, the following Gateway configuration sets up a proxy to act
// as a load balancer exposing port 80 and 9080 (http), 443 (https),
// 9443(https) and port 2379 (TCP) for ingress.  The gateway will be
// applied to the proxy running on a pod with labels `app:
// my-gateway-controller`. While Istio will configure the proxy to listen
// on these ports, it is the responsibility of the user to ensure that
// external traffic to these ports are allowed into the mesh.
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
//   name: my-gateway
//   namespace: some-config-namespace
// spec:
//   selector:
//     app: my-gateway-controller
//   servers:
//   - port:
//       number: 80
//       name: http
//       protocol: HTTP
//     hosts:
//     - uk.bookinfo.com
//     - eu.bookinfo.com
//     tls:
//       httpsRedirect: true # sends 301 redirect for http requests
//   - port:
//       number: 443
//       name: https-443
//       protocol: HTTPS
//     hosts:
//     - uk.bookinfo.com
//     - eu.bookinfo.com
//     tls:
//       mode: SIMPLE # enables HTTPS on this port
//       serverCertificate: /etc/certs/servercert.pem
//       privateKey: /etc/certs/privatekey.pem
//   - port:
//       number: 9443
//       name: https-9443
//       protocol: HTTPS
//     hosts:
//     - "bookinfo-namespace/*.bookinfo.com"
//     tls:
//       mode: SIMPLE # enables HTTPS on this port
//       credentialName: bookinfo-secret # fetches certs from Kubernetes secret
//   - port:
//       number: 9080
//       name: http-wildcard
//       protocol: HTTP
//     hosts:
//     - "*"
//   - port:
//       number: 2379 # to expose internal service via external port 2379
//       name: mongo
//       protocol: MONGO
//     hosts:
//     - "*"
// ```
//
// The Gateway specification above describes the L4-L6 properties of a load
// balancer. A `VirtualService` can then be bound to a gateway to control
// the forwarding of traffic arriving at a particular host or gateway port.
//
// For example, the following VirtualService splits traffic for
// `https://uk.bookinfo.com/reviews`, `https://eu.bookinfo.com/reviews`,
// `http://uk.bookinfo.com:9080/reviews`,
// `http://eu.bookinfo.com:9080/reviews` into two versions (prod and qa) of
// an internal reviews service on port 9080. In addition, requests
// containing the cookie "user: dev-123" will be sent to special port 7777
// in the qa version. The same rule is also applicable inside the mesh for
// requests to the "reviews.prod.svc.cluster.local" service. This rule is
// applicable across ports 443, 9080. Note that `http://uk.bookinfo.com`
// gets redirected to `https://uk.bookinfo.com` (i.e. 80 redirects to 443).
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
//   name: bookinfo-rule
//   namespace: bookinfo-namespace
// spec:
//   hosts:
//   - reviews.prod.svc.cluster.local
//   - uk.bookinfo.com
//   - eu.bookinfo.com
//   gateways:
//   - some-config-namespace/my-gateway
//   - mesh # applies to all the sidecars in the mesh
//   http:
//   - match:
//     - headers:
//         cookie:
//           exact: "user=dev-123"
//     route:
//     - destination:
//         port:
//           number: 7777
//         host: reviews.qa.svc.cluster.local
//   - match:
//     - uri:
//         prefix: /reviews/
//     route:
//     - destination:
//         port:
//           number: 9080 # can be omitted if it's the only port for reviews
//         host: reviews.prod.svc.cluster.local
//       weight: 80
//     - destination:
//         host: reviews.qa.svc.cluster.local
//       weight: 20
// ```
//
// The following VirtualService forwards traffic arriving at (external)
// port 27017 to internal Mongo server on port 5555. This rule is not
// applicable internally in the mesh as the gateway list omits the
// reserved name `mesh`.
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: VirtualService
// metadata:
//   name: bookinfo-Mongo
//   namespace: bookinfo-namespace
// spec:
//   hosts:
//   - mongosvr.prod.svc.cluster.local # name of internal Mongo service
//   gateways:
//   - some-config-namespace/my-gateway # can omit the namespace if gateway is in same
//                                        namespace as virtual service.
//   tcp:
//   - match:
//     - port: 27017
//     route:
//     - destination:
//         host: mongo.prod.svc.cluster.local
//         port:
//           number: 5555
// ```
//
// It is possible to restrict the set of virtual services that can bind to
// a gateway server using the namespace/hostname syntax in the hosts field.
// For example, the following Gateway allows any virtual service in the ns1
// namespace to bind to it, while restricting only the virtual service with
// foo.bar.com host in the ns2 namespace to bind to it.
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
//   name: my-gateway
//   namespace: some-config-namespace
// spec:
//   selector:
//     app: my-gateway-controller
//   servers:
//   - port:
//       number: 80
//       name: http
//       protocol: HTTP
//     hosts:
//     - "ns1/*"
//     - "ns2/foo.bar.com"
// ```
//
package istio.networking.v1alpha3;

import "cuelang/cue.proto";

// GO PACKAGE
option go_package = "istio.io/api/networking/v1alpha3"; // INLINE

message Gateway {
  // REQUIRED: A list of server specifications.
  repeated Server servers = 1;

  // REQUIRED: One or more labels that indicate a specific set of pods/VMs
  // on which this gateway configuration should be applied. The scope of
  // label search is restricted to the configuration namespace in which the
  // the resource is present. In other words, the Gateway resource must
  // reside in the same namespace as the gateway workload instance.
  map<string, string> selector = 2 [ (cue.val) = "{<name>: name}"];
}

// `Server` describes the properties of the proxy on a given load balancer
// port. For example,
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
//   name: my-ingress
// spec:
//   selector:
//     app: my-ingress-gateway
//   servers:
//   - port:
//       number: 80
//       name: http2
//       protocol: HTTP2
//     hosts:
//     - "*"
// ```
//
// Another example
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
//   name: my-tcp-ingress
// spec:
//   selector:
//     app: my-tcp-ingress-gateway
//   servers:
//   - port:
//       number: 27018
//       name: mongo
//       protocol: MONGO
//     hosts:
//     - "*"
// ```
//
// The following is an example of TLS configuration for port 443
//
// ```yaml
// apiVersion: networking.istio.io/v1alpha3
// kind: Gateway
// metadata:
//   name: my-tls-ingress
// spec:
//   selector:
//     app: my-tls-ingress-gateway
//   servers:
//   - port:
//       number: 443
//       name: https
//       protocol: HTTPS
//     hosts:
//     - "*"
//     tls:
//       mode: SIMPLE
//       serverCertificate: /etc/certs/server.pem
//       privateKey: /etc/certs/privatekey.pem
// ```
message Server {
  // REQUIRED: The Port on which the proxy should listen for incoming
  // connections.
  Port port = 1 [(cue.val) = ">10 & <100"];

  // $hide_from_docs
  // The ip or the Unix domain socket to which the listener should be bound
  // to. Format: `x.x.x.x` or `unix:///path/to/uds` or `unix://@foobar`
  // (Linux abstract namespace). When using Unix domain sockets, the port
  // number should be 0.
  string bind = 4;

  // REQUIRED. One or more hosts exposed by this gateway.
  // While typically applicable to
  // HTTP services, it can also be used for TCP services using TLS with SNI.
  // A host is specified as a `dnsName` with an optional `namespace/` prefix.
  // The `dnsName` should be specified using FQDN format, optionally including
  // a wildcard character in the left-most component (e.g., `prod/*.example.com`).
  // Set the `dnsName` to `*` to select all `VirtualService` hosts from the
  // specified namespace (e.g.,`prod/*`). If no `namespace/` is specified,
  // the `VirtualService` hosts will be selected from any available namespace.
  // Any associated `DestinationRule` in the same namespace will also be used.
  //
  // A `VirtualService` must be bound to the gateway and must have one or
  // more hosts that match the hosts specified in a server. The match
  // could be an exact match or a suffix match with the server's hosts. For
  // example, if the server's hosts specifies `*.example.com`, a
  // `VirtualService` with hosts `dev.example.com` or `prod.example.com` will
  // match. However, a `VirtualService` with host `example.com` or
  // `newexample.com` will not match.
  //
  // NOTE: Only virtual services exported to the gateway's namespace
  // (e.g., `exportTo` value of `*`) can be referenced.
  // Private configurations (e.g., `exportTo` set to `.`) will not be
  // available. Refer to the `exportTo` setting in `VirtualService`,
  // `DestinationRule`, and `ServiceEntry` configurations for details.
  repeated string hosts = 2;

  message TLSOptions {
    // If set to true, the load balancer will send a 301 redirect for all
    // http connections, asking the clients to use HTTPS.
    bool https_redirect = 1;

    // TLS modes enforced by the proxy
    enum TLSmode {
      // The SNI string presented by the client will be used as the match
      // criterion in a VirtualService TLS route to determine the
      // destination service from the service registry.
      PASSTHROUGH = 0;

      // Secure connections with standard TLS semantics.
      SIMPLE = 1;

      // Secure connections to the upstream using mutual TLS by presenting
      // client certificates for authentication.
      MUTUAL = 2;

      // Similar to the passthrough mode, except servers with this TLS mode
      // do not require an associated VirtualService to map from the SNI
      // value to service in the registry. The destination details such as
      // the service/subset/port are encoded in the SNI value. The proxy
      // will forward to the upstream (Envoy) cluster (a group of
      // endpoints) specified by the SNI value. This server is typically
      // used to provide connectivity between services in disparate L3
      // networks that otherwise do not have direct connectivity between
      // their respective endpoints. Use of this mode assumes that both the
      // source and the destination are using Istio mTLS to secure traffic.
      AUTO_PASSTHROUGH = 3;
    };

    // Optional: Indicates whether connections to this port should be
    // secured using TLS. The value of this field determines how TLS is
    // enforced.
    TLSmode mode = 2;

    // Extra comment.

    // REQUIRED if mode is `SIMPLE` or `MUTUAL`. The path to the file
    // holding the server-side TLS certificate to use.
    string server_certificate = 3;

    // REQUIRED if mode is `SIMPLE` or `MUTUAL`. The path to the file
    // holding the server's private key.
    string private_key = 4;

    // REQUIRED if mode is `MUTUAL`. The path to a file containing
    // certificate authority certificates to use in verifying a presented
    // client side certificate.
    string ca_certificates = 5;

    // The credentialName stands for a unique identifier that can be used
    // to identify the serverCertificate and the privateKey. The
    // credentialName appended with suffix "-cacert" is used to identify
    // the CaCertificates associated with this server. Gateway workloads
    // capable of fetching credentials from a remote credential store such
    // as Kubernetes secrets, will be configured to retrieve the
    // serverCertificate and the privateKey using credentialName, instead
    // of using the file system paths specified above. If using mutual TLS,
    // gateway workload instances will retrieve the CaCertificates using
    // credentialName-cacert. The semantics of the name are platform
    // dependent.  In Kubernetes, the default Istio supplied credential
    // server expects the credentialName to match the name of the
    // Kubernetes secret that holds the server certificate, the private
    // key, and the CA certificate (if using mutual TLS). Set the
    // `ISTIO_META_USER_SDS` metadata variable in the gateway's proxy to
    // enable the dynamic credential fetching feature.
    string credential_name = 10;

    // A list of alternate names to verify the subject identity in the
    // certificate presented by the client.
    repeated string subject_alt_names = 6;

    // TLS protocol versions.
    enum TLSProtocol {
      TLS_AUTO = 0; // Automatically choose the optimal TLS version.

      TLSV1_0 = 1; // TLS version 1.0

      TLSV1_1 = 2; // TLS version 1.1
    
      TLSV1_2 = 3; // TLS version 1.2

      TLSV1_3 = 4; // TLS version 1.3
    }

    // Optional: Minimum TLS protocol version.
    TLSProtocol min_protocol_version = 7;

    // Optional: Maximum TLS protocol version.
    TLSProtocol max_protocol_version = 8;

    // Optional: If specified, only support the specified cipher list.
    // Otherwise default to the default cipher list supported by Envoy.
    repeated string cipher_suites = 9;
  }

  // Set of TLS related options that govern the server's behavior. Use
  // these options to control if all http requests should be redirected to
  // https, and the TLS modes to use.
  TLSOptions tls = 3;

  // The loopback IP endpoint or Unix domain socket to which traffic should
  // be forwarded to by default. Format should be `127.0.0.1:PORT` or
  // `unix:///path/to/socket` or `unix://@foobar` (Linux abstract namespace).
  string default_endpoint = 5;
}


// Port describes the properties of a specific port of a service.
message Port {
  // REQUIRED: A valid non-negative integer port number.
  uint32 number = 1;

  // REQUIRED: The protocol exposed on the port.
  // MUST BE one of HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS.
  // TLS implies the connection will be routed based on the SNI header to
  // the destination without terminating the TLS connection.
  string protocol = 2;

  // Label assigned to the port.
  string name = 3;
}
