# 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"
    knative.dev/crd-install: "true"
  annotations:
    # TODO add schemas and descriptions
    registry.knative.dev/eventTypes: |
      [
        { "type": "dev.knative.sources.ping" }
      ]
  name: pingsources.sources.knative.dev
spec:
  group: sources.knative.dev
  versions:
  - &version
    name: v1alpha2
    served: true
    storage: true
    subresources:
      status: {}
    schema:
      openAPIV3Schema:
        type: object
        description: 'PingSource describes an event source with a fixed payload produced on a specified cron schedule.'
        properties:
          spec:   
            type: object
            description: 'PingSourceSpec defines the desired state of the PingSource (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
                            x-kubernetes-preserve-unknown-fields: true
                jsonData:
                    description: 'JsonData is json encoded data used as the body of the
                        event posted to the sink. Default is empty. If set, datacontenttype
                        will also be set to "application/json".'
                    type: string
                schedule:
                    description: 'Schedule is the cronjob schedule. Defaults to `* * *
                        * *`.'
                    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
          status:
              type: object
              description: 'PingSourceStatus defines the observed state of PingSource (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        
    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: v1beta1
    served: true
    storage: false
    schema:
      openAPIV3Schema:
        type: object
        description: 'PingSource describes an event source with a fixed payload produced on a specified cron schedule.'
        properties:
          spec:
            type: object
            description: 'PingSourceSpec defines the desired state of the PingSource (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                            
                            x-kubernetes-preserve-unknown-fields: true
                jsonData:
                    description: 'JsonData is json encoded data used as the body of the
                        event posted to the sink. Default is empty. If set, datacontenttype
                        will also be set to "application/json".'
                    type: string
                schedule:
                    description: 'Schedule is the cronjob schedule. Defaults to `* * *
                        * *`.'
                    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
                timezone:
                    description: 'Timezone modifies the actual time relative to the specified
                        timezone. Defaults to the system time zone. More general information
                        about time zones: https://www.iana.org/time-zones List of valid
                        timezone values: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones'
                    type: string                
          status:
              type: object
              description: 'PingSourceStatus defines the observed state of PingSource (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
    kind: PingSource
    plural: pingsources
  scope: Namespaced
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: ["v1", "v1beta1"]
      clientConfig:
        service:
          name: eventing-webhook
          namespace: knative-eventing
