= Templating
:description: Learn how templates work.


////
     THIS FILE IS AUTOGENERATED!

     To make changes please edit the contents of:
     https://github.com/redpanda-data/connect/blob/main/cmd/tools/docs_gen/templates/templates.adoc.tmpl
////

// © 2024 Redpanda Data Inc.

[CAUTION]
====
Templates are an experimental feature and are subject to change outside major version releases.
====

Templates are a way to define new {page-component-title} components (similar to plugins) that are implemented by generating a {page-component-title} config snippet from pre-defined parameter fields. This is useful when a common pattern of {page-component-title} configuration is used but with varying parameters each time.

A template is defined in a YAML file that can be imported when {page-component-title} runs using the flag `-t`:

[source,bash]
----
rpk connect run -t "./templates/*.yaml" -c ./config.yaml
----

The template describes the type of the component and configuration fields that can be used to customize it, followed by a xref:guides:bloblang/about.adoc[Bloblang mapping] that translates an object containing those fields into a Benthos config structure. This allows you to use logic to generate more complex configurations:

[tabs]
======
Template::
+
--

[source,yaml]
----
name: aws_sqs_list
type: input

fields:
  - name: urls
    type: string
    kind: list
  - name: region
    type: string
    default: us-east-1

mapping: |
  root.broker.inputs = this.urls.map_each(url -> {
    "aws_sqs": {
      "url": url,
      "region": this.region,
    }
  })
----
--
Config::
+
--

[source,yaml]
----
input:
  aws_sqs_list:
    urls:
      - https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue1
      - https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue2

pipeline:
  processors:
    - mapping: |
        root.id = uuid_v4()
        root.foo = this.inner.foo
        root.body = this.outer
----
--
Result::
+
--

[source,yaml]
----
input:
  broker:
    inputs:
      - aws_sqs:
          url: https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue1
          region: us-east-1
      - aws_sqs:
          url: https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue2
          region: us-east-1

pipeline:
  processors:
    - mapping: |
        root.id = uuid_v4()
        root.foo = this.inner.foo
        root.body = this.outer
----
--
======

You can see more examples of templates on https://github.com/redpanda-data/connect/blob/main/config/template_examples[GitHub^].

== Fields

The schema of a template file is as follows:

=== `name`

The name of the component this template will create.


*Type*: `string`


=== `type`

The type of the component this template will create.


*Type*: `string`


Options:
`cache`
, `input`
, `output`
, `processor`
, `rate_limit`
.

=== `status`

The stability of the template describing the likelihood that the configuration spec of the template, or it's behavior, will change.


*Type*: `string`

*Default*: `"stable"`

|===
| Option | Summary

| `stable`
| This template is stable and will therefore not change in a breaking way outside of major version releases.
| `beta`
| This template is beta and will therefore not change in a breaking way unless a major problem is found.
| `experimental`
| This template is experimental and therefore subject to breaking changes outside of major version releases.

|===

=== `categories`

An optional list of tags, which are used for arbitrarily grouping components in documentation.


*Type*: `array`

*Default*: `[]`

=== `summary`

A short summary of the component.


*Type*: `string`

*Default*: `""`

=== `description`

A longer form description of the component and how to use it.


*Type*: `string`

*Default*: `""`

=== `fields`

The configuration fields of the template, fields specified here will be parsed from a Benthos config and will be accessible from the template mapping.


*Type*: `array`


=== `fields[].name`

The name of the field.


*Type*: `string`


=== `fields[].description`

A description of the field.


*Type*: `string`

*Default*: `""`

=== `fields[].type`

The scalar type of the field.


*Type*: `string`


|===
| Option | Summary

| `string`
| standard string type
| `int`
| standard integer type
| `float`
| standard float type
| `bool`
| a boolean true/false
| `unknown`
| allows for nesting arbitrary configuration inside of a field

|===

=== `fields[].kind`

The kind of the field.


*Type*: `string`

*Default*: `"scalar"`

Options:
`scalar`
, `map`
, `list`
.

=== `fields[].default`

An optional default value for the field. If a default value is not specified then a configuration without the field is considered incorrect.


*Type*: `unknown`


=== `fields[].advanced`

Whether this field is considered advanced.


*Type*: `bool`

*Default*: `false`

=== `mapping`

A xref:guides:bloblang/about.adoc[Bloblang] mapping that translates the fields of the template into a valid Benthos configuration for the target component type.


*Type*: `string`


=== `metrics_mapping`

An optional xref:guides:bloblang/about.adoc[Bloblang mapping] that allows you to rename or prevent certain metrics paths from being exported. For more information check out the xref:components:metrics/about.adoc#metric-mapping[metrics documentation]. When metric paths are created, renamed and dropped a trace log is written, enabling TRACE level logging is therefore a good way to diagnose path mappings.

Invocations of this mapping are able to reference a variable $label in order to obtain the value of the label provided to the template config. This allows you to match labels with the root of the config.


*Type*: `string`

*Default*: `""`

```yml
# Examples

metrics_mapping: this.replace("input", "source").replace("output", "sink")

metrics_mapping: |-
  root = if ![
    "input_received",
    "input_latency",
    "output_sent"
  ].contains(this) { deleted() }
```

=== `tests`

Optional unit test definitions for the template that verify certain configurations produce valid configs. These tests are executed with the command `rpk connect template lint`.


*Type*: `array`

*Default*: `[]`

=== `tests[].name`

A name to identify the test.


*Type*: `string`


=== `tests[].config`

A configuration to run this test with, the config resulting from applying the template with this config will be linted.


*Type*: `object`


=== `tests[].expected`

An optional configuration describing the expected result of applying the template, when specified the result will be diffed and any mismatching fields will be reported as a test error.


*Type*: `object`


