# 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"
  name: containersources.sources.knative.dev
spec:
  group: sources.knative.dev
  versions:
    - &version
      name: v1alpha2
      served: true
      storage: false
      subresources:
        status: {}
      schema:
        openAPIV3Schema: &openAPIV3Schema
          type: object
          description: 'ContainerSource is an event source that starts a container image which generates events under certain situations and sends messages to a sink URI'
          properties:
              spec:
                  type: object
                  description: 'ContainerSourceSpec defines the desired state of ContainerSource (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
                                  x-kubernetes-preserve-unknown-fields: true
                      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
                      template:
                          description: 'Template describes the pods that will be created'
                          type: object
                          properties:
                              annotations:
                                  description: 'Annotations is an unstructured key value map
                                      stored with a resource that may be set by external tools
                                      to store and retrieve arbitrary metadata. They are not
                                      queryable and should be preserved when modifying objects.
                                      More info: http://kubernetes.io/docs/user-guide/annotations'
                                  type: object
                                  x-kubernetes-preserve-unknown-fields: true
                              clusterName:
                                  description: 'The name of the cluster which the object belongs
                                      to. This is used to distinguish resources with same name
                                      and namespace in different clusters. This field is not
                                      set anywhere right now and apiserver is going to ignore
                                      it if set in create or update request.'
                                  type: string
                              creationTimestamp:
                                  description: 'CreationTimestamp is a timestamp representing
                                      the server time when this object was created. It is not
                                      guaranteed to be set in happens-before order across separate
                                      operations. Clients may not set this value. It is represented
                                      in RFC3339 form and is in UTC.  Populated by the system.
                                      Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata'
                                  type: string
                              deletionGracePeriodSeconds:
                                  description: 'Number of seconds allowed for this object to
                                      gracefully terminate before it will be removed from the
                                      system. Only set when deletionTimestamp is also set. May
                                      only be shortened. Read-only.'
                                  type: integer
                                  format: int64
                              deletionTimestamp:
                                  description: 'DeletionTimestamp is RFC 3339 date and time
                                      at which this resource will be deleted. This field is
                                      set by the server when a graceful deletion is requested
                                      by the user, and is not directly settable by a client.
                                      The resource is expected to be deleted (no longer visible
                                      from resource lists, and not reachable by name) after
                                      the time in this field, once the finalizers list is empty.
                                      As long as the finalizers list contains items, deletion
                                      is blocked. Once the deletionTimestamp is set, this value
                                      may not be unset or be set further into the future, although
                                      it may be shortened or the resource may be deleted prior
                                      to this time. For example, a user may request that a pod
                                      is deleted in 30 seconds. The Kubelet will react by sending
                                      a graceful termination signal to the containers in the
                                      pod. After that 30 seconds, the Kubelet will send a hard
                                      termination signal (SIGKILL) to the container and after
                                      cleanup, remove the pod from the API. In the presence
                                      of network partitions, this object may still exist after
                                      this timestamp, until an administrator or automated process
                                      can determine the resource is fully terminated. If not
                                      set, graceful deletion of the object has not been requested.  Populated
                                      by the system when a graceful deletion is requested. Read-only.
                                      More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata'
                                  type: string
                              finalizers:
                                  description: 'Must be empty before the object is deleted from
                                      the registry. Each entry is an identifier for the responsible
                                      component that will remove the entry from the list. If
                                      the deletionTimestamp of the object is non-nil, entries
                                      in this list can only be removed. Finalizers may be processed
                                      and removed in any order.  Order is NOT enforced because
                                      it introduces significant risk of stuck finalizers. finalizers
                                      is a shared field, any actor with permission can reorder
                                      it. If the finalizer list is processed in order, then
                                      this can lead to a situation in which the component responsible
                                      for the first finalizer in the list is waiting for a signal
                                      (field value, external system, or other) produced by a
                                      component responsible for a finalizer later in the list,
                                      resulting in a deadlock. Without enforced ordering finalizers
                                      are free to order amongst themselves and are not vulnerable
                                      to ordering changes in the list.'
                                  type: array
                                  items:
                                      type: string
                              generateName:
                                  description: 'GenerateName is an optional prefix, used by
                                      the server, to generate a unique name ONLY IF the Name
                                      field has not been provided. If this field is used, the
                                      name returned to the client will be different than the
                                      name passed. This value will also be combined with a unique
                                      suffix. The provided value has the same validation rules
                                      as the Name field, and may be truncated by the length
                                      of the suffix required to make the value unique on the
                                      server.  If this field is specified and the generated
                                      name exists, the server will NOT return a 409 - instead,
                                      it will either return 201 Created or 500 with Reason ServerTimeout
                                      indicating a unique name could not be found in the time
                                      allotted, and the client should retry (optionally after
                                      the time indicated in the Retry-After header).  Applied
                                      only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency'
                                  type: string
                              generation:
                                  description: 'A sequence number representing a specific generation
                                      of the desired state. Populated by the system. Read-only.'
                                  type: integer
                                  format: int64
                              labels:
                                  description: 'Map of string keys and values that can be used
                                      to organize and categorize (scope and select) objects.
                                      May match selectors of replication controllers and services.
                                      More info: http://kubernetes.io/docs/user-guide/labels'
                                  type: object
                                  x-kubernetes-preserve-unknown-fields: true
                              managedFields:
                                  description: 'ManagedFields maps workflow-id and version to
                                      the set of fields that are managed by that workflow. This
                                      is mostly for internal housekeeping, and users typically
                                      shouldn''t need to set or understand this field. A workflow
                                      can be the user''s name, a controller''s name, or the
                                      name of a specific apply path like "ci-cd". The set of
                                      fields is always in the version that the workflow used
                                      when modifying the object. '
                                  type: array
                                  items:
                                      type: object
                                      properties:
                                          apiVersion:
                                              description: 'APIVersion defines the version of
                                                  this resource that this field set applies
                                                  to. The format is "group/version" just like
                                                  the top-level APIVersion field. It is necessary
                                                  to track the version of a field set because
                                                  it cannot be automatically converted.'
                                              type: string
                                          fieldsType:
                                              description: 'FieldsType is the discriminator
                                                  for the different fields format and version.
                                                  There is currently only one possible value:
                                                  "FieldsV1"'
                                              type: string
                                          fieldsV1:
                                              description: 'FieldsV1 holds the first JSON version
                                                  format as described in the "FieldsV1" type.'
                                              type: string
                                          manager:
                                              description: 'Manager is an identifier of the workflow
                                                  managing these fields.'
                                              type: string
                                          operation:
                                              description: 'Operation is the type of operation
                                                  which lead to this ManagedFieldsEntry being
                                                  created. The only valid values for this field
                                                  are "Apply" and "Update".'
                                              type: string
                                          time:
                                              description: 'Time is timestamp of when these fields
                                                  were set. It should always be empty if Operation
                                                  is "Apply"'
                                              type: string
                              name:
                                  description: 'Name must be unique within a namespace. Is required
                                      when creating resources, although some resources may allow
                                      a client to request the generation of an appropriate name
                                      automatically. Name is primarily intended for creation
                                      idempotence and configuration definition. Cannot be updated.
                                      More info: http://kubernetes.io/docs/user-guide/identifiers#names'
                                  type: string
                              namespace:
                                  description: 'Namespace defines the space within each name
                                      must be unique. An empty namespace is equivalent to the
                                      "default" namespace, but "default" is the canonical representation.
                                      Not all objects are required to be scoped to a namespace
                                      - the value of this field for those objects will be empty.  Must
                                      be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces'
                                  type: string
                              ownerReferences:
                                  description: 'List of objects depended by this object. If ALL
                                      objects in the list have been deleted, this object will
                                      be garbage collected. If this object is managed by a controller,
                                      then an entry in this list will point to this controller,
                                      with the controller field set to true. There cannot be
                                      more than one managing controller.'
                                  type: array
                                  items:
                                      type: object
                                      properties:
                                          apiVersion:
                                              description: 'API version of the referent.'
                                              type: string
                                          blockOwnerDeletion:
                                              description: 'If true, AND if the owner has the
                                                  "foregroundDeletion" finalizer, then the owner
                                                  cannot be deleted from the key-value store
                                                  until this reference is removed. Defaults
                                                  to false. To set this field, a user needs
                                                  "delete" permission of the owner, otherwise
                                                  422 (Unprocessable Entity) will be returned.'
                                              type: boolean
                                          controller:
                                              description: 'If true, this reference points to
                                                  the managing controller.'
                                              type: boolean
                                          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:
                                                  http://kubernetes.io/docs/user-guide/identifiers#names'
                                              type: string
                                          uid:
                                              description: 'UID of the referent. More info:
                                                  http://kubernetes.io/docs/user-guide/identifiers#uids'
                                              type: string
                              resourceVersion:
                                  description: 'An opaque value that represents the internal
                                      version of this object that can be used by clients to
                                      determine when objects have changed. May be used for optimistic
                                      concurrency, change detection, and the watch operation
                                      on a resource or set of resources. Clients must treat
                                      these values as opaque and passed unmodified back to the
                                      server. They may only be valid for a particular resource
                                      or set of resources.  Populated by the system. Read-only.
                                      Value must be treated as opaque by clients and . More
                                      info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
                                  type: string
                              selfLink:
                                  description: 'SelfLink is a URL representing this object. Populated
                                      by the system. Read-only.  DEPRECATED Kubernetes will
                                      stop propagating this field in 1.20 release and the field
                                      is planned to be removed in 1.21 release.'
                                  type: string
                              spec:
                                  description: 'Specification of the desired behavior of the pod. More info: Type ''kubectl explain pod.spec''. Also, https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status'
                                  type: object
                                  x-kubernetes-preserve-unknown-fields: true
                              uid:
                                  description: 'UID is the unique in time and space value for
                                      this object. It is typically generated by the server on
                                      successful creation of a resource and is not allowed to
                                      change on PUT operations.  Populated by the system. Read-only.
                                      More info: http://kubernetes.io/docs/user-guide/identifiers#uids'
                                  type: string
              status:
                  type: object
                  description: 'ContainerSourceStatus defines the observed state of ContainerSource (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
      # the schema of v1beta1 is exactly the same as v1alpha2 schema
      schema:
        openAPIV3Schema:
          <<: *openAPIV3Schema
    - <<: *version
      name: v1
      served: true
      storage: true
      # the schema of v1 is exactly the same as v1beta1 schema
      schema:
        openAPIV3Schema:
          <<: *openAPIV3Schema

  names:
    categories:
      - all
      - knative
      - sources
    kind: ContainerSource
    plural: containersources
    singular: containersource
  scope: Namespaced
  conversion:
    strategy: Webhook
    webhook:
      conversionReviewVersions: ["v1", "v1beta1"]
      clientConfig:
        service:
          name: eventing-webhook
          namespace: knative-eventing
