Skip to content

feat: add support for Temporal Server v1.29, v1.30 and v1.31#987

Open
Azerothian wants to merge 1 commit into
alexandrevilain:mainfrom
CrunchyMonkies:feat/temporal-1.31
Open

feat: add support for Temporal Server v1.29, v1.30 and v1.31#987
Azerothian wants to merge 1 commit into
alexandrevilain:mainfrom
CrunchyMonkies:feat/temporal-1.31

Conversation

@Azerothian

Copy link
Copy Markdown

This PR adds operator support for Temporal Server v1.29, v1.30 and v1.31. It was developed as a chained series (each version on top of the previous) and is presented here as a single PR spanning three minors — happy to split it into per-version PRs (1.29 → 1.30 → 1.31) if you'd prefer.

All >= 1.30 behaviour is version-gated (version.V1_30_0 / V1_31_0); clusters < 1.30 keep the previous dockerize/curl paths unchanged, so the operator stays backward compatible across >= 1.14.0 < 1.32.0.

v1.29

Version range/default bumps only. v1.29 is a dynamic-config-only release (task-queue fairness & task-queue config API), already covered by the cluster dynamicConfig field.

v1.30

Handles the breaking image changes:

  • dockerize/auto-setup were removed from temporalio/server and config templating moved into the server binary. For >= 1.30 the operator emits the # enable-template header + sprig {{ env "X" }} placeholders, sets TEMPORAL_SERVER_CONFIG_FILE_PATH, and selects the service via TEMPORAL_SERVICES (legacy SERVICES kept for compatibility).
  • curl/jq were removed from temporalio/admin-tools, which broke ES visibility setup. The operator now drives ES visibility via the temporal-elasticsearch-tool shipped in the image (setup-schema/create-index/update-schema); its embedded template applies all built-in search attributes automatically. The MTLS sidecar-shutdown step uses wget instead of curl.
  • v1.30.0 (no upstream GitHub release) is rejected as a broken release.

v1.31

New sql.passwordCommand datastore field (external command / cloud IAM auth token), wired into both the server config and the schema-setup jobs, webhook-validated and mutually exclusive with passwordSecretRef.

Build / deps

  • go directive → 1.26.4 (Dockerfile builder image bumped to match).
  • go.temporal.io/server v1.31.1, go.temporal.io/api v1.62.8, go.temporal.io/sdk v1.41.1, and associated Kubernetes dependency bumps.

Testing

  • make test (unit + envtest) green, including new unit tests that load the generated 1.30 config through the real go.temporal.io/server config loader and cover the passwordCommand and ES-tool script rendering.
  • Validated end-to-end on a real RKE2 cluster (k8s v1.35): 1.29.7, 1.30.5 and 1.31.1 clusters each reach Ready=True with a working namespace-create + workflow round-trip; the 1.30 sprig/entrypoint contract, passwordCommand auth (incl. webhook rejection paths), and the temporal-elasticsearch-tool ES visibility setup (index + v10–v13 built-in search attributes) were each exercised against real images.

Notes for reviewers

The go 1.26.4 toolchain requirement and dependency bumps are the widest-reaching parts; the ES visibility rewrite changes how ES-backed clusters bootstrap on >= 1.30.

Adds operator support for Temporal Server v1.29, v1.30 and v1.31, extending the
supported version range to `>= 1.14.0 < 1.32.0` (default version 1.31.1, default
UI 2.49.1). All >= 1.30 behaviour is version-gated (version.V1_30_0 / V1_31_0);
clusters < 1.30 keep the previous dockerize/curl paths unchanged, so the operator
stays backward compatible across the whole supported range.

v1.29
- Version range/default bumps only. v1.29 is a dynamic-config-only release
  (task-queue fairness, task-queue config API), already covered by the cluster
  dynamicConfig field.

v1.30
- dockerize/auto-setup were removed from the temporalio/server image and config
  templating moved into the server binary (embedded sprig engine). For clusters
  >= 1.30 the operator now emits config templates with the `# enable-template`
  header and sprig `{{ env "X" }}` placeholders (instead of dockerize
  `{{ .Env.X }}`), sets TEMPORAL_SERVER_CONFIG_FILE_PATH, and selects the service
  via the new TEMPORAL_SERVICES env var (legacy SERVICES kept for compatibility).
- curl and jq were removed from the temporalio/admin-tools image, which broke the
  operator's Elasticsearch visibility setup scripts. For clusters >= 1.30 the
  operator now drives ES visibility through the temporal-elasticsearch-tool
  shipped in the image (setup-schema, create-index, update-schema), analogous to
  temporal-sql-tool. Its embedded index template applies all built-in search
  attributes automatically. The MTLS sidecar-shutdown step uses wget instead of
  curl on >= 1.30.
- v1.30.0 has no published GitHub release upstream (silently skipped) and is now
  rejected as a broken release; use v1.30.1+.

v1.31
- New sql.passwordCommand datastore field: resolves the datastore password by
  running an external command (e.g. to generate a short-lived cloud IAM auth
  token for AWS RDS / GCP Cloud SQL). Wired into both the rendered server config
  and the persistence schema-setup jobs (temporal-sql-tool via a shell command
  substitution). Mutually exclusive with passwordSecretRef and validated by the
  webhook (rejected on clusters < 1.31 and when combined with a password secret).

Build / dependencies
- go directive bumped to 1.26.4 with the Dockerfile builder image updated to
  match.
- go.temporal.io/server v1.31.1, go.temporal.io/api v1.62.8,
  go.temporal.io/sdk v1.41.1, plus the associated Kubernetes dependency bumps.

Testing
- make test (unit + envtest) is green, including new unit tests that load the
  generated 1.30 config through the real go.temporal.io/server config loader and
  cover the passwordCommand and ES-tool script rendering.
- Validated end-to-end on a real RKE2 cluster (k8s v1.35): 1.29.7, 1.30.5 and
  1.31.1 clusters each reach Ready=True with a working namespace-create +
  workflow round-trip; the 1.30 sprig/entrypoint contract, passwordCommand auth
  (including webhook rejection paths) and the temporal-elasticsearch-tool ES
  visibility setup (index + v10-v13 built-in search attributes) were exercised
  against real images.
@Azerothian
Azerothian marked this pull request as ready for review July 9, 2026 13:02
uses: actions/checkout@v6

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
platforms: arm64

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v3

- name: Login to GitHub Container Registry
uses: docker/login-action@v3

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
type=ref,event=tag

- name: Build and push operator docker image
uses: docker/build-push-action@v5
check-latest: true

- name: Install Helm
uses: azure/setup-helm@v4

- name: Login to GitHub Container Registry
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | \
@Azerothian
Azerothian force-pushed the feat/temporal-1.31 branch from 532f731 to 4fb3cb7 Compare July 17, 2026 07:23
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants