How It Works

2 min read

Set spec.custom.target: kubernetes in any e2e file. This tells Orkestra: “you own the cluster and the assertions, but not the workload.” Bundle generation and Orkestra runtime install are skipped. Everything else — cluster setup, setup manifests, the full assertion loop, and cleanup — runs unchanged.

apiVersion: orkestra.orkspace.io/v1
kind: E2E
metadata:
  name: my-helm-chart-e2e

spec:
  custom:
    target: kubernetes

  setup:
    helm:
      - repo: https://charts.example.com
        chart: my-app
        namespace: my-app
        createNamespace: true
        version: v1.2.0
    wait:
      - kind: Deployment
        name: my-app
        namespace: my-app
        ready: true
        timeout: 120s

  cr: ./test-resource.yaml

  expect:
    - name: App is healthy
      after: cr-applied
      timeout: 60s
      resources:
        - kind: Deployment
          name: my-app
          namespace: my-app
          ready: true

    - name: Cleanup verified
      after: cr-deleted
      timeout: 30s
      resources:
        - kind: Deployment
          name: my-app
          namespace: my-app
          count: 0

Run it:

ork e2e -f e2e.yaml

An ephemeral kind cluster is created, your chart is installed into it, assertions run, and the cluster is torn down. Your actual cluster is never touched. Pass or fail. Minutes, not hours.


Assertions

Assertions run in a polling loop until all pass or the checkpoint times out. Three blocks are available in any combination:

BlockWhat it does
resources:Watch Kubernetes API state — existence, readiness, count
commands:Run shell commands and assert stdout/stderr
kubectl:Structured DSL — get, logs, describe, exec, port-forward

The kubectl: block maps directly to kubectl subcommands you already know. Instead of constructing the command string yourself, you declare what you want to assert:

kubectl:
  get:
    - kind: Deployment
      name: my-app
      field: .spec.replicas
      equals: "2"
  logs:
    - labelSelector: app=my-app
      outputContains: "server started"
  port-forward:
    - service: my-app
      port: 8080
      path: /healthz
      outputContains: ok

See the kubectl block reference for all subcommands and fields.


What this is not

custom.target: kubernetes does not add Orkestra runtime features to your workload. Orkestra is the test harness — cluster lifecycle, assertion polling, and cleanup. Your workload runs exactly as it would in production.

If you want Orkestra to manage your operator at runtime, start with ork init --pack beginner.