# ---------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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: camel.apache.org/v1
kind: Kamelet
metadata:
  name: kafka-ssl-source
  annotations:
    camel.apache.org/kamelet.support.level: "Stable"
    camel.apache.org/catalog.version: "4.10.2"
    camel.apache.org/kamelet.icon: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA1MDAgNTAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MDAgNTAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8ZyBpZD0iWE1MSURfMV8iPg0KCTxwYXRoIGlkPSJYTUxJRF85XyIgZD0iTTMxNC44LDI2OS43Yy0xNC4yLDAtMjcsNi4zLTM1LjcsMTYuMkwyNTYuOCwyNzBjMi40LTYuNSwzLjctMTMuNiwzLjctMjAuOWMwLTcuMi0xLjMtMTQuMS0zLjYtMjAuNg0KCQlsMjIuMy0xNS43YzguNyw5LjksMjEuNCwxNi4xLDM1LjYsMTYuMWMyNi4yLDAsNDcuNi0yMS4zLDQ3LjYtNDcuNnMtMjEuMy00Ny42LTQ3LjYtNDcuNnMtNDcuNiwyMS4zLTQ3LjYsNDcuNg0KCQljMCw0LjcsMC43LDkuMiwyLDEzLjVsLTIyLjMsMTUuN2MtOS4zLTExLjYtMjIuOC0xOS42LTM4LjEtMjIuMXYtMjYuOWMyMS42LTQuNSwzNy44LTIzLjcsMzcuOC00Ni42YzAtMjYuMi0yMS4zLTQ3LjYtNDcuNi00Ny42DQoJCWMtMjYuMiwwLTQ3LjYsMjEuMy00Ny42LDQ3LjZjMCwyMi42LDE1LjgsNDEuNSwzNi45LDQ2LjN2MjcuM2MtMjguOCw1LjEtNTAuOCwzMC4yLTUwLjgsNjAuNWMwLDMwLjQsMjIuMiw1NS43LDUxLjIsNjAuNXYyOC44DQoJCWMtMjEuMyw0LjctMzcuNCwyMy43LTM3LjQsNDYuNGMwLDI2LjIsMjEuMyw0Ny42LDQ3LjYsNDcuNmMyNi4yLDAsNDcuNi0yMS4zLDQ3LjYtNDcuNmMwLTIyLjctMTYtNDEuOC0zNy40LTQ2LjR2LTI4LjgNCgkJYzE1LTIuNSwyOC4yLTEwLjQsMzcuNC0yMS44bDIyLjUsMTUuOWMtMS4yLDQuMy0xLjksOC43LTEuOSwxMy40YzAsMjYuMiwyMS4zLDQ3LjYsNDcuNiw0Ny42czQ3LjYtMjEuMyw0Ny42LTQ3LjYNCgkJQzM2Mi40LDI5MSwzNDEuMSwyNjkuNywzMTQuOCwyNjkuN3ogTTMxNC44LDE1OC40YzEyLjcsMCwyMy4xLDEwLjQsMjMuMSwyMy4xYzAsMTIuNy0xMC4zLDIzLjEtMjMuMSwyMy4xcy0yMy4xLTEwLjQtMjMuMS0yMy4xDQoJCUMyOTEuOCwxNjguOCwzMDIuMSwxNTguNCwzMTQuOCwxNTguNHogTTE3NiwxMTUuMWMwLTEyLjcsMTAuMy0yMy4xLDIzLjEtMjMuMWMxMi43LDAsMjMuMSwxMC40LDIzLjEsMjMuMQ0KCQljMCwxMi43LTEwLjMsMjMuMS0yMy4xLDIzLjFDMTg2LjMsMTM4LjIsMTc2LDEyNy44LDE3NiwxMTUuMXogTTIyMi4xLDM4NC45YzAsMTIuNy0xMC4zLDIzLjEtMjMuMSwyMy4xDQoJCWMtMTIuNywwLTIzLjEtMTAuNC0yMy4xLTIzLjFjMC0xMi43LDEwLjMtMjMuMSwyMy4xLTIzLjFDMjExLjgsMzYxLjgsMjIyLjEsMzcyLjIsMjIyLjEsMzg0Ljl6IE0xOTkuMSwyODEuMw0KCQljLTE3LjcsMC0zMi4yLTE0LjQtMzIuMi0zMi4yYzAtMTcuNywxNC40LTMyLjIsMzIuMi0zMi4yYzE3LjcsMCwzMi4yLDE0LjQsMzIuMiwzMi4yQzIzMS4yLDI2Ni45LDIxNi44LDI4MS4zLDE5OS4xLDI4MS4zeg0KCQkgTTMxNC44LDM0MC4zYy0xMi43LDAtMjMuMS0xMC40LTIzLjEtMjMuMWMwLTEyLjcsMTAuMy0yMy4xLDIzLjEtMjMuMXMyMy4xLDEwLjQsMjMuMSwyMy4xQzMzNy45LDMzMCwzMjcuNSwzNDAuMywzMTQuOCwzNDAuM3oiLz4NCjwvZz4NCjwvc3ZnPg0K"
    camel.apache.org/provider: "Apache Software Foundation"
    camel.apache.org/kamelet.group: "Kafka"
    camel.apache.org/kamelet.namespace: "Kafka"
  labels:
    camel.apache.org/kamelet.type: "source"
