mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix(coderd/templatebuilder): fix archive bundling for nested static files and counted agents (#26901)
Fixes two template builder bugs that caused AWS EC2 (Linux) template imports to fail: 1. **Missing directory entries in tar archive**: `BundleTar` wrote static files with nested paths (e.g. `cloud-init/cloud-config.yaml.tftpl`) without emitting `TypeDir` entries for parent directories. The provisioner's archive extractor requires explicit directory entries and failed with "no such file or directory". 2. **Incorrect agent reference for counted resources**: `ExtractAgentResourceName` returned `dev` for the AWS Linux base template, but the agent uses `count = data.coder_workspace.me.start_count`, so module templates need `coder_agent.dev[0].id`. The function now detects `count`/`for_each` and appends `[0]`. > [!NOTE] > Generated by Coder Agents (on behalf of @jeremyruppel)
This commit is contained in:
@@ -102,18 +102,31 @@ func renderTemplate(fsys fs.FS, templatePath string, data any) ([]byte, error) {
|
||||
// agentResourcePattern matches `resource "coder_agent" "<name>"` in HCL.
|
||||
var agentResourcePattern = regexp.MustCompile(`resource\s+"coder_agent"\s+"(\w+)"`)
|
||||
|
||||
// agentCountPattern detects whether a coder_agent block uses count or
|
||||
// for_each, which means references to it require an index (e.g. [0]).
|
||||
var agentCountPattern = regexp.MustCompile(
|
||||
`resource\s+"coder_agent"\s+"\w+"\s*\{[^}]*\b(?:count|for_each)\s*=`,
|
||||
)
|
||||
|
||||
// ExtractAgentResourceName finds the coder_agent resource declaration in
|
||||
// rendered HCL and returns its name. Returns an error unless exactly
|
||||
// one coder_agent resource is found; the builder only supports
|
||||
// single-agent templates. The input is expected to be rendered output
|
||||
// from our own curated base templates, not arbitrary user HCL.
|
||||
// rendered HCL and returns the reference form to use in module templates.
|
||||
// When the agent uses count or for_each, the returned name includes an
|
||||
// index suffix (e.g. "dev[0]") so that module templates can reference it
|
||||
// as coder_agent.<name>.id. Returns an error unless exactly one
|
||||
// coder_agent resource is found; the builder only supports single-agent
|
||||
// templates. The input is expected to be rendered output from our own
|
||||
// curated base templates, not arbitrary user HCL.
|
||||
func ExtractAgentResourceName(hcl []byte) (string, error) {
|
||||
matches := agentResourcePattern.FindAllSubmatch(hcl, -1)
|
||||
switch len(matches) {
|
||||
case 0:
|
||||
return "", xerrors.New("no coder_agent resource found in rendered template")
|
||||
case 1:
|
||||
return string(matches[0][1]), nil
|
||||
name := string(matches[0][1])
|
||||
if agentCountPattern.Match(hcl) {
|
||||
name += "[0]"
|
||||
}
|
||||
return name, nil
|
||||
default:
|
||||
names := make([]string, 0, len(matches))
|
||||
for _, m := range matches {
|
||||
|
||||
Reference in New Issue
Block a user