Expression Examples
Codiac expressions are JSONata expressions evaluated against a structured context object. They work in three places:
- Config setting values — the expression result becomes the setting's value at deploy time
- Config setting conditions — controls whether a setting is included in a deployment
- Asset deploy conditions — controls whether an asset is deployed at all
For the full list of available fields and functions, see Expression Context Reference.
Deploy conditions
Deploy conditions gate whether an asset is deployed at all. A falsy result skips the asset with a reason message included in the deploy output.
Limit an asset to the dev environment
environment.name = "dev"
The asset deploys only when the environment is named dev. In all other environments it is skipped with its condition reason.
Limit an asset to a specific cloud provider
cluster.provider = "azure"
Useful when an asset depends on a cloud-specific service not available elsewhere.
Deploy only when ingress is enabled
cluster.ingress.enabled = true
Useful for assets that are only meaningful when the cluster has external routing active, such as API gateways or public frontends.
Deploy only when ingress is public
cluster.ingress.private = false
Skips the asset on clusters configured with private-only ingress.
Config setting conditions
Setting conditions control whether a specific config entry is included in a deployment. A falsy result omits the setting entirely — as if it were never set at that scope.
Include a setting only in production
environment.name = "prod"
Useful for production-only flags such as analytics tokens, rate limits, or feature gates.
Exclude a setting from a specific enterprise
enterprise.name != "sandbox"
Apply a setting only when ingress is private
cluster.ingress.private = true
Config setting values
In a config value, the expression result becomes the value itself. Use this to build values dynamically from the deployment context rather than maintaining them per-environment.
Embed the asset name in a URL
"https://" & asset.name & ".internal.example.com"
If asset.name is "payments-api", this resolves to https://payments-api.internal.example.com.
Use the cluster region in a config
cluster.location.code
Resolves to the cloud region code at deploy time (e.g., "eastus" or "us-east-1").
Build a scoped logging tag
asset.name & " [" & cabinet.namespace & "]"
Produces a prefix like payments-api [prod-us-east] — useful as a log source label when the same config template is shared across cabinets.
Using $hostmap() in config values
$hostmap(strategy, domain) resolves a concrete hostname from the cabinet's ingress configuration. Use it to wire a fully-resolved domain into a config value at deploy time, so you don't have to maintain per-environment hostnames manually.
Set an API base URL from the cluster's ingress
"https://" & $hostmap("svc.cab.domain", "example.com")
If the cabinet resolves to api.dev-cabinet.example.com, this produces https://api.dev-cabinet.example.com.
Path-routed service prefix
$hostmap_path("svc.cab.domain", "example.com")
Returns the path prefix for clusters configured with path-based routing instead of subdomain routing.
See Ingress and Domain Routing for details on host naming strategies.
Inline secrets
Use @{secrets.<storeName>.<secretKey>} to embed a secret from a KVP store directly within a config value at deploy time. Codiac fetches each referenced store once before expression evaluation begins, so all references to the same store are batched into a single call.
Supported stores: Azure Key Vault, AWS Secrets Manager.
Connection string with an embedded password
"Server=prod-db;Database=myapp;Password=" & secrets.myVault.DB_PASS
The value stored in Codiac is the expression above. At deploy time, Codiac fetches DB_PASS from myVault and writes the fully resolved connection string into the config.
Inline secret in a post-deploy job spec
postDeployJob:
connectionString: "Server=prod-db;Password=@{secrets.myVault.DB_PASS}"
apiKey: "@{secrets.myVault.API_KEY}"
Both secrets are fetched from myVault in a single call and embedded in the rendered config before the job runs.
Mix context fields and secrets in one value
"https://" & asset.name & ".example.com?token=" & secrets.myVault.SERVICE_TOKEN
Context fields and secret values can be combined in a single expression.
When to use inline secrets vs. sourcedSettings
Two mechanisms exist for pulling secret values into configs:
| Mechanism | Use when |
|---|---|
@{secrets.<store>.<key>} | The secret is one part of a larger composite string (connection string, job argument, URL) |
sourcedSettings (#REF|store|key) | The setting's entire value is the secret |
If API_KEY is the whole value of a setting, use sourcedSettings. If it needs to be embedded in Bearer @{secrets.myVault.API_KEY}, use an inline expression.
Error behavior
If the referenced store or key cannot be resolved, the deploy fails immediately with a clear error message identifying the unresolved expression. There is no fallback or silent empty value.
Pre-deploy init container: logging setup
When configuring a pre-deploy hook — for example, an init container that sets up log shipping — you can use context fields to scope the logging output to the specific asset and cabinet without hard-coding those values.
Log source label (config value):
asset.name & "-" & cabinet.namespace
Environment scope label (config value):
enterprise.name & "/" & environment.name
Condition — only inject the logging config outside dev:
environment.name != "dev"
Because config conditions are evaluated at deploy time, the logging init container config is automatically omitted when deploying to dev and injected everywhere else — with no per-environment duplication.
What's next
- Expression Context Reference — Full schema of available fields and functions
- Manage configs — How to set expressions on config values and conditions
- Ingress and Domain Routing — Host mapping and
$hostmap()in depth