# Copyright 2022 TriggerMesh Inc.
#
# 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: httptargets.targets.triggermesh.io
  labels:
    knative.dev/crd-install: 'true'
    triggermesh.io/crd-install: 'true'
    duck.knative.dev/addressable: 'true'
  annotations:
    registry.triggermesh.io/acceptedEventTypes: |
      [
        { "type": "*" }
      ]
    registry.knative.dev/eventTypes: |
      [
        { "type": "*" }
      ]
spec:
  group: targets.triggermesh.io
  names:
    kind: HTTPTarget
    plural: httptargets
    categories:
    - all
    - knative
    - eventing
    - targets
  scope: Namespaced
  versions:
  - name: v1alpha1
    served: true
    storage: true
    subresources:
      status: {}
    schema:
      openAPIV3Schema:
        type: object
        description: TriggerMesh event target for generic HTTP endpoints.
        properties:
          spec:
            type: object
            description: Desired state of event target.
            properties:
              response:
                type: object
                properties:
                  eventType:
                    description: EventType is required to set the Type for the ingested event.
                    type: string
                    minLength: 1
                  eventSource:
                    description: EventSource is an optional but recommended field for identifying the instance producing the
                      events.
                    type: string
                required:
                - eventType
              endpoint:
                description: An HTTP based REST endpoint to stream events to.
                type: string
                format: url
                pattern: ^https?:\/\/.+$
              method:
                description: The HTTP method to use for the request.
                type: string
                enum: [GET, POST, PUT, PATCH, DELETE]
              skipVerify:
                description: Skip validation and verification of the SSL/TLS certificate.
                type: boolean
                default: false
              caCertificate:
                description: The CA certificate used to sign the certificated used by the target server.
                type: string
              basicAuthUsername:
                description: When using HTTP Basic authentication, the username to connect to the target service.
                type: string
              basicAuthPassword:
                description: When using HTTP Basic authentication, the password to connect to the target service.
                type: object
                properties:
                  secretKeyRef:
                    type: object
                    properties:
                      key:
                        type: string
                      name:
                        type: string
              oauthClientID:
                description: When using OAuth, the client id used to authenticate against the target service.
                type: string
              oauthClientSecret:
                description: When using OAuth, the client secret used to authenticate against the target service
                type: object
                properties:
                  secretKeyRef:
                    type: object
                    properties:
                      key:
                        type: string
                      name:
                        type: string
              oauthTokenURL:
                description: When using OAuth, the Token URL used to sign the request against.
                type: string
              oauthScopes:
                description: When using OAuth, the scopes required by the target to use the service.
                type: array
                items:
                  type: string
              headers:
                description: Additional headers required to be set when communicating wiht the target service.
                type: object
                additionalProperties:
                  type: string
              adapterOverrides:
                description: Kubernetes object parameters to apply on top of default adapter values.
                type: object
                properties:
                  public:
                    description: Adapter visibility scope.
                    type: boolean
                  resources:
                    description: Compute Resources required by the adapter. More info at https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
                    type: object
                    properties:
                      limits:
                        additionalProperties:
                          anyOf:
                          - type: integer
                          - type: string
                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                          x-kubernetes-int-or-string: true
                        description: Limits describes the maximum amount of compute resources allowed. More info at https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
                        type: object
                      requests:
                        additionalProperties:
                          anyOf:
                          - type: integer
                          - type: string
                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                          x-kubernetes-int-or-string: true
                        description: Requests describes the minimum amount of compute resources required. If Requests is omitted
                          for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined
                          value. More info at https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
                        type: object
                  tolerations:
                    description: Pod tolerations, as documented at https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
                    type: array
                    items:
                      type: object
                      properties:
                        key:
                          description: Taint key that the toleration applies to.
                          type: string
                        operator:
                          description: Key's relationship to the value.
                          type: string
                          enum: [Exists, Equal]
                        value:
                          description: Taint value the toleration matches to.
                          type: string
                        effect:
                          description: Taint effect to match.
                          type: string
                          enum: [NoSchedule, PreferNoSchedule, NoExecute]
                        tolerationSeconds:
                          description: Period of time a toleration of effect NoExecute tolerates the taint.
                          type: integer
                          format: int64
            required:
            - endpoint
            - method
          status:
            type: object
            description: Reported status of the event target.
            properties:
              observedGeneration:
                type: integer
                format: int64
              conditions:
                type: array
                items:
                  type: object
                  properties:
                    type:
                      type: string
                    status:
                      type: string
                      enum: ['True', 'False', Unknown]
                    severity:
                      type: string
                      enum: [Error, Warning, Info]
                    reason:
                      type: string
                    message:
                      type: string
                    lastTransitionTime:
                      type: string
                      format: date-time
                  required:
                  - type
                  - status
              address:
                type: object
                properties:
                  url:
                    type: string
    additionalPrinterColumns:
    - name: URL
      type: string
      jsonPath: .status.address.url
    - name: Ready
      type: string
      jsonPath: .status.conditions[?(@.type=='Ready')].status
    - name: Reason
      type: string
      jsonPath: .status.conditions[?(@.type=='Ready')].reason
    - name: Age
      type: date
      jsonPath: .metadata.creationTimestamp
