// 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
