Deploy on OpenShift Local
Deploy the complete SWIM ecosystem on your local machine using Red Hat OpenShift Local (formerly CodeReady Containers). This is a self-contained deployment project that includes all Helm charts, operator subscriptions, and infrastructure configuration needed to run the full SWIM Reference Architecture locally.
By the end of this tutorial you will have a fully functional SWIM environment with Digital NOTAM services, ED-254 Arrival Sequence services, validators, message brokers, databases, identity provider, and example applications.
What Gets Deployed
The deployment project installs 19 components organized in layers:
Prerequisites
oc is included with CRC. make and git are pre-installed on Linux/macOS. On Windows: choco install make git
choco install kubernetes-helm (Windows), brew install helm (macOS), sudo snap install helm --classic (Linux)
registry.redhat.io container images
1. Clone the Deployment Project
git clone https://github.com/swim-developer/swim-deploy-openshift-local.git
cd swim-deploy-openshift-local
2. Start OpenShift Local
# Configure CRC resources (first time only)
# Minimum: 8 CPUs, 20 GB RAM. Recommended: 10 CPUs, 24 GB RAM
crc config set cpus 8
crc config set memory 24576
crc setup
# Start the cluster
crc start
# Configure CLI
eval $(crc oc-env)
oc login -u kubeadmin https://api.crc.testing:6443
# Configure CRC resources (first time only)
# Minimum: 8 CPUs, 20 GB RAM. Recommended: 10 CPUs, 24 GB RAM
crc config set cpus 8
crc config set memory 24576
crc setup
# Start the cluster
crc start
# Configure CLI
& crc oc-env | Invoke-Expression
oc login -u kubeadmin https://api.crc.testing:6443
The kubeadmin password is displayed by crc start or can be
retrieved with crc console --credentials.
Windows: The commands below use GNU Make. Install it via
choco install make (Chocolatey) or scoop install make.
3. Deploy Everything
A single command deploys the complete stack in the correct order: operators, infrastructure, services, validators, and example applications.
make all
This takes a few minutes on a fresh CRC instance. The Makefile handles namespace creation, operator installation, CRD readiness checks, Keycloak SPI setup, Helm chart deployment, and Artemis SSL configuration automatically.
4. Step-by-Step (Alternative)
If you prefer to deploy layer by layer, or need to troubleshoot a
specific step, use oc and helm directly.
All commands run from the swim-deploy-openshift-local
project directory.
4.1 Create the Namespace
oc new-project swim-demo
4.2 Install OLM Operators
oc apply -f operators/cert-manager-operator.yaml
oc apply -f operators/amq-streams-operator.yaml
oc apply -f operators/amq-streams-console-operator.yaml
oc apply -f operators/amq-broker-operator.yaml
oc apply -f operators/rhbk-operator.yaml
Wait for all operator CRDs (2-5 minutes on a fresh CRC):
oc wait --for=condition=Established crd/kafkas.kafka.strimzi.io --timeout=300s
oc wait --for=condition=Established crd/clusterissuers.cert-manager.io --timeout=300s
oc wait --for=condition=Established crd/activemqartemises.broker.amq.io --timeout=300s
oc wait --for=condition=Established crd/keycloaks.k8s.keycloak.org --timeout=300s
4.3 Create Keycloak SPI Secret
oc create secret generic keycloak-swim-role-spi -n swim-demo \
--from-file=keycloak-swim-role-spi.jar=lib/keycloak-swim-role-spi.jar
oc create secret generic keycloak-swim-role-spi -n swim-demo `
--from-file=keycloak-swim-role-spi.jar=lib/keycloak-swim-role-spi.jar
4.4 Deploy Shared Infrastructure
helm upgrade --install swim-infra charts/swim-infra \
-n swim-demo \
-f charts/swim-infra/values.yaml
helm upgrade --install swim-infra charts/swim-infra `
-n swim-demo `
-f charts/swim-infra/values.yaml
Wait for all infrastructure pods. Kafka and Keycloak are the slowest to initialize:
oc get pods -n swim-demo -w
4.5 Create Artemis SSL Secrets
Once cert-manager has issued the Artemis TLS certificates, create the broker SSL secrets. This step extracts JKS keystores from cert-manager secrets and is best done with the Makefile target:
make infra-artemis-ssl
For the manual oc commands, see
Step 6 in the deployment project README.
4.6 Deploy Digital NOTAM (DNOTAM)
Start with the DNOTAM module. Deploy the provider and consumer first, then their validators.
DNOTAM Services:
helm upgrade --install swim-dnotam-provider charts/swim-dnotam-provider \
-n swim-demo \
-f charts/swim-dnotam-provider/values.yaml
helm upgrade --install swim-dnotam-consumer charts/swim-dnotam-consumer \
-n swim-demo \
-f charts/swim-dnotam-consumer/values.yaml
helm upgrade --install swim-dnotam-provider charts/swim-dnotam-provider `
-n swim-demo `
-f charts/swim-dnotam-provider/values.yaml
helm upgrade --install swim-dnotam-consumer charts/swim-dnotam-consumer `
-n swim-demo `
-f charts/swim-dnotam-consumer/values.yaml
DNOTAM Validators:
helm upgrade --install swim-dnotam-consumer-validator charts/swim-dnotam-consumer-validator \
-n swim-demo \
-f charts/swim-dnotam-consumer-validator/values.yaml
helm upgrade --install swim-dnotam-provider-validator charts/swim-dnotam-provider-validator \
-n swim-demo \
-f charts/swim-dnotam-provider-validator/values.yaml
helm upgrade --install swim-dnotam-consumer-validator charts/swim-dnotam-consumer-validator `
-n swim-demo `
-f charts/swim-dnotam-consumer-validator/values.yaml
helm upgrade --install swim-dnotam-provider-validator charts/swim-dnotam-provider-validator `
-n swim-demo `
-f charts/swim-dnotam-provider-validator/values.yaml
Verify all four DNOTAM pods are running before proceeding:
oc get pods -n swim-demo -l app.kubernetes.io/part-of=swim-dnotam
4.7 Add More Modules (ED-254)
Each SWIM module follows the same pattern: two services (provider and consumer) and two validators. The only difference between modules is which charts to deploy.
Resource consideration
OpenShift Local runs on a single VM with limited CPU and memory. Running all modules simultaneously is possible with 8 CPUs and 24 GB RAM, but on constrained machines you may prefer to test one module at a time. Remove the current module before deploying the next one to stay within resource limits.
(Optional) Remove DNOTAM before deploying ED-254:
helm uninstall swim-dnotam-provider-validator -n swim-demo
helm uninstall swim-dnotam-consumer-validator -n swim-demo
helm uninstall swim-dnotam-consumer -n swim-demo
helm uninstall swim-dnotam-provider -n swim-demo
ED-254 Services:
helm upgrade --install swim-ed254-provider charts/swim-ed254-provider \
-n swim-demo \
-f charts/swim-ed254-provider/values.yaml
helm upgrade --install swim-ed254-consumer charts/swim-ed254-consumer \
-n swim-demo \
-f charts/swim-ed254-consumer/values.yaml
helm upgrade --install swim-ed254-provider charts/swim-ed254-provider `
-n swim-demo `
-f charts/swim-ed254-provider/values.yaml
helm upgrade --install swim-ed254-consumer charts/swim-ed254-consumer `
-n swim-demo `
-f charts/swim-ed254-consumer/values.yaml
ED-254 Validators:
helm upgrade --install swim-ed254-consumer-validator charts/swim-ed254-consumer-validator \
-n swim-demo \
-f charts/swim-ed254-consumer-validator/values.yaml
helm upgrade --install swim-ed254-provider-validator charts/swim-ed254-provider-validator \
-n swim-demo \
-f charts/swim-ed254-provider-validator/values.yaml
helm upgrade --install swim-ed254-consumer-validator charts/swim-ed254-consumer-validator `
-n swim-demo `
-f charts/swim-ed254-consumer-validator/values.yaml
helm upgrade --install swim-ed254-provider-validator charts/swim-ed254-provider-validator `
-n swim-demo `
-f charts/swim-ed254-provider-validator/values.yaml
Verify all four ED-254 pods are running:
oc get pods -n swim-demo -l app.kubernetes.io/part-of=swim-ed254
4.8 Deploy DNOTAM Example Applications (Optional)
Two demonstration applications complement the DNOTAM services and show how real-world clients integrate with the SWIM platform from each end of the pipeline.
swim-dnotam-consumer and presents
events in a real-time map view, event timeline, critical alerts panel, and a CP1
compliance audit dashboard. Requires swim-dnotam-consumer running and
publishing to Kafka.
swim-dnotam-provider
via HTTP trigger or directly to the Kafka ingress topic. Requires
swim-dnotam-provider running. The companion injection tool for the
dashboard: publish here, watch the event appear there.
Build the container images (run from the workspace root, one machine needed). Source: github.com/swim-developer/swim-example-apps.
cd example-apps/dnotam-operations-dashboard
make jvm-backend # backend only
make jvm-frontend # frontend only
# or: make jvm — builds both at once
cd ../dnotam-event-publisher
make jvm-backend
make jvm-frontend
cd ../..
Each make jvm target builds multi-arch images for linux/amd64
and linux/arm64 and pushes them to quay.io/masales. Run
make help inside each directory for all available options.
Deploy the DNOTAM applications:
helm upgrade --install dnotam-dashboard charts/dnotam-dashboard \
-n swim-demo \
-f charts/dnotam-dashboard/values.yaml
helm upgrade --install dnotam-event-publisher charts/dnotam-event-publisher \
-n swim-demo \
-f charts/dnotam-event-publisher/values.yaml
helm upgrade --install dnotam-dashboard charts/dnotam-dashboard `
-n swim-demo `
-f charts/dnotam-dashboard/values.yaml
helm upgrade --install dnotam-event-publisher charts/dnotam-event-publisher `
-n swim-demo `
-f charts/dnotam-event-publisher/values.yaml
Verify both pods are running:
oc get pods -n swim-demo -l app.kubernetes.io/part-of=swim-dnotam-apps
To confirm the end-to-end loop works, open the publisher at
https://dnotam-event-publisher.apps-crc.testing, publish a
RWY.CLS event using HTTP Trigger, then open the dashboard at
https://dnotam-dashboard.apps-crc.testing and verify the event
appears in the Critical Alerts panel.
ED-254 example applications follow the same pattern. Deploy them after the DNOTAM apps or after switching to the ED-254 module:
helm upgrade --install ed254-arrival-flow-manager charts/ed254-arrival-flow-manager \
-n swim-demo \
-f charts/ed254-arrival-flow-manager/values.yaml
helm upgrade --install ed254-aman-client charts/ed254-aman-client \
-n swim-demo \
-f charts/ed254-aman-client/values.yaml
helm upgrade --install ed254-arrival-flow-manager charts/ed254-arrival-flow-manager `
-n swim-demo `
-f charts/ed254-arrival-flow-manager/values.yaml
helm upgrade --install ed254-aman-client charts/ed254-aman-client `
-n swim-demo `
-f charts/ed254-aman-client/values.yaml
5. Verify the Deployment
helm list -n swim-demo
oc get pods -n swim-demo
oc get routes -n swim-demo
Key endpoints on CRC:
https://rhbk.apps-crc.testing (username admin, password password)
https://swim-dnotam-provider-mtls.apps-crc.testing
https://swim-ed254-provider-mtls.apps-crc.testing
https://dnotam-provider-validator-swim-demo.apps-crc.testing
https://dnotam-dashboard.apps-crc.testing
https://dnotam-event-publisher.apps-crc.testing
https://ed254-arrival-flow-manager.apps-crc.testing
https://ed254-aman-client.apps-crc.testing
6. Troubleshooting
ED-254 services fail to start after fresh infra deploy
If you see ED-254 pods failing with database connection errors, confirm
the ed254 module is active in charts/swim-infra/values.yaml:
modules:
- dnotam
- ed254 # must be present (not commented)
After enabling the module and redeploying infra, restart any ED-254 service pods that started before the databases were ready:
oc rollout restart deploy/swim-ed254-provider -n swim-demo
oc rollout restart deploy/swim-ed254-consumer -n swim-demo
swim-ed254-provider-validator stuck in ImagePullBackOff
The swim-ed254-provider-validator image may not be available on the public registry.
Build it locally and push directly to the OpenShift internal registry using the
oc new-build --binary workflow:
# 1. Install shared modules in local Maven repo (run once)
cd applications/swim-validators
./mvnw clean install -DskipTests
# 2. Build the JAR
cd swim-ed254-provider-validator
./mvnw clean package -DskipTests
# 3. Prepare build context
mkdir -p /tmp/ed254-pv-build/target/quarkus-app
cp src/main/docker/Containerfile.jvm /tmp/ed254-pv-build/Dockerfile
cp -r target/quarkus-app/. /tmp/ed254-pv-build/target/quarkus-app/
# 4. Create BuildConfig and build inside OpenShift
oc new-build --binary --name=swim-ed254-provider-validator \
--strategy=docker --to=swim-demo/swim-ed254-provider-validator:latest \
-n swim-demo
oc start-build swim-ed254-provider-validator \
--from-dir=/tmp/ed254-pv-build --follow -n swim-demo
# 5. Update values.yaml to use the internal registry
# In charts/swim-ed254-provider-validator/values.yaml, set:
# image.repository: image-registry.openshift-image-registry.svc:5000/swim-demo/swim-ed254-provider-validator
# 6. Helm upgrade
helm upgrade swim-ed254-provider-validator charts/swim-ed254-provider-validator \
-f charts/swim-ed254-provider-validator/values.yaml \
-n swim-demo
# 1. Install shared modules in local Maven repo (run once)
cd applications\swim-validators
.\mvnw.cmd clean install -DskipTests
# 2. Build the JAR
cd swim-ed254-provider-validator
.\mvnw.cmd clean package -DskipTests
# 3. Prepare build context
New-Item -ItemType Directory -Force -Path "$env:TEMP\ed254-pv-build\target\quarkus-app"
Copy-Item src\main\docker\Containerfile.jvm "$env:TEMP\ed254-pv-build\Dockerfile"
Copy-Item -Recurse target\quarkus-app\* "$env:TEMP\ed254-pv-build\target\quarkus-app\"
# 4. Create BuildConfig and build inside OpenShift
oc new-build --binary --name=swim-ed254-provider-validator `
--strategy=docker --to=swim-demo/swim-ed254-provider-validator:latest `
-n swim-demo
oc start-build swim-ed254-provider-validator `
--from-dir="$env:TEMP\ed254-pv-build" --follow -n swim-demo
# 5. Update values.yaml to use the internal registry
# In charts/swim-ed254-provider-validator/values.yaml, set:
# image.repository: image-registry.openshift-image-registry.svc:5000/swim-demo/swim-ed254-provider-validator
# 6. Helm upgrade
helm upgrade swim-ed254-provider-validator charts/swim-ed254-provider-validator `
-f charts/swim-ed254-provider-validator/values.yaml `
-n swim-demo
swim-ed254-provider-validator crashes with UnknownHostException for MariaDB
The swim-infra chart was missing the MariaDB instance for
swim-ed254-provider-validator. Add the following entry to
charts/swim-infra/values.yaml under mariadb.instances:
- name: swim-ed254-provider-validator-mariadb
databaseName: swim_client
module: ed254
Then redeploy infra and restart the validator:
helm upgrade swim-infra charts/swim-infra \
-f charts/swim-infra/values.yaml \
-n swim-demo
oc rollout restart deployment/swim-ed254-provider-validator -n swim-demo
helm upgrade swim-infra charts/swim-infra `
-f charts/swim-infra/values.yaml `
-n swim-demo
oc rollout restart deployment/swim-ed254-provider-validator -n swim-demo
OTEL connection refused warnings in consumer logs
The DNOTAM and ED-254 consumers log warnings like
Connection refused: localhost/127.0.0.1:4317 because OpenTelemetry
is enabled by default but no Jaeger collector is deployed in the CRC
environment. These warnings are harmless — all business functionality
(AMQP subscription, event processing, Kafka routing) works normally.
No action required.
Artemis SSL secrets already exist
If make infra-artemis-ssl fails with "already exists",
the secrets are still valid from a previous deployment. No action required.
7. Teardown
Remove components with Helm in reverse deployment order:
# Example applications
helm uninstall ed254-aman-client -n swim-demo
helm uninstall ed254-arrival-flow-manager -n swim-demo
helm uninstall dnotam-dashboard -n swim-demo
helm uninstall dnotam-event-publisher -n swim-demo
# Validators
helm uninstall swim-ed254-provider-validator -n swim-demo
helm uninstall swim-ed254-consumer-validator -n swim-demo
helm uninstall swim-dnotam-provider-validator -n swim-demo
helm uninstall swim-dnotam-consumer-validator -n swim-demo
# SWIM services
helm uninstall swim-ed254-consumer -n swim-demo
helm uninstall swim-ed254-provider -n swim-demo
helm uninstall swim-dnotam-consumer -n swim-demo
helm uninstall swim-dnotam-provider -n swim-demo
# Shared infrastructure
helm uninstall swim-infra -n swim-demo
Alternatively, make destroy removes all components
including operator subscriptions in the correct reverse order. For
the complete Makefile reference, project structure, and Artemis SSL
manual commands, see the
deployment project README.