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.
- Cloud-identity discovery reads the workspace's variable files. Discovery ran
tofu graphwith none of the workspace'svar_files, so a configuration whose moduleversionorcountcomes from a variable failed before the plan ever started. The flag is passed where the engine advertises it ongraph. - A broken engine binary no longer kills the run. The capability probes 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 out of a code path documented as never raising, failing runs that configure no cloud identity at all. The init-phase warning also no longer blames the engine's version for a failure it cannot attribute.
- A failed discovery names what the engine could not resolve, with the engine's own
Error:summary and detail rather than a truncated fragment, and two identical diagnostics no longer swap their details. - 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
- Use an absolute path for
var_fileson a Terragrunt workspace. Measured for this release: Terragrunt runs the engine inside its own.terragrunt-cachecopy of the unit, so a relative-var-fileis resolved there rather than beside yourterragrunt.hcl— which fails the plan, not merely discovery. cloud-identity.md now says so, and no longer claims the graph answers for any configuration whose plan would refuse. - api-reference.md documents the apply-status vocabulary, which had no entry at all.
Status
Stable — a patch release on the 1.10 line. No schema changes, no API route or attribute changes, and no migrations.
Full Changelog: v1.10.3...v1.10.4