Skip to main content
Version: Next

Context Variables

This reference documents all context variables available in ComponentType and Trait templates. These variables provide access to component metadata, parameters, workload specifications, and platform configuration.

ComponentType Variables​

The following variables are available in ComponentType resource templates.

metadata​

Platform-computed metadata for resource generation.

FieldTypeDescription
metadata.namestringBase name for generated resources (e.g., my-service-dev-a1b2c3d4)
metadata.namespacestringTarget namespace for resources
metadata.componentNamestringName of the component
metadata.componentUIDstringUnique identifier of the component
metadata.projectNamestringName of the project
metadata.projectUIDstringUnique identifier of the project
metadata.environmentNamestringName of the environment (e.g., development, production)
metadata.environmentUIDstringUnique identifier of the environment
metadata.dataPlaneNamestringName of the data plane
metadata.dataPlaneUIDstringUnique identifier of the data plane
metadata.labelsmapCommon labels to add to all resources
metadata.annotationsmapCommon annotations to add to all resources
metadata.podSelectorsmapPlatform-injected selectors for pod identity

Usage:

metadata:
name: ${metadata.name}
namespace: ${metadata.namespace}
labels: ${metadata.labels}
spec:
selector:
matchLabels: ${metadata.podSelectors}

parameters​

Component parameters from Component.spec.parameters with schema defaults applied. Use for static configuration that doesn't change across environments.

# Access parameters defined in schema.parameters
replicas: ${parameters.replicas}
port: ${parameters.port}

# Nested parameters
database:
host: ${parameters.database.host}
port: ${parameters.database.port}

envOverrides​

Environment-specific overrides from ReleaseBinding.spec.componentTypeEnvOverrides with schema defaults applied. Use for values that vary per environment (resources, replicas, etc.).

# Access environment-specific values
replicas: ${envOverrides.replicas}
resources:
limits:
cpu: ${envOverrides.resources.cpu}
memory: ${envOverrides.resources.memory}

workload​

Workload specification from the Workload resource.

FieldTypeDescription
workload.containersmapMap of container configurations keyed by container name
workload.containers[name].imagestringContainer image
workload.containers[name].command[]stringContainer command
workload.containers[name].args[]stringContainer arguments

Usage:

containers:
- name: app
image: ${workload.containers["main"].image}
command: ${workload.containers["main"].command}
args: ${workload.containers["main"].args}

# Dynamic container name from parameters
image: ${workload.containers[parameters.containerName].image}

configurations​

Configuration and secret references extracted from workload, keyed by container name.

FieldTypeDescription
configurations[name].configs.envs[]objectEnvironment variable configs (each has name, value)
configurations[name].configs.files[]objectFile configs (each has name, mountPath, value)
configurations[name].secrets.envs[]objectSecret env vars (each has name, value, remoteRef)
configurations[name].secrets.files[]objectSecret files (each has name, mountPath, remoteRef)

The remoteRef object contains: key, property (optional), version (optional).

Usage:

# Access config envs for a container
env: |
${configurations["main"].configs.envs.map(e, {"name": e.name, "value": e.value})}

# Check if container has config files
includeWhen: ${has(configurations["main"].configs.files) && configurations["main"].configs.files.size() > 0}

See Configuration Helpers for helper functions that simplify working with configurations.

dataplane​

Data plane configuration.

FieldTypeDescription
dataplane.secretStorestringName of the ClusterSecretStore for external secrets
dataplane.publicVirtualHoststringPublic virtual host for external access

Usage:

# ExternalSecret configuration
spec:
secretStoreRef:
name: ${dataplane.secretStore}
kind: ClusterSecretStore

# HTTPRoute hostname
hostnames:
- ${metadata.name}.${dataplane.publicVirtualHost}

Trait Variables​

Traits have access to all the same variables as ComponentTypes, plus trait-specific variables.

trait​

Trait-specific metadata.

FieldTypeDescription
trait.namestringName of the trait (e.g., persistent-volume)
trait.instanceNamestringUnique instance name within the component (e.g., data-storage)

Usage:

# Use trait instance name for resource naming
metadata:
name: ${metadata.name}-${trait.instanceName}

# Use trait name in labels
labels:
trait: ${trait.name}
instance: ${trait.instanceName}

parameters (Traits)​

Trait instance parameters from Component.spec.traits[].parameters with schema defaults applied.

# Access trait-specific parameters
volumeMounts:
- name: ${parameters.volumeName}
mountPath: ${parameters.mountPath}

envOverrides (Traits)​

Environment-specific overrides from ReleaseBinding.spec.traitOverrides[instanceName] with schema defaults applied.

# Access environment-specific trait values
resources:
requests:
storage: ${envOverrides.size}
storageClassName: ${envOverrides.storageClass}

Variable Availability Summary​

VariableComponentTypeTrait createsTrait patches
metadata.*YesYesYes
parametersYesYesYes
envOverridesYesYesYes
workload.*YesNoNo
configurations.*YesNoNo
dataplane.*YesYesYes
trait.*NoYesYes
resource (patch target)NoNoYes (in where)

Examples​

ComponentType Using All Variables​

apiVersion: openchoreo.dev/v1alpha1
kind: ComponentType
metadata:
name: web-service
spec:
workloadType: deployment
resources:
- id: deployment
template:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${metadata.name}
namespace: ${metadata.namespace}
labels: ${metadata.labels}
spec:
replicas: ${envOverrides.replicas}
selector:
matchLabels: ${metadata.podSelectors}
template:
metadata:
labels: ${metadata.podSelectors}
spec:
containers:
- name: app
image: ${workload.containers["main"].image}
ports:
- containerPort: ${parameters.port}
envFrom: ${configurations.toContainerEnvFrom("main")}

Trait Using Trait-Specific Variables​

apiVersion: openchoreo.dev/v1alpha1
kind: Trait
metadata:
name: persistent-volume
spec:
creates:
- template:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ${metadata.name}-${trait.instanceName}
namespace: ${metadata.namespace}
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: ${envOverrides.storageClass}
resources:
requests:
storage: ${envOverrides.size}