// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
= {{ .Image }} {{ .Kamelet.Spec.Definition.Title }}

*Provided by: "{{ index .Kamelet.ObjectMeta.Annotations "camel.apache.org/provider" }}"*

*Support Level for this Kamelet is: "{{ index .Kamelet.ObjectMeta.Annotations "camel.apache.org/kamelet.support.level" }}"*

{{ .Kamelet.Spec.Definition.Description }}

== Configuration Options
{{ if .HasProperties }}
The following table summarizes the configuration options available for the `{{ .Kamelet.ObjectMeta.Name }}` Kamelet:
{{ .Properties }}
NOTE: Fields marked with ({empty}*) are mandatory.
{{ else }}
The Kamelet does not specify any configuration option.
{{ end }}
== Usage

This section summarizes how the `{{ .Kamelet.ObjectMeta.Name }}` can be used in various contexts.

=== Knative {{ index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type" | ToCamel }}

{{ if eq (index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type") "action" -}}
The `{{ .Kamelet.ObjectMeta.Name }}` Kamelet can be used as intermediate step in a Knative binding.
{{ else -}}
The `{{ .Kamelet.ObjectMeta.Name }}` Kamelet can be used as Knative {{ index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type" }} by binding it to a Knative object.
{{ end }}
{{- .SetVal "RefApiVersion" "messaging.knative.dev/v1" -}}{{- .SetVal "RefKind" "InMemoryChannel" -}}{{- .SetVal "RefName" "mychannel" }}
.{{ .Kamelet.ObjectMeta.Name }}-binding.yaml
[source,yaml]
----
{{ template "kamelet-binding-sink-source.tmpl" . }}
----
Make sure you have xref:latest@camel-k::installation/installation.adoc[Camel K installed] into the Kubernetes cluster you're connected to.

Save the `{{ .Kamelet.ObjectMeta.Name }}-binding.yaml` file into your hard drive, then configure it according to your needs.

You can run the {{ index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type" }} using the following command:

[source,shell]
----
kubectl apply -f {{ .Kamelet.ObjectMeta.Name }}-binding.yaml
----

==== *Dependencies*

The Kamelet needs the following dependencies:

{{range .Kamelet.Spec.Dependencies}}
- {{ . }}{{end}} 

==== *Binding to Knative using the Kamel CLI:*

The procedure described above can be simplified into a single execution of the `kamel bind` command:

[source,shell]
----
{{ .ExampleKamelBindCommand "channel/mychannel" }}
----

This will create the KameletBinding under the hood and apply it to the current namespace in the cluster.

=== Kafka {{ index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type" | ToCamel }}

{{ if eq (index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type") "action" -}}
The `{{ .Kamelet.ObjectMeta.Name }}` Kamelet can be used as intermediate step in a Kafka binding.
{{ else -}}
The `{{ .Kamelet.ObjectMeta.Name }}` Kamelet can be used as Kafka {{ index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type" }} by binding it to a Kafka topic.
{{ end }} {{- .SetVal "RefApiVersion" "kafka.strimzi.io/v1beta1" -}}{{- .SetVal "RefKind" "KafkaTopic" -}}{{- .SetVal "RefName" "my-topic" }}
.{{ .Kamelet.ObjectMeta.Name }}-binding.yaml
[source,yaml]
----
{{ template "kamelet-binding-sink-source.tmpl" . }}
----

Ensure that you've installed https://strimzi.io/[Strimzi] and created a topic named `my-topic` in the current namespace.
Make also sure you have xref:latest@camel-k::installation/installation.adoc[Camel K installed] into the Kubernetes cluster you're connected to.

Save the `{{ .Kamelet.ObjectMeta.Name }}-binding.yaml` file into your hard drive, then configure it according to your needs.

You can run the {{ index .Kamelet.ObjectMeta.Labels "camel.apache.org/kamelet.type" }} using the following command:

[source,shell]
----
kubectl apply -f {{ .Kamelet.ObjectMeta.Name }}-binding.yaml
----

==== *Binding to Kafka using the Kamel CLI:*

The procedure described above can be simplified into a single execution of the `kamel bind` command:

[source,shell]
----
{{ .ExampleKamelBindCommand "kafka.strimzi.io/v1beta1:KafkaTopic:my-topic" }}
----

This will create the KameletBinding under the hood and apply it to the current namespace in the cluster.

// THIS FILE IS AUTOMATICALLY GENERATED: DO NOT EDIT
