# Copyright 2020 The Knative 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: kafkachannels.messaging.knative.dev
  labels:
    kafka.eventing.knative.dev/release: devel
    knative.dev/crd-install: "true"
    messaging.knative.dev/subscribable: "true"
    duck.knative.dev/addressable: "true"
spec:
  group: messaging.knative.dev
  versions:
    - name: v1beta1
      served: true
      storage: true
      subresources:
        status: { }
      schema:
        openAPIV3Schema:
          description: 'KafkaChannel is a resource representing a Channel that is backed by a topic of an Apache Kafka cluster.'
          type: object
          properties:
            spec:
              description: Spec defines the desired state of the Channel.
              type: object
              properties:
                numPartitions:
                  description: NumPartitions is the number of partitions of a Kafka topic. By default, it is set to 1.
                  type: integer
                  format: int32
                  default: 1
                replicationFactor:
                  description: ReplicationFactor is the replication factor of a Kafka topic. By default, it is set to 1.
                  type: integer
                  maximum: 32767
                  default: 1
                retentionDuration:
                  description: RetentionDuration is the retention time for events in a Kafka Topic represented as an ISO-8601 Duration.  By default it is set to 168 hours, which is the precise form of 7 days.
                  type: string
                delivery:
                  description: DeliverySpec contains the default delivery spec for each subscription to this Channelable. Each subscription delivery spec, if any, overrides this global delivery spec.
                  type: object
                  properties:
                    backoffDelay:
                      description: 'BackoffDelay is the delay before retrying. More information on Duration format: - https://www.iso.org/iso-8601-date-and-time-format.html - https://en.wikipedia.org/wiki/ISO_8601  For linear policy, backoff delay is backoffDelay*<numberOfRetries>. For exponential policy, backoff delay is backoffDelay*2^<numberOfRetries>.'
                      type: string
                    backoffPolicy:
                      description: BackoffPolicy is the retry backoff policy (linear, exponential).
                      type: string
                    deadLetterSink:
                      description: DeadLetterSink is the sink receiving event that could not be sent to a destination.
                      type: object
                      properties:
                        ref:
                          description: Ref points to an Addressable.
                          type: object
                          properties:
                            apiVersion:
                              description: API version of the referent.
                              type: string
                            kind:
                              description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                              type: string
                            name:
                              description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                              type: string
                            namespace:
                              description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ This is optional field, it gets defaulted to the object holding it if left out.'
                              type: string
                        uri:
                          description: URI can be an absolute URL(non-empty scheme and non-empty host) pointing to the target or a relative URI. Relative URIs will be resolved using the base URI retrieved from Ref.
                          type: string
                    retry:
                      description: Retry is the minimum number of retries the sender should attempt when sending an event before moving it to the dead letter sink.
                      type: integer
                      format: int32
                  x-kubernetes-preserve-unknown-fields: true # This is necessary to enable experimental features in the delivery
                subscribers:
                  description: This is the list of subscriptions for this subscribable.
                  type: array
                  items:
                    type: object
                    properties:
                      delivery:
                        description: DeliverySpec contains options controlling the event delivery
                        type: object
                        properties:
                          backoffDelay:
                            description: 'BackoffDelay is the delay before retrying. More information on Duration format: - https://www.iso.org/iso-8601-date-and-time-format.html - https://en.wikipedia.org/wiki/ISO_8601  For linear policy, backoff delay is backoffDelay*<numberOfRetries>. For exponential policy, backoff delay is backoffDelay*2^<numberOfRetries>.'
                            type: string
                          backoffPolicy:
                            description: BackoffPolicy is the retry backoff policy (linear, exponential).
                            type: string
                          deadLetterSink:
                            description: DeadLetterSink is the sink receiving event that could not be sent to a destination.
                            type: object
                            properties:
                              ref:
                                description: Ref points to an Addressable.
                                type: object
                                properties:
                                  apiVersion:
                                    description: API version of the referent.
                                    type: string
                                  kind:
                                    description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                                    type: string
                                  name:
                                    description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                                    type: string
                                  namespace:
                                    description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ This is optional field, it gets defaulted to the object holding it if left out.'
                                    type: string
                              uri:
                                description: URI can be an absolute URL(non-empty scheme and non-empty host) pointing to the target or a relative URI. Relative URIs will be resolved using the base URI retrieved from Ref.
                                type: string
                          retry:
                            description: Retry is the minimum number of retries the sender should attempt when sending an event before moving it to the dead letter sink.
                            type: integer
                            format: int32
                        x-kubernetes-preserve-unknown-fields: true # This is necessary to enable experimental features in the delivery
                      generation:
                        description: Generation of the origin of the subscriber with uid:UID.
                        type: integer
                        format: int64
                      replyUri:
                        description: ReplyURI is the endpoint for the reply
                        type: string
                      subscriberUri:
                        description: SubscriberURI is the endpoint for the subscriber
                        type: string
                      uid:
                        description: UID is used to understand the origin of the subscriber.
                        type: string
            status:
              description: Status represents the current state of the KafkaChannel. This data may be out of date.
              type: object
              properties:
                address:
                  type: object
                  required:
                    - url
                  properties:
                    url:
                      type: string
                annotations:
                  description: Annotations is additional Status fields for the Resource to save some additional State as well as convey more information to the user. This is roughly akin to Annotations on any k8s resource, just the reconciler conveying richer information outwards.
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
                conditions:
                  description: Conditions the latest available observations of a resource's current state.
                  type: array
                  items:
                    type: object
                    required:
                      - type
                      - status
                    properties:
                      lastTransitionTime:
                        description: LastTransitionTime is the last time the condition transitioned from one status to another. We use VolatileTime in place of metav1.Time to exclude this from creating equality.Semantic differences (all other things held constant).
                        type: string
                      message:
                        description: A human readable message indicating details about the transition.
                        type: string
                      reason:
                        description: The reason for the condition's last transition.
                        type: string
                      severity:
                        description: Severity with which to treat failures of this type of condition. When this is not specified, it defaults to Error.
                        type: string
                      status:
                        description: Status of the condition, one of True, False, Unknown.
                        type: string
                      type:
                        description: Type of condition.
                        type: string
                deadLetterChannel:
                  description: DeadLetterChannel is a KReference and is set by the channel when it supports native error handling via a channel Failed messages are delivered here.
                  type: object
                  properties:
                    apiVersion:
                      description: API version of the referent.
                      type: string
                    kind:
                      description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                      type: string
                    name:
                      description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
                      type: string
                    namespace:
                      description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ This is optional field, it gets defaulted to the object holding it if left out.'
                      type: string
                observedGeneration:
                  description: ObservedGeneration is the 'Generation' of the Service that was last processed by the controller.
                  type: integer
                  format: int64
                subscribers:
                  description: This is the list of subscription's statuses for this channel.
                  type: array
                  items:
                    type: object
                    properties:
                      message:
                        description: A human readable message indicating details of Ready status.
                        type: string
                      observedGeneration:
                        description: Generation of the origin of the subscriber with uid:UID.
                        type: integer
                        format: int64
                      ready:
                        description: Status of the subscriber.
                        type: string
                      uid:
                        description: UID is used to understand the origin of the subscriber.
                        type: string
      additionalPrinterColumns:
        - name: Ready
          type: string
          jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
        - name: Reason
          type: string
          jsonPath: ".status.conditions[?(@.type==\"Ready\")].reason"
        - name: URL
          type: string
          jsonPath: .status.address.url
        - name: Age
          type: date
          jsonPath: .metadata.creationTimestamp
  names:
    kind: KafkaChannel
    plural: kafkachannels
    singular: kafkachannel
    categories:
      - all
      - knative
      - messaging
      - channel
    shortNames:
      - kc
  scope: Namespaced
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: [ "v1", "v1beta1" ]
      clientConfig:
        service:
          name: kafka-webhook
          namespace: knative-eventing
