A Try in 10 Minutes (Ephemeral)

No Gitea, Tekton, or Argo CD required — only the operator from Quay and an IntegrationFlow CR.

A.1 Install operator (Quay + OLM)

mvn -B clean package -DskipTests   # optional: validate locally first
operator-sdk bundle validate ./bundle

operator-sdk cleanup openshift-integration-operator -n openshift-integration

operator-sdk run bundle quay.io/maximilianopizarro/openshift-integration-operator-bundle:v0.8.1 \
  --namespace openshift-integration \
  --install-mode AllNamespaces \
  --timeout 10m

oc get csv -n openshift-integration
oc get pods -n openshift-integration

Alternative: Helm with Quay images — see Operations or root README.

A.2 Deploy first ephemeral flow

oc apply -f k8s/examples/09-ephemeral-demo.yaml
oc get integrationflow ephemeral-camel-demo -n openshift-integration -w

A.3 Verify

oc get integrationflow ephemeral-camel-demo -n openshift-integration \
  -o jsonpath='{.status.phase}{"\n"}'

oc logs -l platform.io/flow-name=ephemeral-camel-demo -n openshift-integration --tail=20

oc delete integrationflow ephemeral-camel-demo -n openshift-integration
oc get deploy -l platform.io/ephemeral=true -n openshift-integration   # expect empty

Open the console: Integration Platform → Overview (plugin version, catalog mode) and Integration Flows for logs.

A.2b AI flows (complete properties in CR)

Twenty-four ephemeral AI/MCP examples use plain-text prompts and Quarkus properties in spec.ephemeral.properties. Full provider reference: AI Models & MCP. Index: docs/ephemeral-ai-examples.txt.

oc create secret generic openai-credentials -n openshift-integration \
  --from-literal=OPENAI_API_KEY=sk-proj-REPLACE_ME

oc apply -f k8s/examples/ephemeral-ai/01-openai-simple-chat.yaml
oc logs -l platform.io/flow-name=ephemeral-ai-simple-chat -n openshift-integration -f

Ready for GitOps? Continue to Track B.

Prerequisites

Ephemeral only (Track A)

OpenShift 4.14+ Cluster with cluster-admin or sufficient RBAC
oc CLI Logged in
operator-sdk For OLM bundle install (or Helm)

Full GitOps stack (Track B)

Helm 3 Optional chart install
Gitea Git server
Argo CD GitOps controller (openshift-gitops)
Tekton Pipelines CI for container builds

B GitOps Production Path

Install with Helm (Quay images only — no internal registry):

B.1 Add Helm Repository

Add the GitHub Pages-hosted Helm chart repository and update your local index:

helm repo add integration-platform \
  https://maximilianopizarro.github.io/openshift-integration-operator/

helm repo update

B.2 Install Operator (Helm)

Install into openshift-integration using published Quay images:

helm upgrade --install openshift-integration-operator \
  helm/openshift-integration-operator \
  --namespace openshift-integration \
  --create-namespace \
  --set operator.image.tag=v0.8.1 \
  --set consolePlugin.image.tag=v0.8.1 \
  --set gitea.password='your-gitea-password' \
  --set tekton.approvalEnabled=false

Optional worker scaling:

helm upgrade --install openshift-integration-operator \
  helm/openshift-integration-operator \
  --namespace openshift-integration \
  --create-namespace \
  --set operator.image.tag=v0.8.1 \
  --set consolePlugin.image.tag=v0.8.1 \
  --set workers.maxReplicas=20 \
  --set gitea.password='your-gitea-password'

B.2a Git Credentials via External Secrets (Production)

For production GitOps, do not pass Git passwords in Helm values. Enable the External Secrets Operator and sync credentials from HashiCorp Vault (or AWS/Azure secret stores) into the integration-git-basic-auth Secret used by the operator and Tekton builds.

Prerequisites

  • External Secrets Operator installed cluster-wide
  • ClusterSecretStore pointing at Vault (example name: cluster-secret-store)
  • Vault paths populated: integration-platform/git (username, password) and optional GitHub/GitLab tokens

Helm install with ESO

helm upgrade --install openshift-integration-operator \
  helm/openshift-integration-operator \
  --namespace openshift-integration \
  --create-namespace \
  --set operator.image.tag=v0.8.1 \
  --set consolePlugin.image.tag=v0.8.1 \
  --set secrets.provider=external-secrets \
  --set secrets.externalSecrets.enabled=true \
  --set secrets.externalSecrets.secretStoreRef=cluster-secret-store \
  --set git.url=https://gitea.example.com \
  --set tekton.approvalEnabled=false

