Output Engine

Using Jsonnet

Use Jsonnet's variables, functions, and imports for complex, modular output generation from graph data.

Using Jsonnet

While Tera is excellent for simple text substitution, Jsonnet is a data templating language designed for generating configuration data. It allows for local variables, functions, mixins, and imports, making it ideal for complex output generation. For advanced examples consult case studies.

When using jsonnet, the data context is injected as External Variables. You access them using std.extVar().

  • origin_resource: Access the current resource and its traversed graph context using std.extVar("origin_resource").
  • Global Variables: Any variables defined in the TOML header are also available via std.extVar("var_name").

Example 1: Inline Jsonnet Logic

[[output]]
resource_type = "k8s_manifest"
name = "svc-{{ origin_resource.name }}" # Name generation still uses Tera
jsonnet = """
local origin = std.extVar("origin_resource");
{
  apiVersion: "v1",
  kind: "Service",
  metadata: {
    name: origin.name,
    labels: {
      // Use Jsonnet logic
      app: if std.length(origin.application) > 0 then origin.application[0].name else "unknown"
    }
  }
}
"""

Example 2: Modular Logic with Imports

rescile supports sibling imports, meaning you can import .libsonnet or .jsonnet files located in the same directory as your TOML configuration file. This promotes modularity and reuse.

data/output/k8s.libsonnet:

{
  service(name):: {
    apiVersion: "v1",
    kind: "Service",
    metadata: { name: name }
  }
}

data/output/services.toml:

[[output]]
resource_type = "k8s_manifest"
name = "svc-{{ origin_resource.name }}"
jsonnet = """
local k8s = import 'k8s.libsonnet';
local origin = std.extVar("origin_resource");

k8s.service(origin.name)
"""