spec:
  definition:
    title: "Kafka SSL Source"
    description: |-
      Receive data from Kafka topics with SSL/TLS support
    required:
      - topic
      - bootstrapServers
      - sslTruststoreLocation
      - sslTruststorePassword
      - sslKeyPassword
    type: object
    properties:
      topic:
        title: Topic Names
        description: Comma separated list of Kafka topic names
        type: string
        x-descriptors:
          - urn:keda:metadata:topic
          - urn:keda:required
      bootstrapServers:
        title: Bootstrap Servers
        description: Comma separated list of Kafka Broker URLs
        type: string
        x-descriptors:
          - urn:keda:metadata:bootstrapServers
          - urn:keda:required
      securityProtocol:
        title: Security Protocol
        description: Protocol used to communicate with brokers. SASL_PLAINTEXT, PLAINTEXT, SASL_SSL and SSL are supported
        type: string
        default: SSL
      saslMechanism:
        title: SASL Mechanism
        description: The Simple Authentication and Security Layer (SASL) Mechanism used.
        type: string
        default: GSSAPI
      autoCommitEnable:
        title: Auto Commit Enable
        description: If true, periodically commit to ZooKeeper the offset of messages already fetched by the consumer
        type: boolean
        default: true
      allowManualCommit:
        title: Allow Manual Commit
        description: Whether to allow doing manual commits
        type: boolean
        default: false
      pollOnError:
        title: Poll On Error Behavior
        description: What to do if kafka threw an exception while polling for new messages. There are 5 enums and the value can be one of DISCARD, ERROR_HANDLER, RECONNECT, RETRY, STOP
        type: string
        default: "ERROR_HANDLER"
      autoOffsetReset:
        title: Auto Offset Reset
        description: What to do when there is no initial offset. There are 3 enums and the value can be one of latest, earliest, none
        type: string
        default: "latest"
        x-descriptors:
          - urn:keda:metadata:offsetResetPolicy
      consumerGroup:
        title: Consumer Group
        description: A string that uniquely identifies the group of consumers to which this source belongs
        type: string
        example: "my-group-id"
        x-descriptors:
          - urn:keda:metadata:consumerGroup
          - urn:keda:required
      deserializeHeaders:
        title: Automatically Deserialize Headers
        description: When enabled the Kamelet source will deserialize all message headers to String representation.
        type: boolean
        default: true
      sslKeyPassword:
        description: The password of the private key in the key store file.
        title: SSL Key Password
        type: string
        format: password
        x-descriptors:
          - urn:camel:group:credentials
          - urn:keda:authentication:password
          - urn:keda:required
      sslKeystorePassword:
        description: The store password for the key store file.This is optional for client and only needed if ssl.keystore.location is configured.
        title: SSL Keystore Password
        type: string
        format: password
        x-descriptors:
          - urn:camel:group:credentials
          - urn:keda:authentication:password
      sslEndpointAlgorithm:
        description: The endpoint identification algorithm to validate server hostname using server certificate. Use none or false to disable server hostname verification.
        title: SSL Endpoint Algorithm
        type: string
        default: https
      sslProtocol:
        description: The SSL protocol used to generate the SSLContext. Default setting is TLS, which is fine for most cases. Allowed values in recent JVMs are TLS, TLSv1.1 and TLSv1.2. SSL, SSLv2 and SSLv3 may be supported in older JVMs, but their usage is discouraged due to known security vulnerabilities.
        title: SSL Protocol
        type: string
        default: TLSv1.2
      sslKeystoreLocation:
        description: The location of the key store file. This is optional for client and can be used for two-way authentication for client.
        title: SSL Keystore Location
        type: string
      sslTruststoreLocation:
        description: The location of the trust store file.
        title: SSL Truststore Location
        type: string
      sslTruststorePassword:
        description: The store password for the trust store file.
        title: SSL Truststore Password
        type: string
        format: password
        x-descriptors:
          - urn:camel:group:credentials
          - urn:keda:authentication:password
      sslEnabledProtocols:
        description:   The list of protocols enabled for SSL connections. TLSv1.2, TLSv1.1 and TLSv1 are enabled by default.
        title: SSL Enabled Protocols
        type: string
        default: TLSv1.2,TLSv1.1,TLSv1
      saslJaasConfig:
        description: Java Authentication and Authorization Service (JAAS) for Simple Authentication and Security Layer (SASL) configuration.
        title: JAAS Configuration
        type: string
      topicIsPattern:
        title: Topic Is Pattern
        description: Whether the topic is a pattern (regular expression). This can be used to subscribe to dynamic number of topics matching the pattern.
        type: boolean
        default: false
  dependencies:
    - "camel:core"
    - "camel:kafka"
    - "camel:kamelet"
  template:
    beans:
      - name: kafka-ssl-source-local
        type: '#class:org.apache.camel.component.kafka.KafkaComponent'
      - name: kafka-ssl-source-configuration-local
        properties:
          brokers: '{{bootstrapServers}}'
          securityProtocol: '{{securityProtocol}}'
          sslKeystoreLocation: '{{sslKeystoreLocation}}'
          sslKeyPassword: '{{sslKeyPassword}}'
          sslKeystorePassword: '{{sslKeystorePassword}}'
          sslTruststoreLocation: '{{sslTruststoreLocation}}'
          sslTruststorePassword: '{{sslTruststorePassword}}'
          sslProtocol: '{{sslProtocol}}'
          sslEnabledProtocols: '{{sslEnabledProtocols}}'
          sslEndpointAlgorithm: '{{sslEndpointAlgorithm}}'
          saslMechanism: '{{saslMechanism}}'
          groupId: '{{?consumerGroup}}'
          autoOffsetReset: '{{autoOffsetReset}}'
          pollOnError: '{{pollOnError}}'
          allowManualCommit: '{{allowManualCommit}}'
          autoCommitEnable: '{{autoCommitEnable}}'
          saslJaasConfig: '{{?saslJaasConfig}}'
          topicIsPattern: '{{topicIsPattern}}'
        type: '#class:org.apache.camel.component.kafka.KafkaConfiguration'
      - name: kafkaHeaderDeserializer
        type: "#class:org.apache.camel.component.kamelet.utils.serialization.kafka.KafkaHeaderDeserializer"
        properties:
          enabled: '{{deserializeHeaders}}'
    from:
      uri: "{{kafka-ssl-source-local}}:{{topic}}"
      parameters:
        configuration: '#bean:{{kafka-ssl-source-configuration-local}}'
      steps:
        - process:
            ref: "{{kafkaHeaderDeserializer}}"
        - to: "kamelet:sink"