# 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:
  labels:
    eventing.knative.dev/release: devel
    eventing.knative.dev/source: "true"
    duck.knative.dev/source: "true"
    duck.knative.dev/binding: "true"
    knative.dev/crd-install: "true"
  name: sinkbindings.sources.knative.dev
spec:
  group: sources.knative.dev
  versions:
    - &version
      name: v1alpha1
      served: true
      storage: false
      subresources:
        status: {}
      schema:
        openAPIV3Schema:
          type: object
          # this is a work around so we don't need to flush out the
          # schema for each version at this time
          #
          # see issue: https://github.com/knative/serving/issues/912
          x-kubernetes-preserve-unknown-fields: true
      additionalPrinterColumns:
        - name: Sink
          type: string
          jsonPath: ".status.sinkUri"
        - 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: v1alpha2
      served: true
      storage: false
    - <<: *version
      name: v1beta1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          description: 'SinkBinding describes a Binding that is also a Source.
              The `sink` (from the Source duck) is resolved to a URL and
              then projected into the `subject` by augmenting the runtime
              contract of the referenced containers to have a `K_SINK`
              environment variable holding the endpoint to which to send
              cloud events.'
          properties:
            spec:
              type: object
              description: 'SinkBindingSpec holds the desired state of the SinkBinding (from the client).'
              properties:
                ceOverrides:
                  description: 'CloudEventOverrides defines overrides to control the
                      output format and modifications of the event sent to the sink.'
                  type: object
                  properties:
                    extensions:
                      description: 'Extensions specify what attribute are added or
                          overridden on the outbound event. Each `Extensions` key-value
                          pair are set on the event as an attribute extension independently.'
                      type: object
                      additionalProperties:
                        type: string
                sink:
                  description: 'Sink is a reference to an object that will resolve to
                      a uri to use as the sink.'
                  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
                subject:
                  description: 'Subject references the resource(s) whose "runtime contract"
                      should be augmented by Binding implementations.'
                  type: object
                  properties:
                    apiVersion:
                      description: 'API version of the referent.'
                      type: string
                    kind:
                      description: 'Kind of the referent.'
                      type: string
                    name:
                      description: 'Name of the referent. Mutually exclusive with
                          Selector.'
                      type: string
                    namespace:
                      description: 'Namespace of the referent.'
                      type: string
                    selector:
                      description: 'Selector of the referents. Mutually exclusive
                          with Name.'
                      type: object
                      properties:
                        matchExpressions:
                          description: 'matchExpressions is a list of label selector
                              requirements. The requirements are ANDed.'
                          type: array
                          items:
                            type: object
                            properties:
                              key:
                                description: 'key is the label key that
                                    the selector applies to.'
                                type: string
                              operator:
                                description: 'operator represents a key''s
                                    relationship to a set of values. Valid
                                    operators are In, NotIn, Exists and
                                    DoesNotExist.'
                                type: string
                              values:
                                description: 'values is an array of string
                                    values. If the operator is In or NotIn,
                                    the values array must be non-empty.
                                    If the operator is Exists or DoesNotExist,
                                    the values array must be empty. This
                                    array is replaced during a strategic
                                    merge patch.'
                                type: array
                                items:
                                    type: string
                        matchLabels:
                          description: 'matchLabels is a map of {key,value} pairs.
                              A single {key,value} in the matchLabels map is
                              equivalent to an element of matchExpressions,
                              whose key field is "key", the operator is "In",
                              and the values array contains only "value". The
                              requirements are ANDed.'
                          type: object
                          x-kubernetes-preserve-unknown-fields: true
            status:
              type: object
              description: 'SinkBindingStatus communicates the observed state of the SinkBinding (from the controller).'
              properties:
                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
                ceAttributes:
                  description: 'CloudEventAttributes are the specific attributes that
                      the Source uses as part of its CloudEvents.'
                  type: array
                  items:
                    type: object
                    properties:
                      source:
                        description: 'Source is the CloudEvents source attribute.'
                        type: string
                      type:
                        description: 'Type refers to the CloudEvent type attribute.'
                        type: string
                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
                sinkUri:
                    description: 'SinkURI is the current active sink URI that has been
                        configured for the Source.'
                    type: string
  names:
    categories:
      - all
      - knative
      - sources
      - bindings
    kind: SinkBinding
    plural: sinkbindings
  scope: Namespaced
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: ["v1", "v1beta1"]
      clientConfig:
        service:
          name: eventing-webhook
          namespace: knative-eventing
