Gateway module

The Gateway module in Vertex

The gateway is the entry point for all external REST requests to Vertex.

Partner transport TLS

A dedicated partner Gateway can terminate TLS before applying its HTTP routing and rate limits. Configure one optional GatewayModuleConfig.TransportEndpoint per instance. Route the partner’s hostname through cluster ingress with TLS passthrough, not HTTPS termination or re-encryption. The downstream module continues to receive HTTP on its interconnect port.

GatewayModuleConfig:
  Url: ''
  EnableModuleDiscovery: false
  EnableSwagger: false
  EnableGraphQL: false
  EnableUserSessions: false
  TransportEndpoint:
    Port: 8443
    CertificateBase64: '${TennetMessageClientCertificateBase64}'
    CertificatePassword: '${TennetMessageClientCertificatePassword}'

An empty Url leaves the dedicated Gateway without a plaintext HTTP listener. The shared user-facing Gateway can retain its existing Url and omit TransportEndpoint. The PFX must contain a private key, permit server authentication, and cover the public hostname. Certificates and pins are loaded at startup; restart the Gateway after changing them.

TransportEndpoint.ClientCertificateSha256Pins is an optional array of SHA-256 fingerprints of complete client certificates:

  • Omitted or empty: server-only TLS; no client certificate is requested.
  • Non-empty: a client certificate is required and must match a pin and pass normal certificate-chain, validity and revocation checks. Pins do not bypass CA trust.
  • Each entry is 64 hexadecimal characters; colon separators and spaces are accepted. Windows’ usual SHA-1 thumbprint is not accepted.
  • Include both current and next fingerprints during rotation. Full public leaf certificates are unnecessary for pinning; private issuing CAs must still be trusted by the Gateway pod.
  • Malformed pins or an invalid PFX abort startup rather than falling back to unauthenticated TLS.

Obtain a fingerprint with openssl x509 -in client.pem -noout -fingerprint -sha256. The pod needs access to the certificate issuer’s CRL/OCSP endpoints when mTLS is enabled.

Use one Gateway deployment per partner to enforce backend isolation with Kubernetes NetworkPolicy. NetworkPolicy identifies pods and destination ports, not HTTP routes or the source listener.

Optional Gateway capabilities

Each capability defaults to true for existing user-facing deployments. Disable them explicitly on a partner Gateway; TLS configuration is independent of these switches.

Setting Behavior when disabled
EnableModuleDiscovery Does not load or periodically refresh module gateway-routes.yaml files. Configured BackendConfigs and RedirectConfigs still apply.
EnableSwagger Does not expose Swagger UI or document endpoints.
EnableGraphQL Does not register or expose the GraphQL gateway.
EnableUserSessions Does not register cookie/OIDC login, Redis-backed user sessions, token exchange/refresh, or /gateway/action/* endpoints. Skips startup OIDC discovery and session-based token injection. Stateless JWT bearer authentication remains available.

Selecting an instance’s configuration section

By default, the Gateway binds GatewayModuleConfig. Set the deployment environment variable ConfigSections__GatewayModuleConfig=TennetGatewayModuleConfig to bind another section instead. Colon-delimited nested paths are also supported. ModuleId remains the instance identity and does not determine the selected section.

The legacy configuration loader binds only the selected section, after normal Config Server, vault, environment-variable and placeholder processing. It does not overlay that section onto GatewayModuleConfig; shared routes, user-session settings and credentials are not inherited. An explicitly selected missing or blank section fails startup instead of falling back. Class-level defaults still apply to properties omitted from the selected section.

Both sections can live beside each other in config.yaml, with their environment overrides in config-acc.yaml. Maintainers can organize files later using the existing Config Server layers. Disabling module discovery alone does not remove explicitly configured routes.

Request tracing and caller attribution

Trace context

Send a W3C traceparent header to link the handling of a request in Vertex to a trace in your own tooling. B3 and Jaeger trace headers are also accepted; when several are present, traceparent takes precedence. A missing or malformed trace header never causes a request to be rejected; Vertex then starts a new trace for that request.

Caller headers

Identify your application and job with the following optional headers. They allow traffic and issues to be traced back to a specific caller and run, without requiring any tracing tooling on your side.

Header Purpose Example
X-EE-Application Name of the calling application PyVertexImporter
X-EE-Job Short logical name of the job or script daily-import
X-EE-Run-Id Identifier shared by all calls made in one run 8f14e45f-ceea-467f-a8f5-3c3b6c0e5a01
  • Use stable application and job names, and generate a new run identifier for every execution.
  • These headers are diagnostic labels only: they do not authenticate the caller, grant permissions, or change rate limits.
  • Never put credentials, tokens, personal data, or request content in these headers.

Header value rules

  • Allowed characters are ASCII letters, digits, spaces, ., _, and -; other characters are removed.
  • Values are trimmed and truncated to 128 characters.
  • Empty values, repeated headers, comma-separated lists, and values longer than 1,024 characters are ignored.
  • An invalid caller header never causes the request itself to be rejected.