# 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: parallels.flows.knative.dev
  labels:
    eventing.knative.dev/release: devel
    knative.dev/crd-install: "true"
    duck.knative.dev/addressable: "true"
spec:
  group: flows.knative.dev
  versions:
  - name: v1
    served: true
    storage: true
    subresources:
      status: {}
    schema:
      openAPIV3Schema:
        description: 'Parallel defines conditional branches that will be wired in series through Channels and Subscriptions.'
        type: object
        properties:
          spec:
            description: Spec defines the desired state of the Parallel.
            type: object
            properties:
              branches:
                description: Branches is the list of Filter/Subscribers pairs.
                type: array
                items:
                  type: object
                  x-kubernetes-preserve-unknown-fields: true
                  properties:
                    delivery:
                      description: Delivery is the delivery specification for
                          events to the subscriber 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: &addressableProperties
                            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
                    filter:
                      description: Filter is the expression guarding the branch
                      type: object
                      properties:
                        <<: *addressableProperties
                    reply:
                        description: Reply is a Reference to where the result
                            of Subscriber of this case gets sent to. If not specified,
                            sent the result to the Parallel Reply
                        type: object
                        properties:
                          <<: *addressableProperties
                    subscriber:
                        description: Subscriber receiving the event when the filter
                            passes
                        type: object
                        properties:
                          <<: *addressableProperties
              channelTemplate:
                description: ChannelTemplate specifies which Channel CRD to use. If
                    left unspecified, it is set to the default Channel CRD for the
                    namespace (or cluster, in case there are no defaults for the namespace).
                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
                  spec:
                    description: Spec defines the Spec to use for each channel
                        created. Passed in verbatim to the Channel CRD as Spec
                        section.
                    type: object
                    x-kubernetes-preserve-unknown-fields: true
              reply:
                description: Reply is a Reference to where the result of a case Subscriber
                    gets sent to when the case does not have a Reply
                type: object
                properties:
                  <<: *addressableProperties
          status:
            description: Status represents the current state of the Parallel. This data
                may be out of date.
            type: object
            properties:
              address:
                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
              branchStatuses:
                description: BranchStatuses is an array of corresponding to branch
                    statuses. Matches the Spec.Branches array in the order.
                type: array
                items:
                  type: object
                  properties:
                    filterChannelStatus:
                      description: FilterChannelStatus corresponds to the filter
                          channel status.
                      type: object
                      properties: &channelProperties
                        channel:
                          description: Channel is the reference to the underlying
                              channel.
                          type: object
                          properties: &referentProperties
                            apiVersion:
                              description: API version of the referent.
                              type: string
                            fieldPath:
                              description: 'If referring to a piece
                                  of an object instead of an entire
                                  object, this string should contain
                                  a valid JSON/Go field access statement,
                                  such as desiredState.manifest.containers[2].
                                  For example, if the object reference
                                  is to a container within a pod, this
                                  would take on a value like: "spec.containers{name}"
                                  (where "name" refers to the name of
                                  the container that triggered the event)
                                  or if no container name is specified
                                  "spec.containers[2]" (container with
                                  index 2 in this pod). This syntax
                                  is chosen only to have some well-defined
                                  way of referencing a part of an object.'
                              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/'
                              type: string
                            resourceVersion:
                              description: 'Specific resourceVersion
                                  to which this reference is made, if
                                  any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
                              type: string
                            uid:
                              description: 'UID of the referent. More
                                  info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
                              type: string
                        ready:
                          description: ReadyCondition indicates whether
                              the Channel is ready or not.
                          type: object
                          x-kubernetes-preserve-unknown-fields: true
                          properties: &readyConditionProperties
                            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
                    filterSubscriptionStatus:
                      description: FilterSubscriptionStatus corresponds to the
                          filter subscription status.
                      type: object
                      properties:
                        ready:
                          description: ReadyCondition indicates whether
                              the Subscription is ready or not.
                          type: object
                          properties:
                            <<: *readyConditionProperties
                        subscription:
                          description: Subscription is the reference to
                              the underlying Subscription.
                          type: object
                          properties:
                            <<: *referentProperties
                    subscriberSubscriptionStatus:
                      description: SubscriptionStatus corresponds to the subscriber
                          subscription status.
                      type: object
                      properties:
                        ready:
                            description: ReadyCondition indicates whether
                                the Subscription is ready or not.
                            type: object
                            properties:
                              <<: *readyConditionProperties
                        subscription:
                            description: Subscription is the reference to
                                the underlying Subscription.
                            type: object
                            properties:
                              <<: *referentProperties
              conditions:
                description: Conditions the latest available observations of a resource's
                    current state.
                type: array
                items:
                  type: object
                  properties:
                    <<: *readyConditionProperties
              ingressChannelStatus:
                description: IngressChannelStatus corresponds to the ingress channel
                    status.
                type: object
                properties:
                  <<: *channelProperties
              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"
  names:
    kind: Parallel
    plural: parallels
    singular: parallel
    categories:
    - all
    - knative
    - flows
  scope: Namespaced
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: ["v1", "v1beta1"]
      clientConfig:
        service:
          name: eventing-webhook
          namespace: knative-eventing
