Jobs
Orchestrating multiple scenarios with shared pools and bindings.
A job coordinates multiple scenario workloads, each drawing from shared pools and running concurrently.
Structure
type: job
pools:
- id: iam-users
type: pool
csv:
path: ./users.csv
workloads:
- scenario: ./brute-force.yaml
count: 10
bindings:
target_user: pool.iam-users.usernamePools
Pools provide reusable datasets — IP ranges, user lists, CSV files. They are declared at the job level and referenced in workload bindings via pool.<id> or pool.<id>.<field>.
Pool types:
| Type | Description |
|---|---|
ip_range | Generates IPs from a CIDR block (max 1,048,576 IPs) |
string_list | A static list of string values |
csv | Rows loaded from a CSV file |
Bindings
Bindings map pool draws to scenario state variables. When a workload runs, each binding expression is evaluated and injected into the scenario's state before execution.
Important: pool.* expressions are only valid in job bindings — they are rejected if used directly in scenario state or fields blocks.
Concurrency
Each workload runs in its own goroutine. The job runner forks a per-goroutine clock so concurrent workloads advance logical time independently. If any workload errors, the shared context is cancelled and sibling workloads stop.