# 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: brokers.eventing.knative.dev
  labels:
    knative.dev/release: devel
    knative.dev/crd-install: "true"
    duck.knative.dev/addressable: "true"
spec:
  group: eventing.knative.dev
  versions:
  - &version
    name: v1beta1
    served: true
    storage: false
    subresources:
      status: {}
    schema:
      openAPIV3Schema: &openAPIV3Schema
        type: object
        description: 'Broker collects a pool of events that are consumable using Triggers.
           Brokers provide a well-known endpoint for event delivery that senders can
           use with minimal knowledge of the event routing strategy. Subscribers use
           Triggers to request delivery of events from a Broker''s pool to a specific
           URL or Addressable endpoint.'
        properties:
          spec:
             description: 'Spec defines the desired state of the Broker.'
             type: object
             properties:
              config:
                description: 'Config is a KReference to the configuration that specifies
                      configuration options for this Broker. For example, this could
                      be a pointer to a ConfigMap.'
                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
              delivery:
                description: 'Delivery is the delivery specification for Events within
                    the Broker mesh. This includes things like retries, DLQ, etc.'
                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
          status:
            description: 'Status represents the current state of the Broker. This data
                may be out of date.'
            type: object
            properties:
              address:
                description: 'Broker is Addressable. It exposes the endpoint as an
                    URI to get events delivered into the Broker mesh.'
                type: object
                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
              observedGeneration:
                description: 'ObservedGeneration is the ''Generation'' of the Service
                    that was last processed by the controller.'
                type: integer
                format: int64
    additionalPrinterColumns:
    - name: URL
      type: string
      jsonPath: .status.address.url
    - name: Age
      type: date
      jsonPath: .metadata.creationTimestamp
    - name: Ready
      type: string
      jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
    - name: Reason
      type: string
      jsonPath: ".status.conditions[?(@.type==\"Ready\")].reason"
  - << : *version
    name: v1
    served: true
    storage: true
    # the schema of v1 is exactly the same as v1beta1 schema
    schema:
      openAPIV3Schema:
        << : *openAPIV3Schema
  names:
    kind: Broker
    plural: brokers
    singular: broker
    categories:
    - all
    - knative
    - eventing
  scope: Namespaced
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: ["v1", "v1beta1"]
      clientConfig:
        service:
          name: webhook
          namespace: mink-system