The chart renders an ExternalSecret that syncs Vault keys into integration-git-basic-auth with keys for operator env vars, Tekton git-clone, and a .git-credentials helper file. See Operations — Vault & ESO and Security — Secrets Management.

Verify sync

oc get externalsecret integration-git-basic-auth -n openshift-integration
oc get secret integration-git-basic-auth -n openshift-integration
oc get deploy openshift-integration-operator -n openshift-integration \
  -o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="GIT_PASSWORD")].valueFrom.secretKeyRef.name}{"\n"}'
Fallback: If ESO is not available, create the Secret manually with oc create secret generic integration-git-basic-auth --from-literal=password=... or use Sealed Secrets — see Security.

B.2b Optional: Bootstrap Camel K (Pipe & Kamelet)

Required once per namespace before deploying Pipe or Kamelet examples (etl-pipe, s3-to-db-kamelet):

oc apply -f k8s/bootstrap/camel-k-platform.yaml

TOKEN=$(oc whoami -t)
oc create secret docker-registry camel-k-registry-auth \
  -n openshift-integration \
  --docker-server=image-registry.openshift-image-registry.svc:5000 \
  --docker-username=$(oc whoami) \
  --docker-password="$TOKEN" \
  --dry-run=client -o yaml | oc apply -f -

oc patch integrationplatform camel-k -n openshift-integration --type=merge \
  -p '{"spec":{"build":{"registry":{"secret":"camel-k-registry-auth"}}}}'

B.2c Optional: Deploy 8 GitOps Catalog Examples

Pre-built examples in k8s/examples/ exercise the full pipeline (Gitea → Tekton → Argo CD). Apply sequentially (~12s between flows to avoid Gitea contention):

for yaml in 01-rest-to-kafka 02-order-routing-cbr 03-parallel-enrichment \
  04-error-handling-dlq 05-s3-to-db-kamelet 06-etl-pipe \
  07-file-processor-workflow 08-saga-workflow; do
  oc apply -f "k8s/examples/${yaml}.yaml"
  sleep 12
done

oc get integrationflow -n openshift-integration

Expected result: all eight flows reach Running phase. Examples 01–04 and 07–08 are Camel routes (worker Deployments); 05–06 use Camel K (Kamelet/Pipe). Each flow uses spec.targeting.strategy: explicit and clusters: [local] for single-cluster Argo CD sync.

B.3 GitOps IntegrationFlow Examples

Design storage: For production GitOps flows, prefer designRef pointing at a ConfigMap (keeps large route YAML out of the CR). Inline kaotoDesign is deprecated but still supported — the examples below use inline YAML for copy-paste simplicity in quick evaluations.

The platform supports 5 integration types: Camel Route, Kamelet, Pipe, Test, and SonataFlow. Below are production-ready examples for each type.

1. Camel Route — REST to Kafka

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: rest-to-kafka
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/rest-to-kafka
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: rest-to-kafka
        from:
          uri: "platform-http:/api/ingest"
          steps:
            - log:
                message: "Received: ${body}"
            - to:
                uri: "kafka:integration-events?brokers=my-cluster-kafka-bootstrap:9092"

2. Camel Route — Content-Based Routing (CBR)

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: order-routing-cbr
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/order-routing-cbr
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: order-routing-cbr
        from:
          uri: "platform-http:/api/orders"
          steps:
            - log:
                message: "Received order: ${body}"
            - unmarshal:
                json: {}
            - choice:
                when:
                  - simple: "${body[priority]} == 'high'"
                    steps:
                      - log:
                          message: "CRITICAL: order = fast-track"
                      - setHeader:
                          name: CamelKafkaTopic
                          simple: "orders-priority"
                otherwise:
                  steps:
                    - log:
                        message: "Standard order processing"
                    - setHeader:
                        name: CamelKafkaTopic
                        simple: "orders-standard"

3. Camel Route — Parallel Enrichment

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: parallel-enrichment
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/parallel-enrichment
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: parallel-enrichment
        from:
          uri: "platform-http:/api/enrich"
          steps:
            - log:
                message: "Enriching: ${body}"
            - multicast:
                parallelProcessing: true
                steps:
                  - to: "direct:enrich-geo"
                  - to: "direct:enrich-credit"
                  - to: "direct:enrich-inventory"
            - log:
                message: "Enrichment complete"

