# k8s/temporal/temporal-values.yaml
# Temporal — workflow engine for story-crater backend async task orchestration.
# Chart: temporal/temporal from https://go.temporal.io/helm-charts
#
# Uses Cassandra for default store (workflow history/events)
# Uses Elasticsearch for visibility store (namespace/workflow queries)
# This is the chart's native, well-tested configuration.

# ── Datastores configuration ────
# Disable auto-deployed PostgreSQL (we use external ddb for other services)
postgresql:
  enabled: false

# Enable Elasticsearch for visibility store (deployed to worker node, 2Gi/4Gi memory)
elasticsearch:
  enabled: true
  scheme: http
  host: temporal-elasticsearch
  port: 9200
  version: v7
  logLevel: error
  auth:
    enabled: false
  indices:
    visibility: temporal_visibility_v1

# Cassandra enabled for template validation; server.config overrides with actual hosts
# Schema job template requires cassandra config to exist at top level
cassandra:
  enabled: true
  replicas: 3
  cluster:
    seedSize: 1
  port: 9042
  # Was landing 2 of 3 replicas on talos-cp-1 -- spread across nodes so a
  # single overloaded node can't stall gossip/join for the whole ring.
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchLabels:
                app: cassandra
                release: temporal
            topologyKey: kubernetes.io/hostname

# ── Disable schema auto-setup (will initialize manually) ─────────
jobs:
  autoSetup:
    enabled: false

# ── Temporal server config (Cassandra + Elasticsearch persistence) ──────────────────────────────
server:
  replicaCount: 1
  jobService:
    enabled: false
  # Spread frontend/history/matching/worker across nodes instead of letting
  # them stack on whichever node the scheduler prefers (was: 59 of ~80
  # cluster pods on talos-cp-1 alone). History's ringpop gossip join was
  # timing out because 3 of its 4 peers sat on that overloaded node.
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchLabels:
                app.kubernetes.io/instance: temporal
            topologyKey: kubernetes.io/hostname
  config:
    logLevel: "info"
    persistence:
      defaultStore: default
      visibilityStore: visibility
      numHistoryShards: 512
      datastores:
        default:
          # Cassandra for workflow history and events
          driver: cassandra
          cassandra:
            hosts: "temporal-cassandra"
            port: 9042
            keyspace: temporal
            user: user
            password: ""  # Cassandra auth disabled in deployment
            replicationFactor: 3
            consistency:
              default:
                consistency: local_quorum
                serialConsistency: local_serial
  service:
    type: ClusterIP

# ── Temporal Web UI ────────────────────────────────────────────────────────
web:
  replicaCount: 1
  service:
    type: ClusterIP

# ── Ingress ────────────────────────────────────────────────────────
# Note: ingress is disabled here. Instead, we route via oauth2-proxy.
# The ingress is applied separately as k8s/temporal/temporal-ingress-oauth2.yaml
# which terminates TLS and routes to oauth2-proxy service.
ingress:
  enabled: false

# ── Monitoring ────────────────────────────────────────────────────────
prometheus:
  enabled: false
