Event Domain
The Event domain is an optional feature that must be explicitly enabled by a platform administrator through an EventConfig resource.
The Event domain handles event publishing and subscribing within the Control Plane. It serves as the business-logic layer between the Rover domain (user configuration) and the PubSub domain (runtime configuration). Its core responsibilities include managing event types, handling approval for event subscriptions, and orchestrating cross-zone event meshing.
Custom Resources
EventConfig
EventConfig is the Schema for the eventconfigs API. It provides configuration for the event operator, including the configuration backend connection and OAuth2 authentication settings.
Group: event.cp.ei.telekom.de · Version: v1 · Scope: Namespaced
EventConfigSpec
Appears in: EventConfig
EventConfigSpec defines the desired state of EventConfig. Exactly one of Local or Proxy must be set: Local for a zone running its own event backend (Horizon), Proxy for a zone that forwards all traffic to a target zone.
| Field | Type | Default | Validation |
|---|---|---|---|
local | Local | — | Optional |
mesh | Mesh | — | Optional |
proxy | Proxy | — | Optional |
zone | Realm | — | Required |
Local
Appears in: EventConfigSpec
Local configures a zone that runs its own event backend (Horizon). Mutually exclusive with Proxy.
| Field | Type | Default | Validation |
|---|---|---|---|
admin | Admin | — | Required |
publishEventUrl | string | — | Required, Format: uri, minLength: 1 |
serverSendEventUrl | string | — | Required, Format: uri, minLength: 1 |
voyagerApiUrl | string | — | Optional, Format: uri |
Admin
Appears in: Local
Admin configures the connection to the configuration backend.
| Field | Type | Default | Validation |
|---|---|---|---|
client | Client | — | Optional |
url | string | — | Required, Format: uri, minLength: 1 |
Client
Client configures the identity client used for admin access to the configuration backend. If omitted, defaults are applied: clientId and clientSecret are auto-generated, and the realm is resolved from the Zone's internal identity realm.
| Field | Type | Default | Validation |
|---|---|---|---|
clientId | string | — | Optional |
clientSecret | string | — | Optional |
realm | Realm | — | Optional |
Realm
Appears in: Client, Proxy, EventConfigSpec, EventConfigStatus, EventExposureSpec, EventExposureStatus, EventSubscriptionSpec, EventSubscriptionStatus
Realm references the identity Realm CR used for OAuth2 authentication If empty, it is assumed that the default realm should be used.
| Field | Type | Default | Validation |
|---|---|---|---|
name | string | — | Required |
namespace | string | — | Required |
uid | string | — | Optional |
Mesh
Appears in: EventConfigSpec
Mesh configures the mesh topology for event distribution. If omitted, defaults to full mesh with the realm resolved from the Zone's default identity realm.
| Field | Type | Default | Validation |
|---|---|---|---|
client | Client | — | Optional |
fullMesh | boolean | true | Required |
zoneNames | string[] | — | Optional |
Proxy
Appears in: EventConfigSpec
Proxy configures a zone that runs no local event backend and forwards all traffic to a target zone. Mutually exclusive with Local.
| Field | Type | Default | Validation |
|---|---|---|---|
targetZone | Realm | — | Required |
EventConfigStatus
Appears in: EventConfig
EventConfigStatus defines the observed state of EventConfig.
| Field | Type | Default | Validation |
|---|---|---|---|
adminClient | AdminClient | — | Optional |
callbackRoute | Realm | — | Optional |
callbackUrl | string | — | Optional |
conditions | Condition[] | — | Optional |
eventStore | Realm | — | Optional |
meshClient | AdminClient | — | Optional |
proxyCallbackRoutes | Realm[] | — | Optional |
proxyCallbackUrls | map<string, string> | — | Optional |
proxyVoyagerRoutes | Realm[] | — | Optional |
proxyVoyagerUrls | map<string, string> | — | Optional |
publishRoute | Realm | — | Optional |
publishUrl | string | — | Optional |
voyagerRoute | Realm | — | Optional |
voyagerUrl | string | — | Optional |
AdminClient
Appears in: EventConfigStatus
AdminClient references the identity Client CR created for admin access to the configuration backend.
| Field | Type | Default | Validation |
|---|---|---|---|
name | string | — | Required |
namespace | string | — | Required |
observedGeneration | integer | — | Required, Format: int64 |
uid | string | — | Optional |
Condition
Appears in: EventConfigStatus, EventExposureStatus, EventSubscriptionStatus, EventTypeStatus
| Field | Type | Default | Validation |
|---|---|---|---|
lastTransitionTime | string | — | Required, Format: date-time |
message | string | — | Required, maxLength: 32768 |
observedGeneration | integer | — | Optional, Format: int64, minimum: 0 |
reason | string | — | Required, minLength: 1, maxLength: 1024, pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ |
status | string | — | Required, Enum: True \| False \| Unknown |
type | string | — | Required, maxLength: 316, pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ |
EventExposure
EventExposure is the Schema for the eventexposures API. It represents a declaration that an application publishes events of a specific type, making them available for subscription by other applications.
Group: event.cp.ei.telekom.de · Version: v1 · Scope: Namespaced
EventExposureSpec
Appears in: EventExposure
EventExposureSpec defines the desired state of EventExposure.
| Field | Type | Default | Validation |
|---|---|---|---|
additionalPublisherIds | string[] | — | Optional |
approval | Approval | — | Required |
eventType | string | — | Required, minLength: 1 |
provider | Provider | — | Required |
scopes | Scopes[] | — | Optional |
visibility | string | Enterprise | Required, Enum: World \| Zone \| Enterprise |
zone | Realm | — | Required |
Approval
Appears in: EventExposureSpec
Approval configures how subscriptions to this event are approved.
| Field | Type | Default | Validation |
|---|---|---|---|
strategy | string | Auto | Required, Enum: Auto \| Simple \| FourEyes |
trustedTeams | string[] | — | Optional, minItems: 0, maxItems: 10 |
Provider
Appears in: EventExposureSpec, EventSubscriptionSpec
Provider identifies the providing application.
| Field | Type | Default | Validation |
|---|---|---|---|
apiVersion | string | — | Optional |
kind | string | — | Optional |
name | string | — | Required |
namespace | string | — | Required |
uid | string | — | Optional |
Scopes
Appears in: EventExposureSpec
Scopes defines named scopes with optional publisher-side trigger filtering.
| Field | Type | Default | Validation |
|---|---|---|---|
name | string | — | Required, minLength: 1 |
trigger | Trigger | — | Required |
Trigger
Appears in: Scopes, EventSubscriptionSpec
Trigger defines publisher-side filtering criteria for this scope. Every scope must define a trigger.
| Field | Type | Default | Validation |
|---|---|---|---|
responseFilter | ResponseFilter | — | Optional |
selectionFilter | SelectionFilter | — | Optional |
ResponseFilter
Appears in: Trigger
ResponseFilter controls payload shaping (which fields to return).
| Field | Type | Default | Validation |
|---|---|---|---|
mode | string | Include | Optional, Enum: Include \| Exclude |
paths | string[] | — | Optional |
SelectionFilter
Appears in: Trigger
SelectionFilter controls event matching (which events to deliver).
| Field | Type | Default | Validation |
|---|---|---|---|
attributes | map<string, string> | — | Optional |
expression | object | — | Optional |
EventExposureStatus
Appears in: EventExposure
EventExposureStatus defines the observed state of EventExposure.
| Field | Type | Default | Validation |
|---|---|---|---|
active | boolean | — | Required |
callbackURL | string | — | Optional |
conditions | Condition[] | — | Optional |
proxyRoutes | Realm[] | — | Optional |
publishURL | string | — | Optional |
publisher | Realm | — | Optional |
route | Realm | — | Optional |
sseUrls | map<string, string> | — | Optional |
EventSubscription
EventSubscription is the Schema for the eventsubscriptions API. It represents a declaration that an application subscribes to events of a specific type, configuring delivery, filtering, and scope selection.
Group: event.cp.ei.telekom.de · Version: v1 · Scope: Namespaced
EventSubscriptionSpec
Appears in: EventSubscription
EventSubscriptionSpec defines the desired state of EventSubscription.
| Field | Type | Default | Validation |
|---|---|---|---|
delivery | Delivery | — | Required |
eventType | string | — | Required, minLength: 1 |
requestor | Provider | — | Required |
scopes | string[] | — | Optional |
trigger | Trigger | — | Optional |
zone | Realm | — | Required |
Delivery
Appears in: EventSubscriptionSpec
Delivery configures how events are delivered to the subscriber.
| Field | Type | Default | Validation |
|---|---|---|---|
callback | string | — | Optional, Format: uri |
circuitBreakerOptOut | boolean | — | Optional |
enforceGetHttpRequestMethodForHealthCheck | boolean | — | Optional |
eventRetentionTime | string | — | Optional |
payload | string | Data | Required, Enum: Data \| DataRef |
redeliveriesPerSecond | integer | — | Optional |
retryableStatusCodes | integer[] | — | Optional |
type | string | Callback | Required, Enum: Callback \| ServerSentEvent |
EventSubscriptionStatus
Appears in: EventSubscription
EventSubscriptionStatus defines the observed state of EventSubscription.
| Field | Type | Default | Validation |
|---|---|---|---|
approval | Realm | — | Optional |
approvalRequest | Realm | — | Optional |
conditions | Condition[] | — | Optional |
subscriber | Realm | — | Optional |
subscriptionID | string | — | Optional |
url | string | — | Optional, Format: uri |
EventType
EventType is the Schema for the eventtypes API. It represents a singleton registry entry for a known event type, serving as the canonical reference that both EventExposure and EventSubscription point to.
Group: event.cp.ei.telekom.de · Version: v1 · Scope: Namespaced
EventTypeSpec
Appears in: EventType
EventTypeSpec defines the desired state of EventType.
| Field | Type | Default | Validation |
|---|---|---|---|
category | string | other | Optional, pattern: ^[a-z]+$ |
description | string | — | Optional |
specification | string | — | Optional |
type | string | — | Required, minLength: 1, maxLength: 253, pattern: ^[a-z0-9]+(\.[a-z0-9]+)*$ |
version | string | — | Required, pattern: ^\d+.*$ |
EventTypeStatus
Appears in: EventType
EventTypeStatus defines the observed state of EventType.
| Field | Type | Default | Validation |
|---|---|---|---|
active | boolean | — | Required |
conditions | Condition[] | — | Optional |
Cross-Zone Meshing
When event publishers and subscribers are in different zones, the Event domain automatically creates proxy routes to deliver events across zone boundaries. This enables:
- Events published in one cloud environment to be consumed in another
- SSE streams to be proxied across zones
- Callback deliveries to reach subscribers in remote zones
The mesh topology is configured through the EventConfig resource. With fullMesh: true, every zone can communicate with every other zone. Alternatively, you can list specific zone names for selective meshing.
Event Routes
Events flow between three parties: the services that send them, the services that receive them, and the event backend (Horizon) that stores and distributes them. To carry that traffic, the Event domain wires up gateway routes. A route is simply an address on the gateway that accepts traffic and forwards it to the right place, so no participant ever needs to know where the backend actually lives.
There are four kinds of route. Three of them handle the everyday flow of events and are created once per zone, the moment the event feature is switched on in that zone. The fourth carries live streams and is created once per event type, when a provider exposes an event.
| Route | Created | Called by | What it does |
|---|---|---|---|
| Publish | Per zone | Event publishers | Accepts events that a service wants to send into the platform. |
| Callback | Per zone | The event backend (Horizon) | Delivers events to subscribers that asked to be called back at their own address. |
| Voyager | Per zone | Subscribers | Lets a subscriber ask for past events to be re-sent (redelivery). |
| SSE | Per event type | Subscribers | Streams events live to subscribers that asked for a continuous server-sent events connection. |
Local routes and proxy routes
Every route comes in two flavours, and which one is used depends only on whether the two parties share a zone:
- Local route — when the sender and receiver are in the same zone, a single local route connects them directly.
- Proxy route — when they are in different zones, the platform adds a proxy route in the caller's own zone that quietly forwards the traffic across the zone boundary.
The proxy route is what makes proxy zones work: a zone that runs no backend of its own still exposes a full set of local addresses, and every one of them forwards to the target zone behind the scenes. Either way, each participant only ever talks to a gateway in its own zone, and the cross-zone hop stays invisible.
The external addresses that result from all of this are published on the EventConfig status — for example publishUrl, callbackUrl, and voyagerUrl for the local routes, and the proxyCallbackUrls / proxyVoyagerUrls maps (keyed by zone name) for the cross-zone proxy routes.
Publish Route
The publish route is the front door for sending events. A publishing service simply posts its events to this address and is done — it never needs to know where the event backend actually lives.
When the publisher sits in the same zone as the event backend, the local publish route hands the events straight to the backend. When the publisher sits in a proxy zone that runs no backend of its own, the publish route there forwards the events to the target zone, whose own publish route then delivers them to the backend. Either way, the publisher uses the exact same kind of address.
Callback Route
Some subscribers prefer to be called back: instead of fetching events, they give the platform an address of their own and let each event be pushed there. The callback route makes this happen. The event backend sends every event to the callback route, which reads the subscriber's real address (carried along with the request) and forwards the event to it.
When subscriber and backend share a zone, the local callback route forwards straight to the subscriber's address. When they are in different zones, the backend's zone forwards the event through a callback proxy route to the subscriber's zone, whose callback route then makes the final hand-off to the subscriber's address.
Voyager Route
The Voyager route lets a subscriber ask for events to be re-sent — for example, to catch up on anything missed. The subscriber calls the Voyager route, which reaches the Voyager backend that replays the events.
In the same zone, the subscriber's request goes straight to the Voyager backend. Across zones, the subscriber calls the Voyager route in its own zone, which forwards the request to the provider zone where the backend lives. A subscriber sitting in a proxy zone always uses a simple local address; the forwarding to the target zone happens behind the scenes.
SSE Route
Subscribers that want a live feed open a server-sent events (SSE) connection and receive events as they happen. Unlike the other three routes, an SSE route is created for each event type, because each stream carries one specific kind of event.
When the subscriber and the event backend share a zone, the SSE route connects the subscriber's stream directly to the backend. When they are in different zones, the subscriber opens the stream against its own zone, which forwards the connection to the provider zone where the events originate.
Domain Interactions
The Event domain has the broadest cross-domain interaction surface in the platform:
- Rover domain — Rover files create EventExposure and EventSubscription resources.
- PubSub domain — The Event domain creates EventStore, Publisher, and Subscriber resources.
- Gateway domain — Creates routes for publishing, SSE delivery, and cross-zone proxy communication.
- Identity domain — Creates clients for OAuth2 token exchange between zones.
- Application domain — Reads Application resources for publisher and subscriber metadata.
- Approval domain — Creates Approval and ApprovalRequest resources for event subscriptions.
- Admin domain — Watches Zone resources for configuration changes.