4. Camel Route — Error Handling with DLQ

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: error-handling-dlq
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/error-handling-dlq
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: error-handling-dlq
        from:
          uri: "platform-http:/api/process"
          steps:
            - doTry:
                steps:
                  - log:
                      message: "Processing: ${body}"
                  - to:
                      uri: "direct:risky-operation"
                doCatch:
                  - exception: [java.lang.Exception]
                    steps:
                      - log:
                          message: "Error! Sending to DLQ"
                      - to:
                          uri: "kafka:dead-letter-queue?brokers=my-cluster-kafka-bootstrap:9092"
                doFinally:
                  steps:
                    - log:
                        message: "Processing finished"

5. Kamelet — S3 to Database

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: s3-to-db-kamelet
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_KAMELET
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/s3-to-db-kamelet
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: s3-to-db-kamelet
        from:
          uri: "kamelet:aws-s3-source"
          parameters:
            bucketNameOrArn: my-data-bucket
            region: us-east-1
            deleteAfterRead: true
          steps:
            - unmarshal:
                json:
                  unmarshalType: java.util.Map
            - log:
                message: "Processing S3 object: ${header.CamelAwsS3Key}"
            - to:
                uri: "kamelet:postgresql-sink"
                parameters:
                  serverName: postgres.svc
                  serverPort: "5432"
                  databaseName: integration_db
                  query: "INSERT INTO s3_imports(key, data, imported_at) VALUES (:#key, :#data, NOW())"

6. Pipe — ETL Pipeline

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: etl-pipe
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_PIPE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/etl-pipe
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: etl-pipe
        from:
          uri: "timer:etl-trigger"
          parameters:
            period: 60000
          steps:
            - to:
                uri: "sql:SELECT * FROM source_table WHERE processed = false?dataSource=sourceDS"
            - split:
                simple: "${body}"
                steps:
                  - marshal:
                      json: {}
                  - log:
                      message: "ETL row: ${body}"
                  - to:
                      uri: "sql:INSERT INTO target_table(data, etl_time) VALUES (:#data, NOW())?dataSource=targetDS"

7. Camel Route — File Processor with CSV + CBR

Reads CSV files from /data/inbox, unmarshals each row, and routes records by status using content-based routing (choice). Uses engine: CAMEL — the operator scaffolds a Quarkus Camel project.

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: file-processor-workflow
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/file-processor-workflow
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: file-processor-workflow
        from:
          uri: "file:/data/inbox?noop=true&include=.*\\.csv"
          steps:
            - unmarshal:
                csv:
                  useMaps: true
            - split:
                simple: "${body}"
                steps:
                  - choice:
                      when:
                        - simple: "${body[status]} == 'ACTIVE'"
                          steps:
                            - log:
                                message: "Active record: ${body[id]} — ${body[name]}"
                            - to:
                                uri: "direct:process-active"
                        - simple: "${body[status]} == 'PENDING'"
                          steps:
                            - log:
                                message: "Pending record: ${body[id]} — queued for review"
                            - to:
                                uri: "direct:queue-review"
                      otherwise:
                        steps:
                          - log:
                              message: "Skipping inactive record: ${body[id]}"
                          - to:
                              uri: "file:/data/archive"

8. Camel Route — Saga Orchestration

Implements the Saga EIP for distributed transactions with automatic compensation. Each step defines a compensating action that runs if a later step fails.

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: saga-workflow
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/saga-workflow
  branch: main
  targeting:
    strategy: explicit
    clusters: [local]
  kaotoDesign: |
    - route:
        id: saga-workflow
        from:
          uri: "platform-http:/api/orders/create"
          steps:
            - saga:
                propagation: REQUIRED
                completionMode: AUTO
                steps:
                  - to:
                      uri: "direct:reserve-inventory"
                  - to:
                      uri: "direct:charge-payment"
                  - to:
                      uri: "direct:schedule-shipping"
            - log:
                message: "Saga completed for order: ${header.orderId}"
    - route:
        id: reserve-inventory
        from:
          uri: "direct:reserve-inventory"
          steps:
            - log:
                message: "Reserving inventory for ${header.orderId}"
            - saga:
                option:
                  - key: compensate
                    value: "direct:cancel-inventory"
            - to:
                uri: "http://inventory-service:8080/api/reserve"
    - route:
        id: cancel-inventory
        from:
          uri: "direct:cancel-inventory"
          steps:
            - log:
                message: "COMPENSATING: releasing inventory for ${header.orderId}"
            - to:
                uri: "http://inventory-service:8080/api/release"

