# Copyright 2020 The Kubernetes 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.
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: serviceimports.multicluster.x-k8s.io
spec:
  group: multicluster.x-k8s.io
  scope: Namespaced
  names:
    plural: serviceimports
    singular: serviceimport
    kind: ServiceImport
    shortNames:
      - svcim
  versions:
    - name: v1alpha1
      served: true
      storage: true
      subresources:
        status: {}
      additionalPrinterColumns:
        - name: Type
          type: string
          description: The type of this ServiceImport
          jsonPath: .spec.type
        - name: IP
          type: string
          description: The VIP for this ServiceImport
          jsonPath: .spec.ips
        - name: Age
          type: date
          jsonPath: .metadata.creationTimestamp
      "schema":
        "openAPIV3Schema":
          description: ServiceImport describes a service imported from clusters in a
            ClusterSet.
          type: object
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation
              of an object. Servers should convert recognized schemas to the latest
              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this
              object represents. Servers may infer this from the endpoint the client
              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              description: spec defines the behavior of a ServiceImport.
              type: object
              required:
                - ports
                - type
              properties:
                ips:
                  description: ip will be used as the VIP for this service when type
                    is ClusterSetIP.
                  type: array
                  maxItems: 1
                  items:
                    type: string
                ports:
                  type: array
                  items:
                    description: ServicePort represents the port on which the service
                      is exposed
                    type: object
                    required:
                      - port
                    properties:
                      appProtocol:
                        description: The application protocol for this port. This field
                          follows standard Kubernetes label syntax. Un-prefixed names
                          are reserved for IANA standard service names (as per RFC-6335
                          and http://www.iana.org/assignments/service-names). Non-standard
                          protocols should use prefixed names such as mycompany.com/my-custom-protocol.
                          Field can be enabled with ServiceAppProtocol feature gate.
                        type: string
                      name:
                        description: The name of this port within the service. This
                          must be a DNS_LABEL. All ports within a ServiceSpec must have
                          unique names. When considering the endpoints for a Service,
                          this must match the 'name' field in the EndpointPort. Optional
                          if only one ServicePort is defined on this service.
                        type: string
                      port:
                        description: The port that will be exposed by this service.
                        type: integer
                        format: int32
                      protocol:
                        description: The IP protocol for this port. Supports "TCP",
                          "UDP", and "SCTP". Default is TCP.
                        type: string
                  x-kubernetes-list-type: atomic
                sessionAffinity:
                  description: 'Supports "ClientIP" and "None". Used to maintain session
                  affinity. Enable client IP based session affinity. Must be ClientIP
                  or None. Defaults to None. Ignored when type is Headless More info:
                  https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
                  type: string
                sessionAffinityConfig:
                  description: sessionAffinityConfig contains session affinity configuration.
                  type: object
                  properties:
                    clientIP:
                      description: clientIP contains the configurations of Client IP
                        based session affinity.
                      type: object
                      properties:
                        timeoutSeconds:
                          description: timeoutSeconds specifies the seconds of ClientIP
                            type session sticky time. The value must be >0 && <=86400(for
                            1 day) if ServiceAffinity == "ClientIP". Default value is
                            10800(for 3 hours).
                          type: integer
                          format: int32
                type:
                  description: type defines the type of this service. Must be ClusterSetIP
                    or Headless.
                  type: string
                  enum:
                    - ClusterSetIP
                    - Headless
            status:
              description: status contains information about the exported services that
                form the multi-cluster service referenced by this ServiceImport.
              type: object
              properties:
                clusters:
                  description: clusters is the list of exporting clusters from which
                    this service was derived.
                  type: array
                  items:
                    description: ClusterStatus contains service configuration mapped
                      to a specific source cluster
                    type: object
                    required:
                      - cluster
                    properties:
                      cluster:
                        description: cluster is the name of the exporting cluster. Must
                          be a valid RFC-1123 DNS label.
                        type: string
                  x-kubernetes-list-map-keys:
                    - cluster
                  x-kubernetes-list-type: map