Terrapod is a free, open-source, self-hosted platform replacement for Terraform Enterprise. This patch makes Google Cloud Storage work — in both directions, for the first time — and corrects what the API tells a client about a failed apply.
Bug Fixes
- Uploads to Google Cloud Storage never worked.
put_streampassed anum_retrieskeyword thatgoogle-cloud-storage3.x removed, and its reader refusedtell(), which the resumable upload needs for each chunk's byte range — so every streamed write to a GCS bucket failed: configuration versions, run artifacts, state versions, the binary and provider caches, registry modules and backups. The chart has pinned^3.9.0since the project's first commit, so if you configuredstorage.backend: gcs, this is the release that makes it work. - And downloads leaked until the API stopped working.
get_streamleft its reader thread parked forever whenever a consumer stopped early, holding a thread, a ~40 MiB read buffer, an open connection and — the part that mattered — anasyncio.to_threadworker from the process-wide default executor. Once enough downloads had been cancelled, every other threaded storage operation starved, including the uploads the first fix had just repaired. A cancelled download is routine: atofuclient interrupting a configuration fetch, or any browser abandoning one, was enough. Both fixes came from an outside contributor, @MyLittleChicken. - A hanging Redis cannot stall a run's artifact upload. The run-notification publishes are best-effort and were unbounded, so a partitioned Redis blocked the upload — including the state upload, where a stall can collide with the shutdown grace window — instead of simply skipping the notification.
- A broken engine binary no longer kills a run during init. The
-var-filecapability probe caught only "file not found", so a binary that exists but cannot be executed — a wrong-architecture download from the binary cache — or a runner at its fork limit raised an unhandled traceback where the init phase's whole purpose is to report a clean failure. The warning it emits also no longer blames the engine's version for a cause it cannot attribute, which was sending operators to upgrade an engine that was fine. - A one-to-one agent-pool change on
terrapod_workspaceneither warns about "several pools" nor fails the apply with an inconsistentagent_pool_name. - The run Overview's Changes and Cost cards populate without a reload. Three artifact uploads write columns the page renders and changed no run status, so nothing told the browser; the cost one lands roughly fourteen seconds after the plan finishes.
Changed behaviour
-
A failed apply now reports
errored, notunreachable. Every failed apply previously reportedunreachable— "the apply never ran" — on theapply.statusfield of a run's nestedappliesresource.tofuandterraformare unaffected: neither reads that sub-resource. If you have third-partygo-tfeautomation that branches onunreachableto mean "safe to re-run without inspecting state", re-read it — that value is now reserved for applies that genuinely were not dispatched.One honest limit:
erroredmeans "dispatched and did not succeed", which is not quite "the engine ran". A run whose Job never produced a running pod — an image that could not be pulled, a cluster with no room — also reportserroreddespite having mutated nothing. Distinguishing those needs a signal the API does not store, so automation treatingerroredas "state may be partially applied" is over-cautious there rather than wrong. The full vocabulary is now in api-reference.md. -
terrapod_workspaceplans may showagent_pool_nameandvcs_connection_nameas(known after apply)when the corresponding id changes. They are derived from the server, and showing the previous name would be promising a value that is about to be wrong — which Terraform would then refuse at apply.
Documentation
- api-reference.md documents the apply-status vocabulary, which had no entry at all.
Status
Stable — a patch release on the 1.9 line, which per SECURITY.md receives security and obvious bug fixes. No schema changes, no API route or attribute changes, and no migrations.
Full Changelog: v1.9.3...v1.9.4