Ephemeral Quick Try (see Track A)

Use k8s/examples/09-ephemeral-demo.yaml or the console Quick Try toggle — covered in Track A.

Promote Ephemeral to GitOps

When an ephemeral flow is running, click Promote to GitOps in the console plugin (or call the REST API). The operator creates a Git repository, pushes the scaffolded source, and converts the CR to deploymentMode: GITOPS — triggering Tekton build and ArgoCD sync automatically.

# REST API equivalent
curl -X POST "https://<operator>/api/flows/ephemeral-camel-demo/promote-to-gitops"   -H "Content-Type: application/json"   -d '{"gitRepository":"https://gitea.example.com/user1/my-flow","branch":"main"}'

Multicluster with Label Selector

apiVersion: platform.io/v1alpha1
kind: IntegrationFlow
metadata:
  name: multicluster-flow
  namespace: openshift-integration
spec:
  deploymentMode: GITOPS
  integrationType: CAMEL_ROUTE
  engine: CAMEL
  gitRepository: https://gitea.example.com/user1/multicluster-flow
  branch: main
  targeting:
    strategy: selector
    clusterSelector:
      matchLabels:
        env: production
        region: us-east
  kaotoDesign: |
    - route:
        id: multicluster-flow
        from:
          uri: "timer:tick?period=30000"
          steps:
            - log:
                message: "Running on production clusters in us-east"

Apply any example with:

oc apply -f integrationflow.yaml

# Watch reconciliation progress
oc get integrationflows -n openshift-integration -w

Expected status phases: ScaffoldingBuildingDeployingRunning.

B.4 Verify Deployment

Confirm the operator, CRD, and IntegrationFlow status:

# Check operator pods
oc get pods -n openshift-integration

# Verify CRD is registered
oc get crd integrationflows.platform.io

# Watch IntegrationFlow status
oc get integrationflows -n openshift-integration
oc describe integrationflow sample-camel-flow -n openshift-integration

# Check Tekton PipelineRun
oc get pipelineruns -n openshift-integration -l platform.io/component=build

# Verify worker deployment (after ArgoCD sync)
oc get deployments -n openshift-integration

Expected status phases: ScaffoldingBuildingDeployingRunning.

B.5 Access the Console Plugin

The OpenShift Console plugin adds an Integration Platform section with Integration Flows navigation.

# Verify ConsolePlugin is enabled
oc get consoleplugin -n openshift-integration

# Check plugin pod status
oc get pods -n openshift-integration -l app.kubernetes.io/component=console-plugin

Open the OpenShift Console and navigate to Integration Platform → Integration Flows.

List Page Features

  • Browse Templates — Pick from 250+ ready flows in the create form (backed by flow-catalog.json)
  • Search — Filter by name, repository URL, or status message
  • Filters — Filter by integration type (CAMEL_ROUTE, CAMEL_KAMELET, etc.) and phase (Running, Building, Error)
  • Summary badges — Click on Running/Building/Error counts to quick-filter
  • Pagination — Navigate large lists of flows with page controls
  • Resource links — Direct links to Pods, Tekton PipelineRuns, and ArgoCD Applications per flow

Flow Detail Page

  • Visual Flow — SVG-based diagram with branching logic (choice, multicast, doTry), click a node to highlight the corresponding YAML section
  • YAML Editor — View and edit the raw kaotoDesign YAML
  • Kaoto Designer — Embedded drag-and-drop Kaoto canvas (for Camel flows)
  • SonataFlow Console — Embedded SonataFlow Management Console (for SonataFlow workflows)
  • Logs — Live worker pod logs with container selector, tail lines, and follow mode (GitOps and ephemeral flows)
  • Telemetry Overlay — Real-time SSE metrics per node with green/amber/red status
  • Quick Try UI — Ephemeral badge with TTL countdown, extend TTL, and promote to GitOps modals on ephemeral flows

Direct routes:

  • /integration-flows — List all IntegrationFlows
  • /integration-flows/<name> — Flow designer with visual flow, Kaoto, and telemetry