# 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: elasticsearchtargets.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": "io.triggermesh.elasticsearch.doc.index" }
      ]
    registry.knative.dev/eventTypes: |
      [
        { "type": "io.triggermesh.elasticsearch.doc.index.response" }
      ]
spec:
  group: targets.triggermesh.io
  names:
    kind: ElasticsearchTarget
    plural: elasticsearchtargets
    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 Elasticsearch.
        properties:
          spec:
            type: object
            properties:
              indexName:
                description: Elasticsearch index to stream the events to.
                type: string
              connection:
                type: object
                description: Attributes for connecting to a private Elasticsearch instance or Elastic cloud.
                properties:
                  addresses:
                    description: Hostname/IP Address of the Elasticsearch instance to stream events to.
                    type: array
                    items:
                      type: string
                      minLength: 1
                  skipVerify:
                    description: Skip verification of SSL/TLS certificates.
                    type: boolean
                  username:
                    description: Elasticsearch instance username.
                    type: string
                  password:
                    description: Elasticsearch instance password.
                    type: object
                    properties:
                      secretKeyRef:
                        type: object
                        properties:
                          key:
                            type: string
                          name:
                            type: string
                  apiKey:
                    description: API Key to connect to the Elasticsearch instance.
                    type: object
                    properties:
                      secretKeyRef:
                        type: object
                        properties:
                          key:
                            type: string
                          name:
                            type: string
                required:
                - addresses
                oneOf:
                - required: [username, password]
                - required: [apiKey]

              eventOptions:
                type: object
                description: 'When should this target generate a response event for processing: always, on error, or
                  never.'
                properties:
                  payloadPolicy:
                    type: string
                    enum: [always, error, never]
              discardCloudEventContext:
                description: Whether to omit CloudEvent context attributes in documents created in Elasticsearch.
                  When this property is false (default), the entire CloudEvent payload is included.
                  When this property is true, only the CloudEvent data is included.
                type: boolean
            required:
            - connection
            - indexName
          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
