E2E
kubectl apply will not work. Orkestra kinds are consumed by the ork CLI and runtime — not by the Kubernetes API server. Your CRD is enough.An E2E is a declarative end-to-end test for a Katalog. It tells Orkestra exactly what to apply, which cluster to use, and what the expected state is after each step.
Motif — smallest reusable unit
↓
Katalog — operator declaration
↓
Komposer — platform declaration
↓
E2E — end-to-end test for a Katalog
ork validate checks the structure. ork e2e runs it.
Wire format
apiVersion: orkestra.orkspace.io/v1
kind: E2E
metadata:
name: hello-website-e2e
description: Deploy a website, verify it comes up, verify cleanup on delete.
spec:
katalog: ./katalog.yaml
crd: ./crd.yaml
cr: ./cr.yaml
cluster:
provider: kind
name: ork-e2e
reuse: false
setup: # optional
apply:
- ./setup.yaml
wait:
- kind: Secret
name: my-secret
namespace: default
timeout: 15s
expect:
- name: Deployment ready
after: cr-applied
timeout: 60s
resources:
- kind: Deployment
name: hello-website
namespace: default
ready: true
- name: Cleanup verified
after: cr-deleted
timeout: 30s
resources:
- kind: Deployment
name: hello-website
namespace: default
count: 0
imports: # optional — run other E2E files after this one
- ./auth-e2e.yaml
- path: ./infra-e2e.yaml
freshCluster: true
Lifecycle
cluster ready
↓
CRD applied
↓
setup.apply — prerequisite manifests applied
↓
setup.helm — prerequisite charts installed
↓
setup.wait — block until prerequisites exist/ready
↓
Katalog loaded — operator starts watching
↓
CR applied ← "cr-applied" checkpoints run here
↓
CR deleted ← "cr-deleted" checkpoints run here
↓
Cluster torn down (if reuse: false)
Validation
ork validate -f e2e.yaml
Catches: missing required fields, unknown after values, unknown provider values, unreachable file paths for katalog, crd, cr, and setup.apply entries.
Try it
ork init --pack beginner
cd beginner/01-hello-website
ork e2e
This scaffolds the beginner example pack, moves into the first example, and runs the full E2E test — creates a kind cluster, applies the operator, applies the CR, checks the Deployment is ready, deletes the CR, and verifies cleanup. The whole cycle takes about 90 seconds.
To keep the cluster for inspection after the test:
ork e2e --keep-cluster
Run a full pack
Every example pack ships with a root e2e.yaml. Run the full suite in one command:
ork e2e -f examples/beginner/e2e.yaml --use-current
ork e2e -f examples/intermediate/e2e.yaml --use-current
Orkestra installs once before the suite, each test updates the bundle in place, Orkestra uninstalls once at the end.
Discover and run without a root file
./... finds every leaf test automatically — no root e2e.yaml needed:
ork e2e ./examples/beginner/... # all beginner tests
ork e2e ./... --skip external # everything except external gate tests
ork e2e ./... --dry-run # list what would run, no cluster created
See 06-discovery.
Where to go
| Page | Covers |
|---|---|
| 01-spec | katalog, crd, cr, cluster, custom |
| 02-setup | setup.apply, setup.helm, setup.wait |
| 03-expect | expect — resources, commands, after, timeout |
| 04-imports | imports — test suites, wait:, cluster strategy, pure aggregators |
| 05-custom-target | custom.target: kubernetes — test any Kubernetes workload without Orkestra |
| 06-discovery | ./... discovery, --wait, --skip, --dry-run |