Live
▶ Edge Demo Game
Wumpus-style physical security sim. Scan to play on your phone or open in any browser.
OpenSOC Dashboard
Real-time security operations center view. Shows CloudEvents as they arrive from south devices.
Open ↗West Trax Roundtable
Containerized go-to-market demo for West Trax. Shows the simplified customer journey from first scan to roundtable — without the meetings.
OpenArchitecture
- Badge readers (OnGuard)
- Cameras & surveillance
- HVAC controllers
- Biometric scanners
- Environmental sensors
- Connected vehicle
- CloudEvent ingestion
- Telemetry aggregation
- SSE broadcast
- State persistence (PVC)
- Short-URL routing
- SOC Operations dashboard
- Audience presentations
- Evidence panel
- SAP EIC → BTP (roadmap)
- Analytics Cloud
North and South are permanent. The middle is replaceable — Flask today, Kafka or SAP Event Mesh tomorrow. When EIC arrives, it slots into North; the middle simplifies. The event contract (CloudEvents v1.0) is the stable interface between all three layers.
Event Classes
Every CloudEvent carries an eventclass field that drives dashboard color-coding,
telemetry breakdowns, and SAP routing rules. Events follow the
CloudEvents v1.0 spec
with type prefix ohc.demo.*.
CloudEvent envelope
{
"specversion": "1.0",
"type": "ohc.demo.access.onguard.badge_scan",
"source": "south/lenel-reader-lobby",
"id": "uuid-v4",
"time": "2026-02-18T14:00:00Z",
"eventclass": "access",
"data": {
"badgeID": "B-1042",
"cardholderName":"Jim O'Donnell",
"readerName": "Main Lobby",
"action": "ACCESS_GRANTED"
}
}
Edge Transport Adapters
Adapters run on-premises or on a laptop — not in the cluster. Each polls a physical
or connected device and emits CloudEvents to POST /ingest.
🚗 Mercedes-Benz Relay
Polls fuel level, odometer, lock status, tire pressure, and location via the Mercedes Connected Vehicle API. VIN and coordinates are redacted in all events. Runs on the presenter's laptop — not in the cluster.
📦 Artifact Relay
Utility scripts for syncing demo artifacts between local and cluster environments during development and pre-demo setup.
Adding a new device class: implement a script that POSTs a valid CloudEvent JSON
to /ingest with the appropriate eventclass field.
No cluster changes required.
Quick Start
Run locally
git clone https://github.com/jodonnel/ohc-sap-demo cd ohc-sap-demo/north pip install flask python app.py
| URL | What |
|---|---|
| localhost:8080/play | Mobile edge device simulation game |
| localhost:8080/stage | SOC operations dashboard (live SSE) |
| localhost:8080/present | SAP seller presentation |
| localhost:8080/present-rh | Red Hat seller presentation |
| localhost:8080/present-index | Presentation selector + kiosk mode |
Send a test event
curl -X POST http://localhost:8080/ingest \
-H 'Content-Type: application/json' \
-d '{
"specversion": "1.0",
"type": "ohc.demo.access.onguard.badge_scan",
"source": "test/cli",
"id": "test-001",
"eventclass": "access",
"data": { "cardholderName": "Test User", "action": "ACCESS_GRANTED" }
}'
Deploy to OpenShift
oc kustomize deploy/overlays/qa/ | oc apply -f -
API Reference
| Method | Path | Description | Layer |
|---|---|---|---|
| POST | /ingest | Accept a CloudEvent (JSON body) | Middle |
| GET | /events | Server-Sent Events stream (real-time) | Middle |
| GET | /state | Current state JSON (counts, telemetry) | Middle |
| GET | /telemetry | Aggregated device telemetry | Middle |
| GET | /log | Event history (last 200) | Middle |
| GET | /about | System metadata JSON (version, uptime, pod) | Middle |
| GET | /healthz | Liveness probe | Middle |
| GET | /readyz | Readiness probe | Middle |
| POST | /reset | Reset all state | Middle |
| GET | /go/<alias> | Short URL redirects (play, dtw, stage…) | Middle |
Stack
| Component | Technology | Why |
|---|---|---|
| Container platform | Red Hat OpenShift (RHDP on AWS) | The product being demonstrated |
| Event integration | SAP Edge Integration Cell → BTP | The integration target |
| Middle layer | Python / Flask | Zero-dependency, replaceable plumbing |
| Frontend | Vanilla HTML/CSS/JS | No build step, ConfigMap-mountable |
| Real-time push | Server-Sent Events | Works through OpenShift Routes, no WebSocket upgrade needed |
| Event format | CloudEvents v1.0 | Open standard; works with BTP, Kafka, Event Mesh |
| State | JSON flush to PVC (1Gi) | Survives pod restarts, zero new dependencies |
| GitOps | Kustomize | Base + overlay pattern for qa/prod |
| Vehicle adapter | Mercedes Connected Vehicle API (OAuth2) | Real edge device for demo differentiation |