This glossary defines the canonical terminology for Kaoto's visual editor and how each concept maps to the underlying integration domain.
Terms are organized from broad to specific:
- DSL -- the supported file formats and their capabilities.
- Generic layer -- concepts that belong to the visual editor itself and are DSL-agnostic.
- Camel DSL layer -- concepts specific to Apache Camel Routes, Kamelet, and Pipe DSLs.
A DSL (Domain-Specific Language) in Kaoto is a file format for describing integrations. Kaoto detects the DSL from the file being edited and switches its visual editing rules accordingly -- which nodes are available in the catalog, how the canvas is laid out, and how many flows the file can contain.
Kaoto currently supports four DSLs:
| DSL | File format | Flows per file |
|---|---|---|
| Camel Routes | .camel.yaml |
Multiple |
| Kamelet | .kamelet.yaml |
Single |
| Pipe | .pipe.yaml |
Single |
| Citrus | Citrus YAML test | Single |
A top-level unit of work rendered on the Kaoto canvas. Every top-level entity in a DSL file produces exactly one flow in the visualization. A flow owns a graph of nodes.
Flows come in two kinds:
- Executable flows -- have a consumer start point and an end, representing a runnable integration path.
Examples: a Camel
route, a Kamelet, a Pipe, a Citrus test. - Configuration flows -- define cross-cutting rules or settings with no consumer start point.
Examples:
routeConfiguration,onException,intercept,onCompletion,restConfiguration.
Both kinds are equally valid flows in Kaoto's model; the distinction is informational.
Camel mapping: Each of the following produces one flow: route, routeConfiguration, rest,
onException, intercept, onCompletion, restConfiguration.
A node whose isGroup flag is true, rendered as an expandable container that holds child nodes. A group
is not a separate model type -- it is a regular IVisualizationNode / CanvasNode promoted to group status
when its underlying processor declares child step properties.
When expanded, a group renders as a bordered rectangle (CustomGroupExpanded) with a title bar, icon,
and its children laid out inside. When collapsed, it renders as a normal node with a child-count badge.
Camel mapping: Any processor that can contain child steps: choice, split, filter, doTry,
circuitBreaker, multicast, loadBalance, aggregate, loop, pipeline, saga, resequence, step,
and the from / when / otherwise / doCatch / doFinally / onFallback clauses. The top-level route
node is always a group.
A single visual element on the canvas, representing one executable step or structural element within a Flow.
Corresponds to IVisualizationNode in the code.
Nodes form a doubly-linked list for sequential flow (previousNode / nextNode) and a tree for
nesting (parentNode / children). Every node carries an IVisualizationNodeData payload with its name,
path into the underlying definition, icon, label, and JSON schema for its configuration form.
Camel mapping: An EIP processor instance (e.g. log, to, choice), the from consumer, or the
route group node.
A special node (isPlaceholder: true) that represents an insertion point where new steps can be added.
Placeholders are not executable -- they exist purely as interaction affordances.
Two fixed types:
| Type | Name | Purpose |
|---|---|---|
Placeholder |
'placeholder' |
Generic "add step" target at the end of a branch |
PlaceholderSpecialChild |
'placeholder-special-child' |
Empty-state target for special children (e.g. empty REST DSL) |
Dynamic placeholders are also created for specific clause slots (e.g. a when placeholder inside a choice
group), using the clause name as the placeholder name.
A directional connection between two nodes, representing flow of execution. Corresponds to CanvasEdge in
the code (extending PatternFly Topology's EdgeModel).
Edges are derived automatically from the nextNode linked-list relationships in the IVisualizationNode
tree. Each edge renders as a straight SVG path with a connector arrow and an "add step" icon that appears
on hover at the midpoint.
Edge ID format: "sourceId >>> targetId".
Status: in progress -- the
NodeIdentityinterface is defined; population across all DSLs is being rolled out incrementally.
A single piece of identity information for a node: a name and its catalog kind.
interface NodeIdentity {
name: string;
catalogKind: CatalogKind;
}Status: in progress -- see Node Identity above.
The ordered set of identities that describe what a node is. The primary is always required; secondary and tertiary are optional and DSL-specific.
Each DSL is described below from simplest (one level) to most complex (up to three levels).
A Pipe node always has exactly one identity: the Kamelet it represents. There is no secondary or tertiary level.
primaryNodeId { name: 'timer-source', catalogKind: CatalogKind.Kamelet }
A Citrus test action node always has exactly one identity: the test action name.
primaryNodeId { name: 'echo', catalogKind: CatalogKind.TestAction }
The Citrus root group node (the flow container) is also enriched as a CatalogKind.TestAction.
The Kamelet DSL shares the same internal node structure as Camel Routes -- both use from, standard
processors, and the same mappers -- so the rules below apply to both DSLs.
Simple case -- processor only (no URI):
A processor that carries no component URI (e.g. log, choice, split) has only a primary identity.
primaryNodeId { name: 'log', catalogKind: CatalogKind.Processor }
Standard case -- processor + Component URI:
A processor that carries a component URI (e.g. to: timer:tick) adds a secondary identity for the
resolved Component.
primaryNodeId { name: 'to', catalogKind: CatalogKind.Processor }
secondaryNodeId { name: 'timer', catalogKind: CatalogKind.Component }
Kamelet URI case -- processor + Kamelet URI:
When the URI references a Kamelet (e.g. to: kamelet:weather-source), the secondary identity is the
kamelet Camel Component and the tertiary identity is the resolved Kamelet itself.
primaryNodeId { name: 'to', catalogKind: CatalogKind.Processor }
secondaryNodeId { name: 'kamelet', catalogKind: CatalogKind.Component }
tertiaryNodeId { name: 'weather-source', catalogKind: CatalogKind.Kamelet }
Root group node:
The invisible container node that wraps an entire Camel route or Kamelet flow. It carries the entity name as its primary identity and has no secondary or tertiary.
primaryNodeId { name: 'route', catalogKind: CatalogKind.Entity }
from node:
The consumer start node. Its primary identity is always from. When a URI is configured the secondary
identity is the resolved Component; when no URI is present the node is treated as a placeholder.
primaryNodeId { name: 'from', catalogKind: CatalogKind.Entity }
secondaryNodeId { name: 'timer', catalogKind: CatalogKind.Component } ← present when URI is set
A pattern-based processing element such as Choice, Filter, Split, Aggregate. The term is used when referring specifically to the structural/behavioral role of a processor.
Camel mapping: Maps to CatalogKind.Pattern and CatalogKind.Processor in the catalog. In the Camel
processor type system, ProcessorDefinition.
Scope: The generic layer should use NodeKind or primaryNodeId.catalogKind to represent this concept.
Deprecated aliases: processor (when used to mean "an EIP" -- overloaded; see below), element (as in
ICamelElementLookupResult).
In Camel specifically: any executable unit in a ProcessorDefinition -- this includes EIPs, the from
consumer, and structural containers. In Kaoto code: the DSL-level name of a node type (e.g. 'log', 'to',
'choice') as defined by the Camel catalog.
Use carefully -- this term is scoped to Camel.
Camel mapping: keyof ProcessorDefinition from @kaoto/camel-catalog/types. Maps to
CatalogKind.Processor or CatalogKind.Pattern.
Scope: Camel DSL layer. The generic layer must not use this term.
Deprecated aliases: In current code, processorName is used as a field on the generic
IVisualizationNodeData -- this is the primary target for removal.
A transport-layer adapter such as AMQP, Timer, HTTP, File. Bound to a from, to, toD, or poll EIP
via a URI. Maps to CatalogKind.Component.
Camel mapping: ICamelComponentDefinition; resolved from the URI string (e.g. timer:tick ->
componentName: 'timer').
Scope: Camel DSL layer. In the generic model, the "component" role is captured by secondaryNodeId.
Deprecated aliases: componentName as a field in the generic data layer.
A reusable integration snippet packaged as a Camel extension, usable as a source, sink, or action. In Pipes:
the primary node type. In Camel Routes: a specialization of the Component layer (attached via kamelet: URI
prefix).
Camel mapping: CatalogKind.Kamelet; IKameletDefinition.
Scope: Camel DSL and Pipes DSL layers. In the generic model, a Kamelet-sourced node may appear as
primaryNodeId (in Pipes) or tertiaryNodeId (in Camel Routes with kamelet: URI).
The top-level structural container for a Camel integration flow. In Kaoto's visualization, the root
IVisualizationNode of type EntityType.CamelRoute or EntityType.Kamelet.
Camel mapping: processorName: 'route', CatalogKind.Entity.
Scope: Camel DSL layer. In the generic model, this corresponds to a Flow's root node, identified by
data.entity !== undefined.
Avoid as a generic term. Use Node for the generic concept. Reserve step only for:
- The Camel
stepEIP specifically -- a scoped sequential sub-pipeline within a route. stepsas an array property name in route definitions.
Camel mapping: CatalogKind.Pattern, name 'step'.
A catalog category grouping EIPs that have JSON schema definitions but are not from / route entities.
Camel mapping: CatalogKind.Pattern in code.
Scope: Camel catalog infrastructure layer. Do not use in user-facing documentation.
Deprecated aliases: processor (when used as a catalog-kind synonym for Pattern).
A top-level Camel catalog entry representing a first-class flow element: route, from,
routeConfiguration, intercept, onException, etc. Distinguished from Patterns because they appear at
the root of a route definition.
Camel mapping: CatalogKind.Entity in code.
The three ways a processor can contain nested processors, as defined by
CamelProcessorStepsProperties.type:
| Type | Description | Examples |
|---|---|---|
branch |
A steps[] array of sequential processors |
from.steps, when.steps, filter.steps |
single-clause |
A single nested processor | choice.otherwise, circuitBreaker.onFallback, doTry.doFinally |
array-clause |
An array of clause-type processors | choice.when[], doTry.doCatch[], rest.get[] |
These types determine how the node mapper creates child visualization nodes and how placeholders are generated for each slot.